Was ist der Unterschied zwischen atan
und atan2
in C ++?
std::atan2
ermöglicht die Berechnung des Arkustangens aller vier Quadranten. std::atan
erlaubt nur die Berechnung aus den Quadranten 1 und 4.
Aus der Schulmathematik wissen wir, dass die Tangente die Definition hat
tan(α) = sin(α) / cos(α)
und wir unterscheiden zwischen vier Quadranten basierend auf dem Winkel, den wir den Funktionen liefern. Das Zeichen der sin
, cos
und tan
haben die folgende Beziehung (wo wir die genauen Vielfachen von vernachlässigen π/2
):
Quadrant Angle sin cos tan
-------------------------------------------------
I 0 < α < π/2 + + +
II π/2 < α < π + - -
III π < α < 3π/2 - - +
IV 3π/2 < α < 2π - + -
Da der Wert von tan(α)
positiv ist, können wir nicht unterscheiden, ob der Winkel vom ersten oder dritten Quadranten stammt, und wenn er negativ ist, könnte er vom zweiten oder vierten Quadranten stammen. Gibt also konventionell atan()
einen Winkel vom ersten oder vierten Quadranten (dh -π/2 <= atan() <= π/2
) zurück, unabhängig von der ursprünglichen Eingabe in die Tangente.
Um die vollständigen Informationen zurückzugewinnen, dürfen wir das Ergebnis der Division nicht verwenden, sin(α) / cos(α)
sondern müssen die Werte von Sinus und Cosinus getrennt betrachten. Und genau das atan2()
macht es. Es werden sowohl das als auch sin(α)
und cos(α)
und alle vier Quadranten aufgelöst, indem π
zum Ergebnis addiert wird , atan()
wann immer der Kosinus negativ ist.
Bemerkung: Die atan2(y, x)
Funktion benötigt tatsächlich ein y
und ein x
Argument , dh die Projektion eines Vektors mit Länge v
und Winkel α
auf die y- und x-Achse, d. H.
y = v * sin(α)
x = v * cos(α)
das gibt die Beziehung
y/x = tan(α)
Schlussfolgerung: Es
atan(y/x)
werden einige Informationen zurückgehalten und es kann nur davon ausgegangen werden, dass die Eingabe aus den Quadranten I oder IV stammt. Im Gegensatz dazu werden atan2(y,x)
alle Daten abgerufen und somit der richtige Winkel aufgelöst.
-π/2 <= atan() <= π/2
tatsächlich einen Punkt (pi/2
) aus Quadrant II.Eine andere Sache zu erwähnen ist, dass
atan2
sie stabiler ist, wenn Tangenten mit einem Ausdruck wieatan(y / x)
undx
0 oder nahe 0 berechnet werden .quelle
Die tatsächlichen Werte sind im Bogenmaß angegeben, aber um sie in Grad zu interpretieren, ist dies:
atan
= gibt einen Winkelwert zwischen -90 und 90 anatan2
= gibt einen Winkelwert zwischen -180 und 180 anFür meine Arbeit, bei der verschiedene Winkel wie Kurs und Peilung in der Navigation berechnet werden, ist dies
atan2
in den meisten Fällen der Fall.quelle
atan (x) Gibt den Hauptwert der Bogen-Tangente von x zurück, ausgedrückt im Bogenmaß.
atan2 (y, x) Gibt den Hauptwert der Bogen-Tangente von y / x zurück, ausgedrückt im Bogenmaß.
Beachten Sie, dass eine Funktion aufgrund der Vorzeichenmehrdeutigkeit nicht mit Sicherheit bestimmen kann, in welchen Quadranten der Winkel nur durch seinen Tangentenwert fällt (atan allein). Sie können atan2 verwenden, wenn Sie den Quadranten bestimmen müssen.
quelle
(-pi,pi]
aber atan2 hat den Bereich,[-pi,pi]
so dass er einen zusätzlichen Wert-pi
aus einem anderen Zweig aufgrund vonatan2(-0.0,x)
für enthältx<0
.Ich denke, die Hauptfrage versucht herauszufinden: "Wann sollte ich das eine oder das andere verwenden" oder "Welches soll ich verwenden" oder "Benutze ich das richtige"?
Ich denke, der wichtige Punkt ist, dass nur positive Werte in einer Richtungskurve von rechts nach oben wie bei Zeit-Distanz-Vektoren eingespeist werden sollten. Cero ist immer unten links und Thigs können nur nach oben und rechts gehen, nur langsamer oder schneller. atan gibt keine negativen Zahlen zurück, daher können Sie Dinge nicht in die 4 Richtungen auf einem Bildschirm verfolgen, indem Sie einfach das Ergebnis addieren / subtrahieren.
atan2 soll den Ursprung in der Mitte haben und die Dinge können rückwärts oder runter gehen. Das würden Sie in einer Bildschirmdarstellung verwenden, da es darauf ankommt, in welche Richtung die Kurve gehen soll. Atan2 kann Ihnen also negative Zahlen geben, da sich sein Cero in der Mitte befindet und das Ergebnis etwas ist, mit dem Sie Dinge in vier Richtungen verfolgen können.
quelle
Mit atan2 können Sie den Quadranten wie hier angegeben bestimmen .
quelle
Betrachten Sie ein rechtwinkliges Dreieck. Wir bezeichnen die Hypotenuse r, die horizontale Seite y und die vertikale Seite x. Der interessierende Winkel α ist der Winkel zwischen x und r.
C ++
atan2(y, x)
gibt uns den Wert des Winkels α im Bogenmaß an.atan
wird verwendet, wenn wir y / x nur kennen oder daran interessiert sind, nicht y und x einzeln. Wenn also p = y / x ist, würden wir verwenden, um α zu erhaltenatan(p)
.Sie können
atan2
den Quadranten nicht bestimmen, Sie können ihnatan2
nur verwenden, wenn Sie bereits wissen, in welchem Quadranten Sie sich befinden! Insbesondere positive x und y implizieren den ersten Quadranten, positive y und negative x, den zweiten und so weiter.atan
oderatan2
selbst geben einfach eine positive oder eine negative Zahl zurück, nichts weiter.quelle
p=y/x
, können Sie verwendenatan2(p,1)
.Mehrwolf unten ist richtig, aber hier ist eine Heuristik, die helfen kann:
Wenn Sie in einem zweidimensionalen Koordinatensystem arbeiten, was häufig beim Programmieren der inversen Tangente der Fall ist, sollten Sie auf jeden Fall atan2 verwenden. Es gibt den vollen Winkelbereich von 2 pi an und kümmert sich für Sie um Nullen in der x-Koordinate.
Eine andere Art, dies zu sagen, ist, dass atan (y / x) praktisch immer falsch ist. Verwenden Sie atan nur, wenn das Argument nicht als y / x angesehen werden kann.
quelle
atan2(y,x)
wird im Allgemeinen verwendet, wenn Sie kartesische Koordinaten in Polarkoordinaten konvertieren möchten. Es wird Ihnen den Winkel geben, währendsqrt(x*x+y*y)
oder, falls verfügbar,hypot(y,x)
die Größe angegeben werden.atan(x)
ist einfach die Umkehrung von tan. In dem ärgerlichen Fall, den Sie verwenden müssen,atan(y/x)
weil Ihr System nicht bereitstelltatan2
, müssten Sie zusätzliche Überprüfungen auf die Zeichen vonx
und durchführeny
, undx=0
, um den richtigen Winkel zu bekommen.Hinweis:
atan2(y,x)
ist für alle reellen Werte vony
und definiertx
, außer für den Fall, dass beide Argumente Null sind.quelle
In atan2 ist die Ausgabe:
-pi
<atan2(y,x)
<pi
und in Atan, der Ausgang ist:
-pi/2
<atan(y/x)
<pi/2
// es nicht das Quartal betrachtet Dosis.Wenn Sie die Orientierung zwischen
0
und2*pi
(wie in der High-School-Mathematik) erhalten möchten , müssen Sie atan2 verwenden und für negative Werte das hinzufügen2*pi
, um das Endergebnis zwischen0
und zu erhalten2*pi
.Hier ist der Java-Quellcode, um es klar zu erklären:
quelle