找到与线AB形成垂直线BC的点C.

时间:2018-01-12 20:02:12

标签: c# algorithm math geometry 2d

我有两个 2D AB定义的线段A,B

我要做的是找到一个C点,距离d远离B。 这两个约束条件是BC必须与AB垂直,而BC始终相对于90逆时针AB度。

到目前为止,我有以下

double d = .01;
Coordinate C = new Coordinate(A.Lat - B.Lat, A.Long - B.Long);

C.Long = C.Long * A.Long * Math.Cos(90);
C.Lat = C.Lat * A.Lat * Math.Cos(90);

C.Long = A.Long + C.Long * d;
C.Lat = A.Lat + C.Lat * d;

基本上我要问的是,我在哪里出错?这是c#代码吗?这是逻辑吗?使用这两个约束为C解决的步骤是什么?

enter image description here

2 个答案:

答案 0 :(得分:4)

标准化AB矢量并将其旋转90度:

ABY = B.Y - A.Y
ABX = B.X - A.X
Len = Sqrt(ABY*ABY + ABX*ABX)
C.X = B.X - d * ABY / Len 
C.Y = B.Y + d * ABX / Len 

请注意,对于地理坐标(纬度/经度)和大距离,结果并不准确。

Link以供进一步参考(部分Bearing然后Destination point given distance and bearing from start point

答案 1 :(得分:1)

MBo 对你的任务有正确的答案(当你转90度)我只是想告诉你如何修复你自己的代码(我推断你想这样做)这是可用的任何角度转弯(但因为它需要测角仪,所以速度较慢):

d = .01;
a = atan2(B.y - A.y,B.x - A.x) (+/-) 90.0; // sign depends on your coordinate system
C.x = B.x + d*cos(a)
C.y = B.y + d*sin(a)

因此,您应该获得a的方向角AB并将其移动90度。然后,您只需将d旋转的a添加到C,这可以通过参数圆方程来完成。

请注意所有角度都应该是您的测角函数所接受的单位(因此可以是度数或弧度),因为我没有编码 C#我没有线索,但在语言中我通常编码用弧度表示。在哪种情况下行:

a = atan2(B.y - A.y,B.x - A.x) (+/-) 90.0; // sign depends on your 

会改为:

a = atan2(B.y - A.y,B.x - A.x) (+/-) 90.0*Pi/180.0; // sign depends on your 

Pi=3.1415926535897932384626433832795