Delphi 创建导航系统(ArcTan2)

Delphi 创建导航系统(ArcTan2),delphi,math,navigation,trigonometry,Delphi,Math,Navigation,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点是我们要去的地方,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度的返回角,那么这是否意味着我应该向左或向右旋转

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

我非常感谢你们能提供给我的任何信息

谢谢
MrClear

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

B := ArcTan2(Y2 - Y1, X2 - X1)
是从第一点到第二点获得方向的正确公式

若你们真的需要旋转角度,你们还必须提供当前方向(或上一点)

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


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

如果有两个点
(xA,yA)
(xB,yB)
,点A作为起点,点B作为终点,则从起点到终点有一个向量:

v = (xB-xA)i + (yB-yA)j
在二维坐标系中,x轴向右,y轴向上,该矢量与水平轴形成易于计算的角度:

angle = atan2((yB-yA), (xB-xA))
在哪里

i = unit vector in x-direction

j = unit vector in y-direction
此角度以弧度表示。它从水平轴绕点A逆时针旋转


注意零长度向量。

这不是关于Delphi或编程的问题。这是一个关于数学的问题。也许我使用了不正确的标签,这是我在这里的第一篇帖子。然而,ArcTan2最初是专门为编程语言开发的,这意味着大多数用例都围绕着一种看起来合适的程序。道歉请-这是“天使”,不是“天使”。当你承认自己对三角学知之甚少时,你怎么能写出一个完全依赖三角学的系统呢?推荐向量和交叉乘积似乎是徒劳的。@duffymo这似乎很有戏剧性,你给这条线索增加的唯一价值就是纠正我的打字错误x_x,请原谅我认为这是一个学习的论坛?我可以做得更多,但我认为,当一个人声称正在编写一个大量使用trig的系统时,期望有一个基本的知识水平是合理的。这不是本网站的使命,也不是志愿者经常使用它来给你提供基础知识。我知道在Arctan2中,你首先要把y值放在第一位——但这不是所有计算器或图书馆的情况。。。我特别相信Delphi(我正在使用的程序语言),你先通过X。非常感谢您的回复。您可以在此处阅读有关Arctan2的Delphi帮助,以确保按Y/X顺序排列。您能详细说明上一点吗?我如何将其添加到等式中。@MrClear:每次在库或API中使用新类或函数时,都应该阅读该类或函数的文档。在这种情况下,Delphi函数的文档说明Y在X之前。在Delphi IDE中,如果您将光标放在
ArcTan2
标识符中并按F1键,您将自动进入此文档。@AndreasRejbrand感谢您结构清晰的回复,在用delphi编写之前,我一直使用:作为概念证明,所以尽管这可能是任何问题,但它不是最新的-感谢您指出它
i = unit vector in x-direction

j = unit vector in y-direction