Czym różni się atan od atan2 w C++?
Jaka jest różnica między atan
a atan2
W C++?
11 answers
std::atan2
umożliwia obliczenie arktangentu wszystkich czterech ćwiartek. std::atan
umożliwia obliczanie tylko z ćwiartek 1 i 4.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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