【问题标题】:How can I calculate the relative angle between two points like a compass?如何像指南针一样计算两点之间的相对角度?
【发布时间】:2015-01-12 03:46:50
【问题描述】:

我正在构建一个应用程序,它给出了一个位置的纬度和经度,以及我当前位置的纬度和经度,我想指向一个指向目的地的箭头。我可以在 0-360 度的值中获得点的角度。我也可以让我的指南针以度数为单位。使用这个公式:

deltaAngle = abs( floor( compassHeading - gpsAngle ) )

在大多数情况下,当指南针从 0 移动到 359 时,指针会跳跃大约 90 度。这是我接近 0 度时的输出:

angle:  317.86451281503 compass 358.80545043945 deltaAngle: 40  40.940937624423 
angle:  317.86451281503 compass 357.77563476562 deltaAngle: 39  39.911121950595
angle:  317.86451281503 compass 358.86737060547 deltaAngle: 41  41.002857790438
angle:  317.86451281503 compass 359.96002197266 deltaAngle: 42  42.095509157626
angle:  317.86451281503 compass 1.178640127182  deltaAngle: 317 -316.68587268785
angle:  317.86451281503 compass 2.3249001502991 deltaAngle: 316 -315.53961266473 

我怎样才能算出这个点附近的数学?我感觉会涉及到 % 180,然后如果我需要指向左或右,则添加或减去一些东西。

【问题讨论】:

    标签: math gps directions compass


    【解决方案1】:

    您实际上并不想在deltaAngle 的公式中使用abs。相反,你想要的是这个,或者类似的东西:

    deltaAngle = floor( compassHeading - gpsAngle )
    if (deltaAngle < 0) {
        deltaAngle += 360
    }
    

    在某些语言中,您可以省去if 语句,而使用类似这样的语句:(在 python 中可以使用,但在 C、java 或 javascript 中不适用)

    deltaAngle = floor( compassHeading - gpsAngle ) % 360
    

    不幸的是,当第一个数字为负数时,C 有一个愚蠢的 % 定义,并且 Java 和 Javascript(以及许多其他语言)都继承了 C 的定义,而不是 Python 和 Ruby 使用的更明智的定义。在从 C 中获得 % 定义的语言中,您可以这样做:

    deltaAngle = floor( compassHeading - gpsAngle + 360) % 360
    

    但在这一点上,我认为就风格而言,使用if 语句更容易。

    【讨论】:

    • 我必须将其更改为 deltaAngle = floor( gpsAngle - compassHeading) 才能使其工作,但它现在可以工作。非常感谢!
    【解决方案2】:

    请注意,360 - 317 = 43。您可以通过向左 43 度或向右 317 度到达航向。它们在数学上是等价的(如果你在物理上转弯,向右转需要更多的转弯)。

    听起来您想将角度标准化为“最短”角度。您可以通过注意 deltaAngle > 180.0 的时间来实现这一点。如果是,则通过替换 360.0 - deltaAngle 转换为较短的角度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多