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°
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°
/**
* 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;
}
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
).
możesz wyjaśnić trochę więcej? nie rozumiem cię ", a następnie wykonaj odejmowanie odwrotne (mod 360) i obliczyć najmniejszą wartość." – NullPointerException
@ I mam na myśli robienie również (350-15)% 360. – Artefacto
min ((ab)% 360, (ba)% 360) @ AndroidUser99 – squid
Jak o następujące elementy:
dist = (a - b + 360) % 360;
if (dist > 180) dist = 360 - dist;
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.
diff = MAX (kąt1, kąt2) - MIN (kąt1, kąt2);
jeśli (diff> 180) diff = 360 - diff;
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ą.
Co oznaczają "d" i "r" w tym kontekście? Różnica i rotacja? –
Zakładam, że 'a' i' b' reprezentują odpowiednio 'targetAngle' oraz' currentAngle'. –
@StevenVascellaro yes that's right – usman
Jeśli obliczasz odległość, dlaczego wynik jest wyrażony w stopniach? –
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
Btw nie należy zezwalać na 360, ponieważ 360 = 0. Domeną argumentów wejściowych powinno być [0, 360]. – m0skit0