it-swarm.com.de

Was ist der Unterschied zwischen atan und atan2 in C++?

Was ist der Unterschied zwischen atan und atan2 in C++?

117
yesraaj

std::atan2 erlaubt die Berechnung des Arkustangens aller vier Quadranten. std::atan erlaubt nur die Berechnung aus den Quadranten 1 und 4.

100

Aus der Schulmathematik wissen wir, dass der Tangens die Definition hat

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

und wir unterscheiden vier Quadranten nach dem Winkel, den wir zu den Funktionen liefern. Das Vorzeichen von sin, cos und tan hat die folgende Beziehung (wobei wir die genauen Vielfachen von π/2 vernachlässigen):

  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. Konventionell gibt atan() einen Winkel vom ersten oder vierten Quadranten (d. H. -π/2 <= atan() <= π/2) zurück, unabhängig von der ursprünglichen Eingabe zur Tangente.

Um die vollständige Information wieder zu erhalten, dürfen wir das Ergebnis der Division sin(α) / cos(α) nicht verwenden, sondern müssen die Werte von Sinus und Cosinus getrennt betrachten. Und genau das tut atan2(). Es benötigt beides, sin(α) und cos(α), und löst alle vier Quadranten auf, indem π zum Ergebnis von atan() hinzugefügt wird, wenn der Cosinus negativ ist.

Anmerkung: Die Funktion atan2(y, x) benötigt tatsächlich ein y- und ein x-Argument, das die Projektion eines Vektors mit der Länge v und dem Winkel α auf der y- und x-Achse ist, d. 

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

was gibt die Beziehung

y/x = tan(α)

Schlussfolgerung: atan(y/x) wird einige Informationen zurückgehalten und kann nur davon ausgehen, dass die Eingabe aus den Quadranten I oder IV stammt. Im Gegensatz dazu erhält atan2(y,x) alle Daten und kann somit den korrekten Winkel auflösen.

261
Mehrwolf

Zu erwähnen ist auch, dass atan2 stabiler ist, wenn Tangenten mit einem Ausdruck wie atan(y / x) berechnet werden, und x 0 oder nahe 0 ist.

22
Laserallan

Die tatsächlichen Werte sind im Bogenmaß angegeben, aber um sie in Grad zu interpretieren, wird es Folgendes sein:

  • atan = gibt den Winkelwert zwischen -90 und 90 an
  • atan2 = gibt einen Winkelwert zwischen -180 und 180 an

Für meine Arbeit, die die Berechnung verschiedener Winkel wie etwa Kurs und Peilung in der Navigation beinhaltet, erledigt atan2 in den meisten Fällen die Aufgabe.

18
Keugyeol

atan (x) Gibt den Hauptwert des Arkustangens von x zurück, ausgedrückt in Bogenmaß.

atan2 (y, x) Gibt den Hauptwert des Arkustangens von y/x zurück, ausgedrückt in Bogenmaß.

Beachten Sie, dass eine Funktion aufgrund der Mehrdeutigkeit der Vorzeichen nicht mit Sicherheit bestimmen kann, in welchem ​​Quadranten der Winkel nur um seinen Tangentenwert fällt (nur bei einem Wert). Sie können atan2 verwenden, wenn Sie den Quadranten bestimmen müssen.

8
Roman M

Ich denke, die Hauptfrage versucht herauszufinden: "wann sollte ich das eine oder andere verwenden" oder "was soll ich verwenden" oder "benutze ich das Richtige"?

Ich denke, der wichtige Punkt ist, dass nur ein Ziel war, positive Werte in einer Rechts-Aufwärts-Richtungskurve wie für Zeit-Distanz-Vektoren einzugeben. Cero ist immer links unten, und diese können nur nach oben und rechts gehen, nur langsamer oder schneller. atan gibt keine negativen Zahlen zurück, daher können Sie keine Dinge in vier Richtungen auf einem Bildschirm verfolgen, indem Sie das Ergebnis addieren/subtrahieren.

atan2 ist dafür gedacht, dass der Ursprung in der Mitte ist, und Dinge können rückwärts oder abwärts gehen. Das ist, was Sie in einer Bildschirmdarstellung verwenden würden, denn es spielt keine Rolle, in welche Richtung die Kurve gehen soll. Atan2 kann Ihnen also negative Zahlen geben, da sich der Nullpunkt in der Mitte befindet und das Ergebnis etwas ist, mit dem Sie Dinge in 4 Richtungen verfolgen können.

3
sergio

Mit atan2 können Sie den Quadranten wie angegeben hier bestimmen.

Sie können atan2 verwenden, wenn Sie .__ benötigen. Bestimmen Sie den Quadranten.

2
Burkhard

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 den Wert von angle @ im Bogenmaß an. _ atan wird verwendet, wenn wir nur y/x und nicht y und x einzeln kennen oder daran interessiert sind. Wenn also p = y/x Ist, verwenden wir atan (p).

Sie können atan2 nicht zur Bestimmung des Quadranten verwenden. Sie können atan2 nur verwenden, wenn Sie bereits wissen in welchem ​​Quadranten Sie sich befinden! Insbesondere bedeuten positives x und y den ersten Quadranten, positives y und negatives x, der zweite usw. atan oder atan2 selbst geben einfach eine positive oder negative Zahl zurück, mehr nicht. 

2
bheks

atan2(y,x) wird im Allgemeinen verwendet, wenn Sie kartesische Koordinaten in Polarkoordinaten konvertieren möchten. Es gibt Ihnen den Winkel, während sqrt(x*x+y*y) oder, falls verfügbar, hypot(y,x) die Größe angibt.

atan(x) ist einfach die Umkehrung von Tan. Im ärgerlichen Fall müssen Sie atan(y/x) verwenden, da Ihr System atan2 nicht zur Verfügung stellt. Sie müssen zusätzliche Überprüfungen für die Vorzeichen von x und y und für x=0 durchführen, um den korrekten Winkel zu erhalten.

Hinweis: atan2(y,x) ist für alle reellen Werte von y und x definiert, außer für den Fall, dass beide Argumente Null sind.

0
user3303328

In atan2 lautet die Ausgabe: -pi <atan2(y,x) <pi
und in atan ist die Ausgabe: -pi/2 <atan(y/x) <pi/2 // es wird NICHT das Quartal berücksichtigt.
Wenn Sie die Orientierung zwischen 0 und 2*pi erhalten möchten (wie in der High-School-Mathematik), müssen Sie atan2 verwenden und für negative Werte den 2*pi hinzufügen, um das Endergebnis zwischen 0 und 2*pi zu erhalten.
Hier ist der Java-Quellcode, um es klar zu erklären:

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
0
user497884

Mehrwolf unten ist richtig, aber hier ist eine Heuristik, die helfen kann:

Wenn Sie in einem 2-dimensionalen Koordinatensystem arbeiten, was bei der Programmierung des inversen Tangens häufig der Fall ist, sollten Sie unbedingt atan2 verwenden. Es gibt den gesamten Winkelbereich von 2 pi und achtet auf Nullen in der x-Koordinate.

Eine andere Möglichkeit, dies zu sagen, ist, dass atan (y/x) praktisch immer falsch ist. Verwenden Sie atan nur, wenn das Argument nicht als y/x gedacht werden kann.

0
Nick Mulgan