创建导航系统 (ArcTan2)

MrC*_*ear -2 navigation delphi math trigonometry

我目前正在使用航路点开发导航系统,我们可以定义以下边界,假设 B 点是我们要去的地方,A 点是您当前的位置:

  • 我们知道点 A 和 B 的位置 (X,Y)。
  • A 点(您)和 B 点(我们的目的地)各自的 X 和 Y 值均为正值。
  • 我们知道 A 点(您)面对的角度。(360 - 0 度)

我的问题是我将如何获得最小的转弯角度以面对 B 点(我们的目的地)?

我目前的方法是使用 ArcTan2(X,Y)

B := ArcTan2(Y1 - Y2,X1 - X2)

B := B * 180 / pi ---- 将弧度转换为度数。

这确实会返回一个合适的角度,但只是有时......其他时候它会返回一个角度,使我面向 B 点(我们的目的地)的相反方向。

我遇到的另一个问题是确定我应该向左转还是向右转 - 假设我们返回的角度为 80 度,那么这是否意味着我向左或向右旋转?

我希望我的解释有点清楚,三角学从来都不是我的强项。

对于你们可以提供给我的任何意见或来源,我将不胜感激。

谢谢清除先生

MBo*_*MBo 5

您使用了错误的 X/Y 参数顺序

B := ArcTan2(Y2 - Y1, X2 - X1)
Run Code Online (Sandbox Code Playgroud)

是从第一个点到第二个点获得方向的正确公式。

如果您确实需要旋转角度,则还必须提供当前方向(或前一点)

让你从 A 点移动到 B 点,在 B 点之后你需要转到 C 点。在这种情况下,你需要计算相对角度来改变方向(这种方法使用向量的叉积):

 CBX := C.X - B.X; 
 CBY := C.Y - B.Y; 
 BAX := B.X - A.X; 
 BAY := B.Y - A.Y;

RotationAngle := 
  RadToDeg(ArcTan2(CBX * BAY - CBY * BAX, CBX * BAX + CBY * BAY));
Run Code Online (Sandbox Code Playgroud)

请注意,函数返回带符号的角度,您可以轻松检查是否需要向左或向右转。此外RadToDeg功能有助于获得学位。