找到两个轴承之间的角度

鉴于两个轴承,我如何找到它们之间的最小角度?

因此,例如,如果1个航向为340度而第二个航向为10度,则最小角度为30度。

我附上一张照片来表明我的意思。 我试过从另一个中减去一个,但由于圆圈的环绕效果而无效。 我也尝试过使用负度(180 – 359为-180到0),但是当试图计算正数和负数之间的角度时,它会搞砸。

我确信必须有一个更容易的方法,有很多if语句。

感谢您的帮助。 亚当

BTW。 这是一个导航问题,因此圆的半径是未知的。

找到两个标题之间的角度

 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) } 

我最终使用了此留言板上的以下公式,因为我需要根据方向(顺时针或逆时针)对结果进行签名。 它可以很好地解释究竟发生了什么。

 ((((bearing - heading) % 360) + 540) % 360) - 180 

关于什么:

 angle = Math.abs(a1-a2); if (angle > 180) angle = 360 - angle; 

你提到了关于正数和负数的问题,所以也许我在这里不考虑……

你需要考虑两个方向的差异。

 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); } 

如果需要角度方向,那么这将起作用:

  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;