我正在构建一个应用程序,该应用程序给出了一个位置的纬度和经度以及当前位置长的纬度,我想指向目的地的箭头。我可以获得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,然后添加或减去某些内容。
答案 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转换为较短的角度。