Ich habe einige Probleme beim Verstehen von Math.tan()
und Math.atan()
und Math.atan2()
.
Ich habe Grundkenntnisse in Trigonometrie, aber die Verwendung von SIN, COS und TAN usw. für die Spieleentwicklung ist für mich sehr neu.
Ich lese in einigen Tutorials und sehe, dass wir mit Tangente den Winkel ermitteln können, in dem ein Objekt gedreht werden muss, um zu sehen, wie weit es einem anderen Objekt zugewandt ist, zum Beispiel meiner Maus. Warum müssen wir also noch atan oder atan2 verwenden?
mathematics
sutoL
quelle
quelle
Antworten:
Die Tangentenformel lautet:
tan(angle) = opposite/adjacent
Beziehen Sie sich auf diese Zeichnung:
Wo
a
ist die benachbarte Seite,o
ist die gegenüberliegende Seite undtheta
ist der Winkel. In ähnlicher Weise sind Sinus und Cosinus sin (ang) = o / h und cos (ang) = a / h, wobeih
die lange Seite lautet: http://www.mathwords.com/s/sohcahtoa.htmIn der Zwischenzeit
atan
(Abkürzung für Arcustangens , auch als inverser Tangens bezeichnet ) ist das Gegenteil vontan
:atan(opposite/adjacent) = angle
Wenn Sie also die Werte der gegenüberliegenden und benachbarten Seiten kennen (z. B. durch Subtrahieren der Objektkoordinaten von den Mauskoordinaten), können Sie den Wert des Winkels mit ermitteln
atan
.In der Spielentwicklung kann es jedoch ziemlich häufig vorkommen, dass die benachbarte Seite gleich 0 ist (z. B. wenn die x-Koordinate eines Vektors 0 ist). Denken Sie daran, dass
tan(angle) = opposite/adjacent
das Potenzial für einen katastrophalen Fehler bei der Division durch Null klar sein sollte. Viele Bibliotheken bieten daher eine Funktion namens anatan2
, mit der Sie die Parameterx
und angebeny
können, um die Division durch Null für Sie zu vermeiden und einen Winkel im rechten Quadranten anzugeben .(Diagramm mit freundlicher Genehmigung von Gareth, bitte stimmen Sie auch seine Antwort ab)
Die Verwendung von Trigonometrie in der Spieleentwicklung ist besonders bei Vektoren sehr verbreitet, aber in der Regel verbergen Bibliotheken die Trigonometriearbeit für Sie. Sie können sin / cos / tan für viele Aufgaben verwenden, bei denen geometrische Manipulationen erforderlich sind, um einen Wert aus einem Dreieck zu ermitteln. Alles, was Sie brauchen, sind 3 Werte (Seitenlängen / Winkelwerte), um die anderen Werte eines Rechteckdreiecks zu finden.
Sie können sogar die "zyklische" Natur der Sinus- und Cosinus-Funktionen für spezielle Verhaltensweisen in einem Spiel verwenden, z.
quelle
quelle
Hier ist eine etwas andere Art, über Triggerfunktionen nachzudenken - einschließlich atan () und atan2 () -, die ich hilfreich finde (Erklärungen in Bezug auf "Gegenteil / Nebeneinander" verwirren mich nur aus irgendeinem Grund).
Sie können von einem Punkt zum anderen gelangen, indem Sie x- Einheiten horizontal und y- Einheiten vertikal verschieben ( Rechteck- oder kartesische Koordinaten genannt) oder die Strecke r in einem Winkel von Ɵ verschieben ( in 2D Polarkoordinaten genannt ).
Angenommen, wir haben eine Polarkoordinate (r, Ɵ) und möchten sie in (x, y) konvertieren.
cos (Ɵ) gibt den Anteil von r an , der entlang der x- Achse liegt:
Ebenso gibt sin (Ɵ) den Anteil von r an , der entlang der y- Achse liegt:
Wie wäre es, rechteckige Koordinaten (x, y) in Polarkoordinaten (r, Ɵ) umzuwandeln?
r ist die Hypotenuse des aus x und y gebildeten rechtwinkligen Dreiecks , also:
tan (Ɵ) gibt die Steigung - den Anstieg über den Verlauf - der Linie mit der Länge r an . Damit:
Wenn Sie jedoch y / x ausführen, ergibt die Berechnung von 3/4 die gleiche Antwort wie die Berechnung von -3 / -4. Ebenso gibt -3/4 die gleiche Antwort wie 3 / -4. Wir haben also atan2 (y, x), das die einzelnen Vorzeichen korrekt behandelt und einen Fehler durch Null / Unendlich verhindert.
quelle
Jesse und Sid haben im Grunde recht, aber ich vermute, Sie sind wirklich auf der Suche nach Einsicht in das Problem.
Atan2 () wird benötigt, da atan () Ihnen nicht den Winkel von der Horizontalen angibt, den Sie benötigen, da es nicht mit Quadranten zurechtkommt.
Dies bedeutet, dass die Verwendung von atan für die Vektoren (-2,2) und (2, -2) den gleichen Wert ergibt. Sie würden dann das Vorzeichen Ihrer Argumente einschalten und pi zum Ergebnis hinzufügen. Darüber hinaus haben Sie den Sonderfall der Division durch Null zu berücksichtigen, dass Jesse erwähnt. Auch atan2 () funktioniert besser als atan, wenn x nahe 0 ist
Also du, wenn du den Winkel eines Vektors zwischen -pi und pi willst
oder
quelle
y==0
ob Sie dannx
in der anderen Branche durch dividieren .Ich werde ein paar Dinge kurz erläutern. Eine ausführliche Erklärung finden Sie in den Online-Tutorials zur Trigonometrie.
Sei a ein Winkel. Dann ist tan (a) = tan (a + 2 * pi).
atan ist tan invers, das heißt, Sie erhalten den Winkel, der der tan gegeben ist. Wenn Sie atan (tan (a + 2 * pi)) anrufen, lautet die Antwort a. Dies ist für Ihre Anwendung nicht ausreichend.
atan2 benötigt zwei Argumente, um genau diese Situation zu unterstützen. atan nimmt x und y, die im Grunde genommen cos (a) und sin (a) sind.
atan2 (sin (a), cos (a)) = a atan2 (sin (a + 2 * pi), cos (a + 2 * pi)) = a + 2 * pi / * sin und cos haben unterschiedliche Vorzeichen und führen zu einer anderen Antwort * /
In einigen Tutorials erfahren Sie, warum dies so ist.
Ihr Code sollte ungefähr so aussehen:
quelle
tan(a) = - tan(-a)
Die Gleichung, die Sie ausdrücken wollten, war vielleichttan(a) = tan(pi+a)
Eine Verwendung, die
atan2
ich in meinem Code gefunden habe, ist "Winkel mit Vorzeichen".Normalerweise wird der Winkel zwischen zwei Vektoren wie folgt ermittelt
Dies sagt Ihnen aber nicht, welcher "führt" (dh "weiter vorne im Uhrzeigersinn" als der andere). Diese Informationen können für die Gestenverfolgung wichtig sein.
Sie könnten den Winkel von der x-Achse
(1,0)
für beide Vektoren finden, aber es gibt das schlimme Problem der Mehrdeutigkeit: Ein Vektor mit einem Winkel von 315 Grad gibt mit dercos
oben beschriebenen Methode 45 Grad zurück , ebenso ein Winkel von 45 Grad. Sie könnten eine Überprüfung der Zeichen durchführen, um dasy
zu beheben, oder Sie könnten verwendenatan2
.quelle
Bitte beachten Sie, dass atan nicht defekt ist. arctan oder tan invers ist nur eine Funktion zwischen -PI / 2 und PI / 2. Es wiederholt dieses Muster, ist aber keine Funktion, die für einen Computer ein Problem darstellt, da es nicht mit Mehrfachantworten umgehen kann.
Dies gilt auch zwischen -PI / 2 und PI / 2 und acos zwischen 0 und PI. Dies sind die einfachsten Bereiche für das Auftreten einer Funktion. Für Atan und Asin geht es von seinem negativsten zu seinem positivsten. Für acos geht es vom Positivsten zum Negativsten. (Dies hilft bei der Interpolation genauerer Antworten)
also sind asin, acos und atan die mathematischen funktionen.
atan2 ist jedoch für die Programmierung viel nützlicher, da es die vollständige Umdrehung liefert (PI im Bogenmaß oder 360 Grad oder 400 Grad). Beachten Sie, dass sie nur eine für Bräune produzierten, nicht für Sünde oder Lattich. Tan ist die einzige, die horizontal und vertikal verwendet (x, y)
quelle