給定兩個軸承,我如何找到它們之間的最小角度?找到兩個軸承之間的夾角
因此,例如,如果1航向是340度,第二個是10度,最小角度將是30度。
我附上了一張圖片來展示我的意思。我試過從另一箇中減去一個,但由於環繞的效果而無法工作。我也嘗試過使用負度數(180 - 359爲-180到0),但是當試圖計算正數和負數之間的角度時,這會變得混亂。
我敢肯定,必須有一個更簡單的方法,有很多if
陳述。
感謝您的幫助。 Adam
BTW。這是一個導航問題,因此圓的半徑是未知的。
給定兩個軸承,我如何找到它們之間的最小角度?找到兩個軸承之間的夾角
因此,例如,如果1航向是340度,第二個是10度,最小角度將是30度。
我附上了一張圖片來展示我的意思。我試過從另一箇中減去一個,但由於環繞的效果而無法工作。我也嘗試過使用負度數(180 - 359爲-180到0),但是當試圖計算正數和負數之間的角度時,這會變得混亂。
我敢肯定,必須有一個更簡單的方法,有很多if
陳述。
感謝您的幫助。 Adam
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)
}
謝謝你的工作。我一直試圖解決這個問題6個小時! – 2013-04-23 23:25:04
等價:'Math.min((a1 - a2 + 360)%360,(a2 - a1 + 360)%360)'(使用'fmod','IEERemainder'等等,不支持浮點值。) – 2015-11-27 17:55:48
太棒了,你讓我的一天。 – FerDensetsu 2017-07-06 17:56:42
什麼:
angle = Math.abs(a1-a2);
if (angle > 180)
angle = 360 - angle;
你提到關於正負數的問題,所以可能有一些東西我不考慮在這裏......
我相信你的答案與我的答案相同,但也許更容易理解。 看起來像我們已經得到的兩者之間的交叉的另一種選擇是'Math.min(Math.abs(a1-a2),360 - Math.abs(a1-a2));' – 2013-04-24 15:24:06
它們在他們都是正確和有效的感覺。在我看來,你的實現將該問題視爲OP算法正確性的問題,而我認爲這是一個格式化已經正確的值的問題。兩種方法都是查看問題的有效方法,我認爲兩種方法在價值上存在足夠的差異。 – femtoRgon 2013-04-24 15:43:18
你需要考慮兩個方向的差異。
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);
}
我結束了使用上this message board發現了以下公式,因爲我所需要的結果基於所述方向(順時針或逆時針),以進行簽名。它對發生了什麼有一個很好的解釋。
((((bearing - heading) % 360) + 540) % 360) - 180
如果需要的角度方向,那麼這將工作:
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;
Mod運算符將幫助你在這裏。很多。 – 2013-04-23 23:04:13
ooops!修復! – 2013-04-23 23:08:52