我该如何在Java中计算两个角度(以度为单位给定)的差,使得结果在[0°,180°]范围内?
例如:
350° to 15° = 25°
250° to 190° = 60°
我该如何在Java中计算两个角度(以度为单位给定)的差,使得结果在[0°,180°]范围内?
例如:
350° to 15° = 25°
250° to 190° = 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;
}
除了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'为结果/最终差异。
d
和 r
代表什么?差异和旋转吗? - Stevoisiaka
和 b
分别代表 targetAngle
和 currentAngle
。 - Stevoisiakif(a < 0) a = 360 - ((-a) % 360);
else a = a % 360;
- JSideris只需取它们之间的差的绝对值,如果大于180度,则减去360度并取结果的绝对值。
只需执行
(15 - 350) % 360
Math.min
)。以下内容如何:
dist = (a - b + 360) % 360;
if (dist > 180) dist = 360 - dist;
diff = MAX(angle1, angle2) - MIN(angle1, angle2);
if (diff > 180) diff = 360 - diff;