Czym różni się atan od atan2 w C++?

Jaka jest różnica między atan a atan2 W C++?

 110
Author: nbro, 2008-11-12

11 answers

std::atan2 umożliwia obliczenie arktangentu wszystkich czterech ćwiartek. std::atan umożliwia obliczanie tylko z ćwiartek 1 i 4.

 89
Author: Chris Jester-Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 23:13:56

Z matematyki szkolnej wiemy, że styczna ma definicję

tan(α) = sin(α) / cos(α)

I rozróżniamy cztery ćwiartki na podstawie kąta, który dostarczamy funkcjom. The sign of the sin, cos i tan mają następującą relację (w której pomijamy dokładne 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 pierwszego czy trzeciego kwadrantu i jeśli jest ujemny, może pochodzić z drugi lub czwarty kwadrant. Tak więc, zgodnie z konwencją, atan() zwraca kąt z pierwszego lub czwartego kwadrantu (tj. -π/2 <= atan() <= π/2), niezależnie od oryginalnego wejścia do stycznej.

W celu uzyskania pełnej informacji, nie możemy używać wyniku podziału sin(α) / cos(α), ale musimy spojrzeć na wartości sinusa i cosinusa oddzielnie. I to właśnie robi atan2(). Przyjmuje zarówno sin(α) jak i cos(α) i rozwiązuje wszystkie cztery ćwiartki dodając π do wyniku atan(), gdy cosinus jest ujemny.

Uwaga: funkcja atan2(y, x) faktycznie przyjmuje argument y i x, który jest rzutem wektora o długości v i kącie α na osi y i X, tzn.

y = v * sin(α)
x = v * cos(α)

Co daje relację

y/x = tan(α)

Wniosek: atan(y/x) zatrzymuje pewne informacje i może tylko założyć, że dane wejściowe pochodzą z ćwiartek i lub IV. w przeciwieństwie do tego, atan2(y,x) pobiera wszystkie dane, a tym samym może rozwiązać prawidłowy kąt.

 249
Author: Mehrwolf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-14 01:33:30

Inną rzeczą, o której należy wspomnieć, jest to, że atan2 jest bardziej stabilny, gdy obliczanie stycznych za pomocą wyrażenia takiego jak atan(y / x) i x jest równe 0 lub bliskie 0.

 20
Author: Laserallan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 23:16:06

Rzeczywiste wartości są w radianach, ale interpretując je w stopniach będzie to:

  • atan = podaje wartość kąta między -90 a 90
  • atan2 = podaje wartość kąta między -180 a 180

W mojej pracy, która polega na obliczaniu różnych kątów, takich jak kierunek i łożysko w nawigacji, atan2 w większości przypadków robi to zadanie.

 16
Author: Keugyeol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-09 10:06:43

Atan (x) zwraca główną wartość łuku stycznego x, wyrażoną w radianach.

Atan2 (y,x) zwraca główną wartość łuku stycznego Y / x, wyrażoną w radianach.

Zauważ, że ze względu na niejednoznaczność znaku, funkcja nie może określić z pewnością, w którym kwadrancie kąt spada tylko przez jego wartość styczną (sam atan). Możesz użyć atan2, jeśli chcesz określić kwadrant.

 8
Author: Roman M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 09:38:19

Myślę, że główne pytanie próbuje dowiedzieć się: "kiedy powinienem użyć jednego lub drugiego", lub "którego powinienem użyć", lub "czy używam WŁAŚCIWEGO"?

Myślę, że ważne jest to, że atan był przeznaczony tylko do podawania wartości dodatnich w krzywej kierunku w prawo-w górę, jak dla wektorów czasu i odległości. Cero jest zawsze na dole po lewej, a thigs może iść tylko w górę i w prawo, tylko wolniej lub szybciej. atan nie zwraca liczb ujemnych, więc nie można śledzić rzeczy w 4 kierunkach na ekranie tylko dodając/odejmując jego wynik.

Atan2 jest przeznaczony do pochodzenia być w środku, a rzeczy mogą iść do tyłu lub w dół. To jest to, czego można użyć w reprezentacji ekranu, ponieważ ma znaczenie, w jakim kierunku ma iść krzywa. Więc atan2 może dać liczby ujemne, ponieważ jego cero jest w centrum, a jego wynik jest czymś, czego można użyć do śledzenia rzeczy w 4 kierunkach.

 3
Author: sergio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-09 00:54:09

Za pomocą atan2 możesz określić kwadrant tak, jak podano tutaj .

Możesz użyć atan2, jeśli potrzebujesz wyznacz kwadrant.

 2
Author: Burkhard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-12 09:22:30

Rozważmy trójkąt prostokątny. Oznaczamy przeciwprostokątną r, poziomą stronę y i pionową stronę x. kąt zainteresowania @ jest kątem między x i r.

C++ atan2 (y, x) da nam wartość kąta @ w radianach. atan jest używany, jeśli znamy lub jesteśmy zainteresowani tylko Y/x a nie y i X indywidualnie. Więc jeśli p = y / x następnie aby uzyskać @ użyjemy atan (p).

Nie możesz użyć atan2 do określenia kwadrantu, możesz użyć atan2 tylko jeśli już wiesz który kwadrant twoje wejście! W szczególności dodatnie x i y oznaczają pierwszy kwadrant, dodatnie y i ujemne x, drugi i tak dalej. same atan lub atan2 po prostu zwracają liczbę dodatnią lub ujemną, nic więcej.

 2
Author: bheks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 20:49:20

Mehrwolf poniżej jest poprawny, ale tutaj jest heurystyka, która może pomóc:

Jeśli pracujesz w dwuwymiarowym układzie współrzędnych, co często ma miejsce w przypadku programowania odwrotnej stycznej, powinieneś zdecydowanie użyć ATAN2. Daje pełny zakres 2 pi kątów i dbać o zera w współrzędnej x dla Ciebie.

Innym sposobem na stwierdzenie tego jest to, że atan (y / x) jest praktycznie zawsze w błędzie. Używaj Atana tylko wtedy, gdy argument nie może być traktowany jako y / x.

 0
Author: Nick Mulgan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 01:46:24

atan2(y,x) jest zwykle używany, jeśli chcesz przekonwertować współrzędne kartezjańskie na współrzędne biegunowe. Da ci kąt, podczas gdy sqrt(x*x+y*y) lub, jeśli jest dostępny, hypot(y,x) da ci rozmiar.

atan(x) jest po prostu odwrotnością opalenizny. W irytującym przypadku musisz użyć atan(y/x), ponieważ Twój system nie zapewnia atan2, musisz wykonać dodatkowe kontrole dla znaków x i y oraz dla x=0, aby uzyskać prawidłowy kąt.

Uwaga: atan2(y,x) jest zdefiniowana dla wszystkie wartości rzeczywiste y i x, z wyjątkiem przypadku, gdy oba argumenty są zerowe.

 0
Author: user3303328,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-05 15:48:33

W atan2 wyjście jest: -pi atan2(y,x) pi
a w atanie wyjście jest: -pi/2 atan(y/x) pi/2 //nie należy brać pod uwagę kwartału.
Jeśli chcesz uzyskać orientację pomiędzy 0 i 2*pi (jak w matematyce w liceum), musimy użyć atan2 i dla wartości ujemnych dodać 2*pi, aby uzyskać końcowy wynik między 0 i 2*pi.
Oto kod źródłowy Javy, aby to jasno wyjaśnić:

System.out.println(Math.atan2(1,1)); //pi/4 in the 1st quarter
System.out.println(Math.atan2(1,-1)); //(pi/4)+(pi/2)=3*(pi/4) in the 2nd quarter

System.out.println(Math.atan2(-1,-1 ));//-3*(pi/4) and it is less than 0.
System.out.println(Math.atan2(-1,-1)+2*Math.PI); //5(pi/4) in the 3rd quarter

System.out.println(Math.atan2(-1,1 ));//-pi/4 and it is less than 0.
System.out.println(Math.atan2(-1,1)+2*Math.PI); //7*(pi/4) in the 4th quarter

System.out.println(Math.atan(1 ));//pi/4
System.out.println(Math.atan(-1 ));//-pi/4
 -1
Author: user497884,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 19:36:26