我有两个 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
解决的步骤是什么?
答案 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
。