Mam pewne problemy ze zrozumieniem Math.tan()
i Math.atan()
i Math.atan2()
.
Mam podstawową wiedzę na temat trygonometrii, ale użycie SIN, COS i TAN itp. Do tworzenia gier jest dla mnie bardzo nowe.
Czytam niektóre samouczki i widzę, że używając stycznej możemy uzyskać kąt, pod którym jeden obiekt musi zostać obrócony, o ile jest skierowany w stronę innego obiektu, na przykład mojej myszy. Dlaczego więc nadal musimy używać atan lub atan2?
mathematics
sutoL
źródło
źródło
Odpowiedzi:
Wzór na styczną jest następujący:
tan(angle) = opposite/adjacent
Zobacz ten rysunek:
Gdzie
a
jest strona sąsiednia,o
jest stroną przeciwną itheta
kątem. Podobnie, sinus i cosinus to sin (ang) = o / hi cos (ang) = a / h gdzieh
jest długa strona: http://www.mathwords.com/s/sohcahtoa.htmTymczasem
atan
(skrót od stycznej do łuku , znany również jako styczna odwrotna ) jest odwrotnościątan
:atan(opposite/adjacent) = angle
Tak więc, jeśli znasz wartości zarówno przeciwnej, jak i sąsiedniej strony (na przykład odejmując współrzędne obiektu od współrzędnych myszy), możesz uzyskać wartość kąta za pomocą
atan
.W rozwoju gry może się jednak zdarzyć dość często, że sąsiednia strona jest równa 0 (np. Współrzędna x wektora wynosi 0). Pamiętając, że
tan(angle) = opposite/adjacent
potencjał katastrofalnego błędu dzielenia przez zero powinien być jasny. Tak więc wiele bibliotek oferuje funkcję o nazwieatan2
, która pozwala określić zarówno parametry, jakx
iy
parametry, aby uniknąć podziału na zero i dać kąt we właściwej ćwiartce.(schemat dzięki uprzejmości Garetha, proszę również głosować na jego odpowiedź)
Zastosowanie trygonometrii w tworzeniu gier jest dość powszechne, szczególnie w przypadku wektorów, ale zwykle biblioteki ukrywają dla ciebie pracę trygonometrii. Możesz użyć sin / cos / tan do wielu zadań, które wymagają manipulacji geometrycznych w celu znalezienia wartości z trójkąta. Potrzebujesz tylko 3 wartości (długości boków / wartości kątów), aby znaleźć inne wartości trójkąta prostokątnego, więc jest to całkiem przydatne.
Możesz nawet użyć „cyklicznej” natury funkcji sinus i cosinus do specjalnych zachowań w grze, np. Widziałem, że cos / sin często używał, aby obiekt obracał się wokół innego.
źródło
źródło
Oto nieco inny sposób myślenia o funkcjach triggera - w tym atan () i atan2 () - który uważam za pomocny (wyjaśnienia w kategoriach „przeciwieństwo / sąsiadowanie” po prostu mylą mnie z jakiegoś powodu).
Możesz przejść z jednego punktu do drugiego, przesuwając x jednostek w poziomie, a y jednostek w pionie (zwanych współrzędnymi prostokątnymi lub kartezjańskimi ) lub przesuwając odległość r pod kątem Ɵ (zwanym współrzędnymi biegunowymi w 2D).
Powiedzmy, że mamy współrzędną biegunową (r, Ɵ) i chcemy ją przekonwertować na (x, y).
cos (Ɵ) daje ci proporcję r, która leży wzdłuż osi x :
Podobnie sin (Ɵ) daje ci proporcję r, która leży wzdłuż osi y :
Co powiesz na przekształcenie współrzędnej prostokątnej (x, y) na współrzędną biegunową (r, Ɵ)?
R jest przeciwprostokątna trójkąta prostokątnego utworzonego przez X i Y , tak:
tan (Ɵ) daje nachylenie - wzrost w biegu - linii o długości r . Więc:
Jednak wykonując y / x, obliczenie 3/4 daje taką samą odpowiedź jak obliczenie -3 / -4. Podobnie -3/4 daje taką samą odpowiedź jak 3 / -4. Mamy więc atan2 (y, x), który poprawnie obsługuje poszczególne znaki i zapobiega błędowi dzielenia przez zero / nieskończoności.
źródło
Jesse i Sid mają w zasadzie rację, ale podejrzewam, że naprawdę masz wgląd w problem.
Atan2 () jest potrzebny, ponieważ atan () nie mówi ci kąta od poziomu, którego potrzebujesz, ponieważ nie radzi sobie z ćwiartkami.
Oznacza to, że użycie atan dla wektorów (-2,2) i (2, -2) da tę samą wartość. Następnie należy włączyć znak argumentów i dodać wynik do pi. Ponadto masz dzielony przez zero szczególny przypadek, aby wziąć pod uwagę wspomniany przez Jesse'a. Również atan2 () działa lepiej niż atan, gdy x jest bliskie 0
Więc jeśli chcesz kąt wektora między -pi a pi
lub
źródło
y==0
dzielenia sięx
w drugiej gałęzi.Wyjaśnię kilka rzeczy w zwięzły sposób. Szczegółowe wyjaśnienia znajdują się w samouczkach trygonometrii online.
Niech będzie kąt. Następnie tan (a) = tan (a + 2 * pi).
atan jest podpalany odwrotnie, to znaczy daje kąt podany opaleniu. Gdy zadzwonisz do atan (tan (a + 2 * pi)), odpowiedzią będzie. Będzie to nieodpowiednie dla twojej aplikacji.
atan2 przyjmie 2 argumenty, aby pomóc w tych dokładnych sytuacjach. Atan przyjmuje xiy, które są w zasadzie cos (a) i sin (a).
atan2 (sin (a), cos (a)) = a atan2 (sin (a + 2 * pi), cos (a + 2 * pi)) = a + 2 * pi / * sin i cos ma różne znaki, prowadzące na inną odpowiedź * /
Znajdź kilka samouczków wyjaśniających, dlaczego tak jest.
Twój kod powinien być mniej więcej taki:
źródło
tan(a) = - tan(-a)
, równanie, które chciałeś wyrazić, to być możetan(a) = tan(pi+a)
Jednym z zastosowań
atan2
, które znalazłem w moim kodzie, jest „kąt podpisany”.Normalnie sposób, w jaki można znaleźć kąt między dwoma wektorami, jest
Ale to nie mówi ci, który z nich „prowadzi” (tj. Jest „dalej naprzód zgodnie z ruchem wskazówek zegara” niż drugi). Informacje te mogą być ważne dla śledzenia gestów.
Można znaleźć kąt od osi x
(1,0)
dla obu wektorów, ale istnieje ten paskudny problem niejednoznaczności: wektor o kącie 315 stopni zwraca 45 stopni przy użyciucos
powyższej metody, podobnie jak kąt 45 stopni. Możesz to zrobić,y
aby to naprawić, lub możesz użyćatan2
.źródło
Uwaga: atan nie jest zepsuty. arctan lub tan inverse jest tylko funkcją między -PI / 2 a PI / 2. Powtarza ten wzorzec, ale nie jest to funkcja stanowiąca problem dla komputera, ponieważ nie obsługuje wielu odpowiedzi.
Jest to to samo dla asin między -PI / 2 i PI / 2 i acos między 0 i PI. Są to najprostsze zakresy dla wystąpienia funkcji. W przypadku atanu i asinu przechodzi od najbardziej negatywnego do najbardziej pozytywnego. W przypadku acos zmienia się od najbardziej pozytywnego do najbardziej negatywnego. (pomaga to w interpolacji dokładniejszych odpowiedzi)
więc asin, acos i atan są funkcjami matematycznymi.
atan2 jest jednak znacznie bardziej użyteczny do programowania, ponieważ zapewnia pełny obrót (PI w radianach lub 360 stopniach lub 400 gradianach). Zauważ, że wyprodukowali tylko jeden dla opalenizny, a nie dla grzechu lub cos. Tan jest jedynym, który wykorzystuje poziomy i pionowy (x, y)
źródło