给定两个轴承,我如何找到它们之间的最小角度?
例如,如果第一个航向是 340 度,第二个航向是 10 度,那么最小的角度就是 30 度。
我附上了一张图片来说明我的意思。我试过从另一个中减去一个,但由于圆圈的环绕效果,这不起作用。我也尝试过使用负度数(180 - 359 是 -180 到 0),但是在尝试计算正数和负数之间的角度时会搞砸。
我敢肯定,必须有一种更简单的方法来拥有大量if
语句。
感谢您的帮助。亚当
顺便提一句。这是一个导航问题,所以圆的半径是未知的。
给定两个轴承,我如何找到它们之间的最小角度?
例如,如果第一个航向是 340 度,第二个航向是 10 度,那么最小的角度就是 30 度。
我附上了一张图片来说明我的意思。我试过从另一个中减去一个,但由于圆圈的环绕效果,这不起作用。我也尝试过使用负度数(180 - 359 是 -180 到 0),但是在尝试计算正数和负数之间的角度时会搞砸。
我敢肯定,必须有一种更简单的方法来拥有大量if
语句。
感谢您的帮助。亚当
顺便提一句。这是一个导航问题,所以圆的半径是未知的。
我最终使用了此留言板上的以下公式,因为我需要根据方向(顺时针或逆时针)对结果进行签名。它很好地解释了到底发生了什么。
((((bearing - heading) % 360) + 540) % 360) - 180
float getDifference(float a1, float a2) {
return Math.min((a1-a2)<0?a1-a2+360:a1-a2, (a2-a1)<0?a2-a1+360:a2-a1)
}
关于什么:
angle = Math.abs(a1-a2);
if (angle > 180)
angle = 360 - angle;
你提到了一个关于正数和负数的问题,所以也许我在这里没有考虑到一些事情......
对于导航,您可能想知道 b1 是在 b2 的左边还是右边,所以这里是一个很好的函数。(假设正好 0 不是用例)
function isBearing1LeftOrRightOfBearing2 (b1, b2) {
if (Math.sign(((b1 - b2 + 540) % 360) - 180) > 0) {
return 'left'
} else {
return 'right'
}
}
如果需要角度方向,那么这将起作用:
int maxBearing = Math.max(bearing0, bearing1);
int minBearing = Math.min(bearing0, bearing1);
int firstDir = maxBearing - minBearing;
int secondDir = minBearing + 360 - maxBearing;
int diff = Math.min(firstDir, secondDir);
boolean anticlock_dir = false;
int anticlock = bearing1 + diff;
if (anticlock >= 360)
anticlock = anticlock - 360;
if (anticlock == bearing0)
anticlock_dir = true;
您需要考虑两个方向的差异。
public static double bearingDiff(double a, double b) {
double maxBearing = Math.max(a, b);
double minBearing = Math.min(a, b);
double antiClockwiseDiff = maxBearing - minBearing;
double clockwiseDiff = minBearing + 360 - maxBearing;
return Math.min(antiClockwiseDiff, clockwiseDiff);
}