2011-09-27 11 views
16

Jak mogę obliczyć różnicę dwóch miar kątów (podanych w stopniach) w Javie, aby wynik był w zakresie [0 °, 180 °]?Jak obliczyć różnicę dwóch miar kątowych?

Na przykład:

350° to 15° = 25° 
250° to 190° = 60° 
+1

Jeśli obliczasz odległość, dlaczego wynik jest wyrażony w stopniach? –

+0

Czy możesz wyjaśnić - czy szukasz czegoś, co jest wbudowane, czy po prostu pytasz o metodę? także czy powinien wziąć pod uwagę kierunek? Twój pierwszy przykład to 25 stopni zgodnie z ruchem wskazówek zegara, a twój drugi 60 stopni przeciwnie do ruchu wskazówek zegara. Jeśli chcesz uzyskać najkrótszą odległość, twoje wyniki powinny wynosić od 0 do 180 (lub od -180 do 180, jeśli chcesz pokazać kierunek). – Chris

+0

Btw nie należy zezwalać na 360, ponieważ 360 = 0. Domeną argumentów wejściowych powinno być [0, 360]. – m0skit0

Odpowiedz

34
/** 
    * Length (angular) of a shortest way between two angles. 
    * It will be in range [0, 180]. 
    */ 
    private 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; 
    } 
+3

i "Signed difference", dołącz następujący kod ... int sign = (a - b> = 0 && - b <= 180) || (a - b <= -180 && a- b> = -360)? 1: -1; r * = znak; – usman

+0

To naprawdę mi pomogło, dziękuję. – super

4

Wystarczy zrobić

(15 - 350) % 360 

Jeśli kierunek nie ma znaczenia (chcesz taki, który daje najmniejszą wartość), a następnie wykonaj odwrotnej odejmowanie (mod 360) i obliczyć najmniejszą wartość z dwóch (np. z Math.min).

+0

możesz wyjaśnić trochę więcej? nie rozumiem cię ", a następnie wykonaj odejmowanie odwrotne (mod 360) i obliczyć najmniejszą wartość." – NullPointerException

+0

@ I mam na myśli robienie również (350-15)% 360. – Artefacto

+0

min ((ab)% 360, (ba)% 360) @ AndroidUser99 – squid

3

Jak o następujące elementy:

dist = (a - b + 360) % 360; 
if (dist > 180) dist = 360 - dist; 
6

Wystarczy wziąć wartość bezwzględną ich różnicy, a następnie, jeśli większy niż 180, odjąć 360 ° i podjąć bezwzględną wartość wyniku.

0

diff = MAX (kąt1, kąt2) - MIN (kąt1, kąt2);
jeśli (diff> 180) diff = 360 - diff;

10

Oprócz Nickes odpowiedź, jeśli u chcą "Signed różnica"

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; 

edycja:

gdzie 'A' i 'B' są dwa kąty, aby znaleźć różnicę.

"d" to różnica. "r" jest różnicą wynikową/końcową.

+1

Co oznaczają "d" i "r" w tym kontekście? Różnica i rotacja? –

+1

Zakładam, że 'a' i' b' reprezentują odpowiednio 'targetAngle' oraz' currentAngle'. –

+0

@StevenVascellaro yes that's right – usman

Powiązane problemy