2013-04-23 45 views
7

給定兩個軸承,我如何找到它們之間的最小角度?找到兩個軸承之間的夾角

因此,例如,如果1航向是340度,第二個是10度,最小角度將是30度。

我附上了一張圖片來展示我的意思。我試過從另一箇中減去一個,但由於環繞的效果而無法工作。我也嘗試過使用負度數(180 - 359爲-180到0),但是當試圖計算正數和負數之間的角度時,這會變得混亂。

我敢肯定,必須有一個更簡單的方法,有很多if陳述。

感謝您的幫助。 Adam

BTW。這是一個導航問題,因此圓的半徑是未知的。

Finding the angle between two headings

+0

Mod運算符將幫助你在這裏。很多。 – 2013-04-23 23:04:13

+0

ooops!修復! – 2013-04-23 23:08:52

回答

6
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) 
} 
+0

謝謝你的工作。我一直試圖解決這個問題6個小時! – 2013-04-23 23:25:04

+1

等價:'Math.min((a1 - a2 + 360)%360,(a2 - a1 + 360)%360)'(使用'fmod','IEERemainder'等等,不支持浮點值。) – 2015-11-27 17:55:48

+0

太棒了,你讓我的一天。 – FerDensetsu 2017-07-06 17:56:42

4

什麼:

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

你提到關於正負數的問題,所以可能有一些東西我不考慮在這裏......

+0

我相信你的答案與我的答案相同,但也許更容易理解。 看起來像我們已經得到的兩者之間的交叉的另一種選擇是'Math.min(Math.abs(a1-a2),360 - Math.abs(a1-a2));' – 2013-04-24 15:24:06

+0

它們在他們都是正確和有效的感覺。在我看來,你的實現將該問題視爲OP算法正確性的問題,而我認爲這是一個格式化已經正確的值的問題。兩種方法都是查看問​​題的有效方法,我認爲兩種方法在價值上存在足夠的差異。 – femtoRgon 2013-04-24 15:43:18

0

你需要考慮兩個方向的差異。

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

我結束了使用上this message board發現了以下公式,因爲我所需要的結果基於所述方向(順時針或逆時針),以進行簽名。它對發生了什麼有一個很好的解釋。

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

如果需要的角度方向,那麼這將工作:

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;