Signatur
Beschreibung
atan2() ist eine Erweiterung der klassischen atan()-Funktion und berechnet den Winkel (in Bogenmaß/Radiant) zwischen der positiven X-Achse und dem Punkt (x, y). Der entscheidende Unterschied zu atan(y/x) ist, dass atan2() die Vorzeichen beider Parameter einzeln auswertet und damit den korrekten Quadranten des Ergebnisses ermitteln kann.
Der Rückgabewert liegt im Bereich von -π bis +π (also ca. −3,14159 bis +3,14159). Um den Winkel in Grad umzurechnen, kann das Ergebnis mit 180 / M_PI multipliziert werden.
Typische Anwendungsfälle sind Koordinatentransformationen, Spieleentwicklung (z. B. Blickrichtung eines Sprites berechnen), Robotik sowie alle Szenarien, in denen ein Richtungsvektor in einen Winkel umgewandelt werden muss. Wenn x gleich 0 ist, gibt atan2() je nach Vorzeichen von y den Wert π/2 oder -π/2 zurück – ein Sonderfall, der mit atan() nicht handhabbar wäre.
Beachte, dass die Parameterreihenfolge y zuerst, dann x lautet – dies entspricht dem mathematischen Standard, kann aber leicht verwechselt werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $y Pflicht | float | Die Y-Koordinate des Punktes (Zähler des Quotienten). Wird zuerst übergeben. | |
| $x Pflicht | float | Die X-Koordinate des Punktes (Nenner des Quotienten). Kann auch 0 sein, was bei atan() zu einer Division durch null führen würde. |
Rückgabewert
-π bis +π, der dem Punkt (x, y) entspricht.Beispiele
Grundlegende Winkelberechnung in verschiedenen Quadranten
<?php
// Winkel für typische Punkte auf dem Einheitskreis
$winkel1 = atan2(1, 1); // 45° (erster Quadrant)
$winkel2 = atan2(1, -1); // 135° (zweiter Quadrant)
$winkel3 = atan2(-1, -1); // -135° (dritter Quadrant)
$winkel4 = atan2(-1, 1); // -45° (vierter Quadrant)
echo round(rad2deg($winkel1), 2) . '°' . PHP_EOL; // 45°
echo round(rad2deg($winkel2), 2) . '°' . PHP_EOL; // 135°
echo round(rad2deg($winkel3), 2) . '°' . PHP_EOL; // -135°
echo round(rad2deg($winkel4), 2) . '°' . PHP_EOL; // -45°
Blickrichtung eines Sprites zur Maus berechnen (Spielelogik)
<?php
// Beispiel: Sprite steht bei (100, 200), Maus ist bei (350, 80)
$spriteX = 100;
$spriteY = 200;
$mausX = 350;
$mausY = 80;
// Differenzvektor vom Sprite zur Maus
$dx = $mausX - $spriteX; // 250
$dy = $mausY - $spriteY; // -120
// Winkel in Radiant (Y-Achse: In 2D-Grafik ist Y oft invertiert)
$winkelRad = atan2($dy, $dx);
$winkelGrad = rad2deg($winkelRad);
echo 'Winkel zur Maus: ' . round($winkelGrad, 2) . '°' . PHP_EOL;
// Für Rotation im mathematisch positiven Sinn normalisieren (0–360°):
$normalisiert = fmod($winkelGrad + 360, 360);
echo 'Normalisiert (0–360°): ' . round($normalisiert, 2) . '°' . PHP_EOL;
// Wichtig · Fallstricke
Parameterreihenfolge beachten: Im Gegensatz zur intuitiven Reihenfolge (x, y) erwartet atan2() zuerst y und dann x. Dieses Vertauschen ist ein häufiger Fehler.
Wenn beide Parameter 0 sind (atan2(0, 0)), ist das mathematisch undefiniert. PHP gibt in diesem Fall 0 zurück, jedoch sollte dieser Sonderfall im eigenen Code explizit abgefangen werden.
Für sehr leistungskritische Anwendungen mit vielen Berechnungen kann die PHP-Extension ext-gmp oder die Verwendung der GMP-Bibliothek keine Alternative sein – hier bietet sich eher eine native C-Extension an.