# 获取2个角度之间的最短旋转间隔

本篇教程获得第一期知识库优秀教程奖。

获奖作者:素笺淡墨。

一般最常见的角度应该划分为0 ---> 360,360 ---->0,180----> 0 <—— -180。

在这种情况下,假设,我们以三百六十为基准。-350到360之间,如果只是单纯的相减,返回的肯定不是最快的距离。

毕竟-350其实就相当于-10,而三百六十就相当于0。他们之间的最近距离一定是十。

在这种情况下,我们需要获取最近的距离,我们一定要先把所有的角度让它小于180并且 >-180。

也就是a代表角度 rx或者ry。

if a>180: 
    a+=-360 
if a<-180:
    a+=360

至于为什么要这样,是因为如果这个当前的角度超过一百八十,那他一定是绕到了另一半的区域了。因为我上面的取值范围是 -180 ----- 0 ----- 180。

在这种情况下,180度和-180度实际是相等的。

也就是在一个圆圈内,180和-180这两个点它们重叠了。

这两个点要是有任何一方超过一百八这个数字,那么他就会到达另一边。

也就是说-181,其实就等于179。这样子就能确保他们一定会处于一百八十以内。

做完这一步之后,你会发现-179度和180度这两个角度如果进行相减还是无法获得最近的距离。

因为按照我上面所说这两个角度他们的相差一定是一。

在这种情况下,我们还需要进行一步处理,那就是如果这两个角度他们之间的相差大于一百八十,那就代表这两个角度之间一定存在一个正和一个负数。因为正常情况下,按照我上面那一步把角度限制为一百八十的话,0----180,最大就是一百八十。

那么我们就把第一个角度转换成第二个角度的同类型,也就是如果第二个角度它是负数那么我们就把第一个角度转换成负数。如果第二个角度是正数第一个角度是负数,那么我们就把第一个角度转换成正数。

def func(a, b):
    if abs(a-b)>180:
        if  b>0:
            a+=360
        else:
            a+=-360
    return (a,b)

这个时候返回的ab两个值你再将它们相减,就会得到一个最近的角度间隔。