如何计算两个点之间的相对角度,如指南针?

时间:2015-01-12 03:46:50

标签: math gps directions compass

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

deltaAngle = abs( floor( compassHeading - gpsAngle ) )

在大多数情况下它起作用,当compassHeading从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,然后添加或减去某些内容。

2 个答案:

答案 0 :(得分:2)

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

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声明。

答案 1 :(得分:1)

请注意,360 - 317 = 43.您可以向左移动43度,向右移动317度。它们在数学上是等价的(如果你在物理上转向,那么右转就会转向更多)。

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