【问题标题】:Creating a navigation system (ArcTan2)创建导航系统 (ArcTan2)
【发布时间】:2020-01-20 12:20:45
【问题描述】:

我目前正在开发一个使用航路点的导航系统,我们可以定义以下周长,假设 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 度的返回角,这是否意味着我应该向左还是向右旋转?

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

如果你们能提供给我的任何意见或来源,我将不胜感激。

谢谢 清除先生

【问题讨论】:

  • 这不是关于 Delphi 或编程的问题。这是一个关于数学的问题。
  • 也许我确实使用了不正确的标签,这是我在这里的第一篇文章。然而,ArcTan2 最初是专门为编程语言开发的,这意味着大多数用例都围绕着一种程序,这似乎很合适。道歉
  • 拜托-这是“角度”,而不是“天使”。当你承认你对它知之甚少时,你怎么能写出一个完全依赖于三角学的系统呢?推荐向量和叉积似乎是徒劳的。
  • @duffymo 这似乎很戏剧化,您添加到此线程的唯一价值是纠正我的错字 x_x,请原谅我认为这是一个学习论坛?
  • 我可以做的远不止这些,但我认为当有人声称要编写一个大量使用三角函数的系统时,期望具有基本知识水平是合理的。这不是本网站的使命,也不是经常访问它的志愿者为您提供基本知识。

标签: delphi math navigation trigonometry


【解决方案1】:

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

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

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

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

让你从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));

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

【讨论】:

  • 我知道在 Arctan2 中,您将 y 值放在首位 - 但是并非所有计算器或库都如此...我特别相信 Delphi(我正在使用的程序语言)你先通过X。永远感谢您的回复。
  • 您可以在此处阅读有关 Arctan2 的 Delphi 帮助以确保 Y/X 顺序。
  • 您能否详细说明上一点?我将如何将其添加到方程式中。
  • @MrClear:每次在库或 API 中使用新类或函数时,都应该阅读类或函数的文档。在这种情况下,Delphi 的 ArcTan2 函数的文档说明 Y 在 X 之前。在 Delphi IDE 中,如果您将光标放在 ArcTan2 标识符上并按 F1,您将自动转到此文档。跨度>
  • @AndreasRejbrand 感谢您提供结构清晰的回复,我一直在使用:planetcalc.com/7954 作为概念证明,然后再用 delphi 编写所有内容,因此虽然这将是任何问题,但它不是最新的 - 谢谢指出来
【解决方案2】:

如果你有两个点(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点逆时针旋转。

注意零长度向量。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多