在 Java 中計算兩個角度的差值
1. 簡介
在本教程中,我們將討論角度、角度的測量單位以及測量兩個角度差的三種方法。此外,我們還將提供每個角度差計算的 Java 程式碼片段。
2. 角度測量
角度是兩條相交線或平面之間旋轉的度量。度和弧度是角度的兩個最常用單位。我們用一個完整的圓來表示度,因為一個圓是由 360 度組成。另一方面,弧度是圓心與半徑相等的圓弧所夾的角。一個完整的圓的弧度為 2π。
Java 的 Math 函式庫使用弧度來表示三角函數(例如 sin、cos、tan)。因此,我們使用Math.toRadians()將角度轉換為弧度。
3. 兩個角度之間的差異
這裡,我們將展示三種計算兩個角度a和b差的方法。首先,我們將學習如何計算兩個角度之間的絕對差。然後,我們將學習如何計算兩個角度之間的最短差.最後,我們將計算兩個角度之間保符號的最短差。
3.1. 絕對差
第一種方法是絕對差分。我們將絕對差分定義為標準正差分, ab ,範圍為[0, 2π] 。例如,10度和300度之間的差分是∣10−300∣=290度。這裡,我們忽略旋轉方向,僅給出差分的完整幅度。
讓我們看看實作:
public static double absoluteDifference(double angle1, double angle2) {
return Math.abs(angle1 - angle2);
}
3.2. 最短差值
現在,讓我們來討論最短差值。最短差值是從a到b的最小旋轉角度。例如,10 度到 300 度之間的最短差值是 70 度。這始終位於 [0, 180 度(或 π 弧度)] 範圍內。
讓我們看看解決方案。我們將使用一個實用方法normalizeAngle () 將每個角度映射到範圍 [0, 360):
public static double normalizeAngle(double angle) {
return (angle % 360 + 360) % 360;
}
歸一化後,我們計算歸一化角度之間的絕對差,並將其儲存在變數diff中。然後,我們用 360 減去diff ,並將結果與diff進行比較,返回兩者中的最小值:
public static double shortestDifference(double angle1, double angle2) {
double diff = absoluteDifference(normalizeAngle(angle1), normalizeAngle(angle2));
return Math.min(diff, 360 - diff);
}
3.3. 保留符號的最短差分
最後,同樣重要的是,我們有一個保符號最短距離演算法。除了找到角度a和b之間的最短差值之外,它還保留了旋轉方向(順時針或逆時針)的符號。例如,從 10 度旋轉到 300 度是 -70 度旋轉(順時針)或 290 度旋轉(逆時針)。
讓我們檢查一下它的實作:
public static double signedShortestDifference(double angle1, double angle2) {
double normalizedAngle1 = normalizeAngle(angle1);
double normalizedAngle2 = normalizeAngle(angle2);
double diff = normalizedAngle2 - normalizedAngle1;
if (diff > 180) {
return diff - 360;
}
else if (diff < -180) {
return diff + 360;
}
else {
return diff;
}
}
如上面的程式碼所示, signedShortestDifference()計算原始差異,然後如果它超出 (-180, 180) 範圍,則透過加或減 360 來調整它。
4. 結論
在本文中,我們學習了各種方法來計算兩個角度之間的差值,並將其限制在使用者定義的範圍內。由於 Java 語言的循環特性,計算兩個角度之間的差值需要更深入的理解。作為一種通用方法,我們首先對兩個角度進行歸一化。然後,計算差值(絕對差值、最短差值或保符號最短差值)。