在线等待求一算法(100分)

L

lwgygz

Unregistered / Unconfirmed
GUEST, unregistred user!
已知一条线段的起点和终点,请问如何以该线段的终点(或起点)为中点做一条已知长度
且与之垂直的线段(如何求其起点和终点的坐标)?我用的是这两条线段的斜率互余的算法,
但是只有在45度角的时候才垂直。我想可能是用了三角函数后,在MoveTo、LineTo方法中
不能使用浮点数,而转换成整型后又不精确的原因吧?不知有那位高手能指教
 
没什么大问题,最好四舍五入。
主要是画线的效果。
 
误差会有的 但不明显

如果看起来效果很差的话 可能是程序里的失误
 
另外:你的算法没问题

这应该是最好的办法了
 
就是看起来效果很差呀?代码如下:已知某线段起、终点坐标(Xa,Ya),(Xb,Yb)和固定长度
a则欲求线段两点坐标为(X1,Y1),(X2,Y2):
X1:=Round(Xb-a*Cos(Pi-Actan((Yb-Ya) div (Xb-Xa))));
Y1:=Round(Yb-a*Sin(Pi-Actan((Yb-Ya) div (Xb-Xa))));
X2:=Round(Xb+a*Cos(Pi-Actan((Yb-Ya) div (Xb-Xa))));
X1:=Round(Yb+a*Sin(Pi-Actan((Yb-Ya) div (Xb-Xa))));
 
我用下面的程序试了一下,效果都很好啊.

uses
Math;

procedure OrthLine(const Pt1, Pt2: TPoint; const Len: Integer;
var Pt3, Pt4: TPoint);
var
s, c, Theta, mx, my: Extended;
begin
Theta := ArcTan2(Pt2.Y - Pt1.Y, Pt2.X - Pt1.X);
SinCos(Theta, s, c);
s := s * Len * 0.5;
c := c * Len * 0.5;
mx := (Pt1.X + Pt2.X) * 0.5;
my := (Pt1.Y + Pt2.Y) * 0.5;
Pt3 := Point(Round(mx + s), Round(my - c));
Pt4 := Point(Round(mx - s), Round(my + c));
end;
 
多谢JohnsonGuo
 
顶部