计算从 -180 度到 180 度的角之间的距离

Calculating distance between angles that cross -180 to 180

我正在计算我的鼠标指针角度与我的“车辆角度”之间的差异(以度为单位)。我将距离的一半作为我的偏移量存储,然后将我的车辆移动到它,经过几次计算,最终将我移动到我想要的角度。但是,当我的鼠标位于 -185 时,我将其稍微向上移动到 185,也就是仅 10 度的距离,车辆会沿 "long way around" 从 -185 行驶到 0,然后返回到 185。我尝试了很多方法让它能够通过-180到180的边界,但没有成功。

代码如下:

def get_angle(self, p1, p2):
    return m.atan2(p2[1]-p1[1],p2[0]-p1[0])

def update(self):
    mouse_pos = pygame.mouse.get_pos()
    self.update_vehicle(self.pos, self.get_angle(self.pos, mouse_pos), r.black)

def update_vehicle(self, pos, dir, color):
    self.dir += (dir - self.dir) / 50

其中 self.dir 是我的车辆实现的角度,dir 是传递给它的角度,从鼠标到它自己。

您可以将输出角度包装到 [-pi, pi) 区间内,然后再应用到汽车上:

def update_vehicle(self, pos, dir, color):
    a = ((dir - self.dir + m.pi) % (2 * m.pi)) - m.pi
    self.dir += a / 50

发生的事情是我们将 pi 添加到该值(以便我们瞄准 0 到 2pi 的正间隔),然后我们删除无用的完整回合(mod 2pi),最后回到我们最初的 -pi 到 pi 引用(删除我们之前插入的 pi)。

因此,-400º 变成了 -40º,-240º 变成了 120º,240º 变成了 -120º 等等……这里有一小部分例子:

-400°  ->   -40°
-320°  ->    40°
-240°  ->   120°
-160°  ->  -160°
 -80°  ->   -80°
   0°  ->     0°
  80°  ->    80°
 160°  ->   160°
 240°  ->  -120°
 320°  ->   -40°
 400°  ->    40°

顺便说一句,我假设 m 是本地 math module。