JavaScript/Objekte/Math/atan2

Aus SELFHTML-Wiki
< JavaScript‎ | Objekte‎ | Math
Wechseln zu: Navigation, Suche
Atan2.PNG

Die Methode Math.atan2(y,x) erwartet als Parameter zwei Zahlen. Diese beschreiben die x- und y-Koordinaten eines Punktes P in der Zahlenebene, und atan2 berechnet den Winkel zwischen der Verbindungsgerade durch (0,0) und P und der positiven X-Achse als Wert im Bogenmaß im Bereich -π bis π (Vollkreis).

Ein Anwendungsfall von Math.atan2() ist die Umrechnung von kartesischen (rechtwinkligen) Koordinaten in Polarkoordinaten (Angabe von Winkel zu einer Bezugslinie und Abstand zum Mittelpunkt). Beispielsweise hat der Punkt P1 im nebenstehenden Bild die Koordinaten (5|3). Der Winkel α1 beträgt etwa 31°. Rufen Sie Math.atan2(3, 5) auf, erhalten Sie 0.5404, was 31° im Bogenmaß entspricht.

Beachten Sie: atan2 erwartet als ersten Parameter die y-Koordinate. Die ECMAScript Spezifikation begründet dies als „beabsichtigt und traditionell“.
Verwendung von atan2
  document.addEventListener("click", function(mouseEvent) {
     // Mausposition relativ zum Mittelpunkt des Body bestimmen
     let dy = mouseEvent.clientY - document.body.clientHeight/2,
         dx = mouseEvent.clientX - document.body.clientWidth/2; 

     // Winkel und Abstand zum Mittelpunkt bestimmen (Polarkoordinaten)
     let winkel = Math.atan2(dy, dx) / Math.PI * 180;
     let abstand = Math.hypot(dy, dx);
     console.log(`Ihr Klick befindet sich bei ${winkel} Grad und ist ${abstand}px vom Mittelpunkt entfernt.`);
  }
Der Beispielcode geht von einem <body>-Element aus, das den Bildschirm ausfüllt. Ein click-Eventhandler bestimmt die Koordinaten (dx,dy) der Klickposition relativ zum Mittelpunkt des Body, dazu genügt es, die halbe Breite bzw. Höhe von clientX/Y abzuziehen. Mit Hilfe der atan2 Funktion kann nun sehr einfach bestimmt werden, welchen Winkel die gedachte Linie vom Mittelpunkt zum Klickpunkt zur positiven X-Achse hat. Die hypot Funktion bestimmt die Länge dieser Linie.

Motivation für die Existenz von atan2

Für den Fall, dass x ≧ 0 ist, lässt sich dieser Winkel auch mit Math.atan(y/x) berechnen. Dies funktioniert sogar noch für x = 0, weil JavaScript bei einer Division durch 0 nicht abbricht, sondern die speziellen Werte +Infinity und -Infinity liefert, die Math.atan korrekt mit 𝜋/2 bzw. -𝜋/2 beantwortet.

Da aber die tan-Funktion für die Winkel von 180° bis 360° (bzw. von -180° bis 0°) die gleichen Werte liefert wie für 0° bis 180°, lässt sich mit atan(y/x) nicht auf alle vier Quadranten der Zahlenebene zurückschließen. Der Punkt P1 im obigen Bild hat zum Beispiel die Koordinaten (5,3), der Winkel α1 könnte also mit Math.atan(3/5) berechnet werden (es sind 0,5404rad, ungefähr 31°). Allerdings hat der diagonal gegenüberliegende Punkt P3 (-5, -3) ebenfalls 0,6 als Verhältnis y/x, die atan-Funktion würde hier ebenfalls 0,5404rad zurückliefern.

Die Math.atan2 Funktion schafft Abhilfe, indem sie nicht das Verhältnis y/x als Argument erwartet, sondern y und x selbst, wodurch die Vorzeichen von y und x erhalten bleiben und der vollständige 360° Kreis erfasst werden kann. Math.atan2(-3,-5) gibt -2,6012 zurück, was -149° entspricht.

Verfügbarkeit

Die Methode Math.atan2 ist seit 1999 Teil des JavaScript Standards und ist überall verfügbar, wo auch Math.atan verfügbar ist. Einige alte Android-Browser (vor Version 4.4) kennen atan2 nicht, dort fehlt aber das komplette Trigonometriepaket, so dass Sie sich dort mit einem Nachprogrammieren des entsprechenden Taylorreihen behelfen müssten.