Biorąc pod uwagę 2 kąty w zakresie -PI -> PI wokół współrzędnej, jaka jest wartość najmniejszego z dwóch kątów między nimi?
Biorąc pod uwagę, że różnica między PI i -PI nie wynosi 2 PI, ale zero.
Przykład:
Wyobraź sobie okrąg, z 2 liniami wychodzącymi ze środka, między tymi liniami są 2 kąty, kąt, jaki tworzą wewnątrz, czyli mniejszy kąt , i kąt, który tworzą na zewnątrz, czyli większy kąt. Oba kąty po zsumowaniu tworzą pełne koło. Biorąc pod uwagę, że każdy kąt może mieścić się w pewnym zakresie, jaka jest mniejsza wartość kątów, biorąc pod uwagę najazd
language-agnostic
geometry
angle
Tom J Nowell
źródło
źródło
Odpowiedzi:
Daje to oznaczony kąt dla dowolnych kątów:
Uwaga w wielu językach
modulo
operacja zwraca wartość z tym samym znakiem co dywidenda (np. C, C ++, C #, JavaScript, pełna lista tutaj ). Wymaga to niestandardowejmod
funkcji, takiej jak:Lub tak:
Jeśli kąty mieszczą się w przedziale [-180, 180], to również działa:
W bardziej szczegółowy sposób:
źródło
a -= 360*sgn(a)*(abs(a) > 180)
. (Pomyśl o tym, jeśli masz bezgałęziowe implementacjesgn
iabs
, wtedy ta cecha może faktycznie zacząć rekompensować potrzebę dwóch mnożeń.)double targetA = 2; double sourceA = 359;
`` a '' będzie równe -357,0 zamiast 3,0x to kąt docelowy. y jest źródłem lub kątem początkowym:
Zwraca podpisany kąt delta. Zauważ, że w zależności od twojego API kolejność parametrów dla funkcji atan2 () może być różna.
źródło
x-y
podaje różnicę kąta, ale może wykraczać poza pożądane granice. Pomyśl o tym kącie definiującym punkt na okręgu jednostkowym. Współrzędne tego punktu to(cos(x-y), sin(x-y))
.atan2
zwraca kąt dla tego punktu (który jest równoważnyx-y
), z wyjątkiem tego, że jego zakres to [-PI, PI].Jeśli twoje dwa kąty są x i y, to jeden z kątów między nimi to abs (x - y). Drugi kąt to (2 * PI) - abs (x - y). Zatem wartość najmniejszego z dwóch kątów to:
Daje to bezwzględną wartość kąta i zakłada, że dane wejściowe są znormalizowane (tj. W zakresie
[0, 2π)
).Jeśli chcesz zachować znak (tj: kierunek) kąta, a także zaakceptować kąty spoza zakresu
[0, 2π)
, możesz uogólnić powyższe. Oto kod Pythona dla wersji uogólnionej:Zauważ, że
%
operator nie zachowuje się tak samo we wszystkich językach, szczególnie gdy używane są wartości ujemne, więc jeśli przenoszenie może być konieczne pewne korekty znaków.źródło
from math import tau
.Podejmuję wyzwanie udzielenia podpisanej odpowiedzi:
źródło
Dla użytkowników UnityEngine prostym sposobem jest użycie Mathf.DeltaAngle .
źródło
Rozwiązanie arytmetyczne (w przeciwieństwie do algorytmicznego):
źródło
Wydajny kod w C ++, który działa dla każdego kąta i obu: radianów i stopni, to:
źródło
Nie ma potrzeby obliczania funkcji trygonometrycznych. Prosty kod w języku C to:
niech dif = a - b, w radianach
niech dif = a - b, w stopniach
Bez grzechu, bez cos, bez opalenizny .... tylko geometria !!!!
źródło
arg = arg - PIV2;
rozwija się doarg = arg - M_PI + M_PI
, więc nic nie robi.