如何计算两个角度的差?

27

我该如何在Java中计算两个角度(以度为单位给定)的差,使得结果在[0°,180°]范围内?

例如:

350° to 15° = 25°
250° to 190° = 60°

1
如果你正在计算距离,为什么结果是以度数表示的? - Buhake Sindi
你能澄清一下吗——你是在寻找已建成的东西,还是仅仅在询问一种方法?此外,它是否需要考虑方向?你的第一个例子是顺时针旋转25度,第二个则是逆时针旋转60度。如果你只想要最短的距离,那么你的结果应该是0到180度(或者是-180到180度,如果你想显示方向的话)。 - Chris
顺便提一下,你不应该允许360,因为360=0。输入参数的域应为[0, 360)。 - m0skit0
编辑以提高清晰度;如果这不是您真正想要的,请随意回滚。 - andand
6个回答

60
    /**
     * Shortest distance (angular) between two angles.
     * It will be in range [0, 180].
     */
    public static int distance(int alpha, int beta) {
        int phi = Math.abs(beta - alpha) % 360;       // This is either the distance or 360 - distance
        int distance = phi > 180 ? 360 - phi : phi;
        return distance;
    }

8
对于“已签署差异(Signed difference)”,请添加以下代码:int sign = (a - b >= 0 && a - b <= 180) || (a - b <= -180 && a- b>= -360) ? 1 : -1; r *= sign; - M. Usman Khan
这真的帮了我很多,谢谢。 - user2039981

26

除了Nick的答案,如果你想要"有符号差异"

int d = Math.abs(a - b) % 360; 
int r = d > 180 ? 360 - d : d;

//calculate sign 
int sign = (a - b >= 0 && a - b <= 180) || (a - b <=-180 && a- b>= -360) ? 1 : -1; 
r *= sign;

编辑:

其中'a'和'b'是要找出差异的两个角度。

'd'为差值。'r'为结果/最终差异。


2
在这个上下文中,dr 代表什么?差异和旋转吗? - Stevoisiak
1
我假设 ab 分别代表 targetAnglecurrentAngle - Stevoisiak
@StevenVascellaro 是的,没错 - M. Usman Khan
这对于负角度不起作用。例如,0和-380之间的符号为负,但0和-20之间的符号为正。简单的解决方法是设置a =(a + 360)%360,b =(b + 360)%360。但对于小于-360的角度无效。 - JSideris
昨晚思考了一晚。在计算符号之前,使所有角度(a和b)都为正角度,方法如下:if(a < 0) a = 360 - ((-a) % 360); else a = a % 360; - JSideris
显示剩余2条评论

9

只需取它们之间的差的绝对值,如果大于180度,则减去360度并取结果的绝对值。


5

只需执行

(15 - 350) % 360

如果方向不重要(您希望得到最小值),那么进行逆减法运算(对360取模),并计算出两个值中的最小值(例如使用Math.min)。

你能再解释一下吗?我不明白你的意思。"然后进行反向减法(模360),并计算最小值。" - NullPointerException
@ 我的意思是也要执行 (350 - 15) % 360。 - Artefacto
min((a-b)%360, (b-a)%360) - squid
@Artefacto能否在你的回答中添加一个“反向减法”的示例,以得到一个非方向性的答案? - Stevoisiak

4
以下翻译如下:

以下内容如何:

dist = (a - b + 360) % 360;
if (dist > 180) dist = 360 - dist;

1
diff = MAX(angle1, angle2) - MIN(angle1, angle2);  
if (diff > 180) diff = 360 - diff;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接