web-dev-qa-db-ja.com

2つの角度メジャーの差を計算するにはどうすればよいですか?

Javaで結果が[0°、180°]の範囲になるように)で2つの角度メジャーの差(度単位で与えられる)を計算するにはどうすればよいですか?

例えば:

350° to 15° = 25°
250° to 190° = 60°
21
    /**
     * Shortest distance (angular) between two angles.
     * It will be in range [0, 180].
     */
    public static int distance(int alpha, int beta) {
        int phi = Math.abs(beta - alpha) % 360;       // This is either the distance or 360 - distance
        int distance = phi > 180 ? 360 - phi : phi;
        return distance;
    }
46

Nickesの回答に加えて、「Signed difference」が必要な場合

int d = Math.abs(a - b) % 360; 
int r = d > 180 ? 360 - d : d;

//calculate sign 
int sign = (a - b >= 0 && a - b <= 180) || (a - b <=-180 && a- b>= -360) ? 1 : -1; 
r *= sign;

編集:

ここで、「a」と「b」は違いを見つけるための2つの角度です。

「d」は違いです。 「r」は結果/最終的な差です。

17
M. Usman Khan

それらの差の絶対値を取り、180より大きい場合は360°を差し引き、結果の絶対値を取ります。

6
JB Nizet

するだけ

(15 - 350) % 360

方向が問題ではない場合(最小値を生成する方が必要な場合)、逆減算(mod 360)を実行して、2つの最小値を計算します(例:Math.min)。

5
Artefacto

以下についてはどうですか:

dist = (a - b + 360) % 360;
if (dist > 180) dist = 360 - dist;
4
NPE
diff = MAX(angle1, angle2) - MIN(angle1, angle2);  
if (diff > 180) diff = 360 - diff;
1
Oliver