Jaka jest różnica między atan
iw atan2
C ++?
std::atan2
pozwala obliczyć arcus tangens wszystkich czterech kwadrantów. std::atan
pozwala tylko na obliczanie z kwadrantów 1 i 4.
Z matematyki szkolnej wiemy, że styczna ma definicję
tan(α) = sin(α) / cos(α)
i rozróżniamy cztery ćwiartki na podstawie kąta, który zapewniamy funkcjom. Znakiem sin
, cos
i tan
mieć następującą zależność (gdzie zaniedbujemy dokładnej wielokrotności π/2
):
Quadrant Angle sin cos tan
-------------------------------------------------
I 0 < α < π/2 + + +
II π/2 < α < π + - -
III π < α < 3π/2 - - +
IV 3π/2 < α < 2π - + -
Biorąc pod uwagę, że wartość tan(α)
jest dodatnia, nie możemy rozróżnić, czy kąt był z pierwszej, czy trzeciej ćwiartki, a jeśli jest ujemny, może pochodzić z drugiej lub czwartej ćwiartki. Tak więc zgodnie z konwencją atan()
zwraca kąt z pierwszej lub czwartej ćwiartki (tj. -π/2 <= atan() <= π/2
), Niezależnie od pierwotnego wejścia do stycznej.
Aby uzyskać pełną informację, nie możemy korzystać z wyniku dzielenia, sin(α) / cos(α)
ale musimy osobno przyjrzeć się wartościom sinusa i cosinusa. I to właśnie atan2()
robi. Zajmuje oba, sin(α)
i cos(α)
i rozwiązuje wszystkie cztery ćwiartki, dodając π
do wyniku atan()
zawsze, gdy cosinus jest ujemny.
Uwaga:atan2(y, x)
funkcja faktycznie odbywa się y
i A x
argumentu, który jest rzutem wektor o długości v
i kąta α
na Y- i osi x, tj
y = v * sin(α)
x = v * cos(α)
co daje związek
y/x = tan(α)
Wniosek:
atan(y/x)
wstrzymuje się pewne informacje i można tylko założyć, że dane wejściowe pochodziły z ćwiartki I lub IV. Natomiast atan2(y,x)
pobiera wszystkie dane, a tym samym może rozwiązać prawidłowy kąt.
-π/2 <= atan() <= π/2
rzeczywistości zakres obejmuje jeden punkt (pi/2
) z kwadrantu II.Inną rzeczą, o której należy wspomnieć, jest to, że
atan2
jest bardziej stabilny podczas obliczania stycznych przy użyciu wyrażenia takiego jakatan(y / x)
ix
wynosi 0 lub jest bliski 0.źródło
Rzeczywiste wartości są podane w radianach, ale aby zinterpretować je w stopniach, będzie to:
atan
= daje wartość kąta między -90 a 90atan2
= daje wartość kąta między -180 a 180W mojej pracy, która polega na obliczaniu różnych kątów, takich jak kurs i namiar w nawigacji,
atan2
w większości przypadków spełnia to zadanie.źródło
atan (x) Zwraca główną wartość stycznej łuku dla x, wyrażoną w radianach.
atan2 (y, x) Zwraca główną wartość stycznej łuku dla y / x, wyrażoną w radianach.
Zauważ, że z powodu niejednoznaczności znaku funkcja nie może z całą pewnością określić, w którym kwadrancie kąt mieści się tylko o wartość styczną (tylko atan). Możesz użyć atan2, jeśli potrzebujesz określić kwadrant.
źródło
(-pi,pi]
ale atan2 ma zakres,[-pi,pi]
więc zawiera jedną dodatkową wartość-pi
z innej gałęzi z powoduatan2(-0.0,x)
forx<0
.Wydaje mi się, że główne pytanie próbuje się dowiedzieć: „kiedy powinienem użyć jednego lub drugiego”, „którego powinienem użyć” lub „Czy używam właściwego”?
Wydaje mi się, że ważnym punktem jest to, że atan tylko miał dostarczać dodatnie wartości na krzywej w kierunku od prawej do góry, tak jak w przypadku wektorów czas-odległość. Cero jest zawsze w lewym dolnym rogu, a uda mogą poruszać się tylko w górę iw prawo, po prostu wolniej lub szybciej. atan nie zwraca liczb ujemnych, więc nie możesz śledzić rzeczy w 4 kierunkach na ekranie, po prostu dodając / odejmując wynik.
atan2 jest przeznaczone do tego, aby początek znajdował się pośrodku, a rzeczy mogą się cofać lub spadać. Tego właśnie użyłbyś w przedstawieniu na ekranie, ponieważ MA znaczenie, w jakim kierunku chcesz poprowadzić krzywą. Więc atan2 może dać ci liczby ujemne, ponieważ jego cero znajduje się w środku, a jego wynik jest czymś, co możesz wykorzystać do śledzenia rzeczy w 4 kierunkach.
źródło
Za pomocą atan2 możesz określić kwadrant, jak podano tutaj .
źródło
Rozważmy trójkąt prostokątny. Oznaczamy przeciwprostokątną r, poziomą stronę y i pionową stronę x. Kąt zainteresowania α to kąt między x i r.
C ++
atan2(y, x)
da nam wartość kąta α w radianach.atan
jest używany, jeśli tylko znamy lub interesuje nas y / x, a nie y i x indywidualnie. Więc jeśli p = y / x, to aby otrzymać α, użylibyśmyatan(p)
.Nie możesz użyć
atan2
do określenia kwadrantu, możesz użyćatan2
tylko wtedy, gdy już wiesz, w którym kwadrancie się znajdujesz! W szczególności dodatnie x i y implikują pierwszą ćwiartkę, dodatnią y i ujemną x, drugą i tak dalej.atan
lubatan2
same zwracają liczbę dodatnią lub ujemną, nic więcej.źródło
p=y/x
, nadal możesz używaćatan2(p,1)
.Poniższy Mehrwolf jest poprawny, ale oto heurystyka, która może pomóc:
Jeśli pracujesz w dwuwymiarowym układzie współrzędnych, co często ma miejsce przy programowaniu odwrotnej stycznej, zdecydowanie powinieneś użyć atan2. Da pełny zakres kątów 2 pi i zajmie się zerami we współrzędnej x za Ciebie.
Inaczej mówiąc, atan (y / x) jest praktycznie zawsze błędne. Atan należy używać tylko wtedy, gdy argument nie może być traktowany jako y / x.
źródło
atan2(y,x)
jest zwykle używany do konwersji współrzędnych kartezjańskich na współrzędne biegunowe. Poda kąt, podczas gdysqrt(x*x+y*y)
lub, jeśli jest dostępny,hypot(y,x)
poda rozmiar.atan(x)
jest po prostu odwrotnością opalenizny. W irytującym przypadku, którego musisz użyć,atan(y/x)
ponieważ twój system nie zapewniaatan2
, musiałbyś wykonać dodatkowe kontrole pod kątem znakówx
iy
i dlax=0
, aby uzyskać prawidłowy kąt.Uwaga:
atan2(y,x)
jest zdefiniowany dla wszystkich rzeczywistych wartościy
ix
, z wyjątkiem przypadku, gdy oba argumenty mają wartość zero.źródło
W atan2, wyjście jest:
-pi
<atan2(y,x)
<pi
i atan, wyjście jest:
-pi/2
<atan(y/x)
<pi/2
// NIE dawki rozważyć kwartał.Jeśli chcesz uzyskać orientację między
0
a2*pi
(jak matematyka w szkole średniej), musimy użyć atan2, a dla wartości ujemnych dodaj znak,2*pi
aby uzyskać końcowy wynik między0
a2*pi
.Oto kod źródłowy Java, aby to jasno wyjaśnić:
źródło