Start · Sprachen · PHP · Referenz · atan2

atan2

Funktion

Berechnet den Arkustangens von <code>y/x</code> unter Berücksichtigung der Vorzeichen beider Parameter, um den richtigen Quadranten zu bestimmen.

seit PHP 4.0.0 Kategorie: math

Signatur

atan2(float $y, float $x): float

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

Typ
float
Beschreibung
Den Winkel in Bogenmaß (Radiant) im Bereich 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°
45° 135° -135° -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;
Winkel zur Maus: -25.64° Normalisiert (0–360°): 334.36°

// 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.