PHP und JavaScript: Trigonometrische Funktionen (Winkelfunktionen)

Oft dürfte man die trigonometrischen Funktionen zur Winkelberechnung in PHP oder JavaScript nicht benötigen. Wenn doch, funktionieren die PHP Funktionen nicht wie erwartet. Egal ob man den Taschenrechner aus der Schulzeit benutzt oder die entsprechenden Apps auf PC oder Smartphone. Gebe ich 30 ein und nutze die sin Funktion ist das Ergebnis 0,5. JavaScript gibt für alert(Math.sin(30)); den Wert -0.9880316240928618 aus und PHP für echo sin(30); den Wert -0.98803162409286!

Warum ist das so?

Die trigonometrischen Funktionen (Winkelfunktionen) in PHP und JavaScript erwarten als Parameter das Bogenmaß (Englisch: radians) und nicht das Gradmaß. Um die Gradangabe zu nutzen, muss diese erst in das Bogenmaß umgerechnet werden:

Bogenmaß = 2 π x Gradmaß / 360° = π x Gradmaß / 180°

Gradmaß = Bogenmaß x 360° / 2 π = Bogenmaß x 180° / π

JavaSCript: radians = degrees * Math.PI / 180
PHP: $radians = $degrees * pi() / 180

Math.PI bzw. pi() geben die mathematische Konstante Pi (abgekürzt mit π) aus, auch Kreiskonstante genannt: 3,1415926...

Um den Sinuswert von 30° zu erhalten, muss der Sourcecode angepasst werden:

JavaScript: alert(Math.sin(30 * Math.PI / 180));
PHP: echo sin(30 * pi() / 180);

Theorie

Die Winkelfunktionen lassen sich an einem rechtwinkligem Dreieck erklären:



Die Winkelfunktionen Sinus, Kosinus und Tangens sind die wichtigsten trigonometrischen Funktionen, abgekürzt mit sin, cos und tan. Der Winkel α befindet sich zwischen der Ankathete b und der Hypotenuse c. Zwischen der Ankathete b und der Gegenkathete a befindet sich der rechte Winkel (90°).



Beispiel: Der Winkel α beträgt 45°. tan(45) = 1, d.h. die Gegenkathete und die Ankathete sind gleich lang.

Einheitskreis



Der Einheitskreis ist ein Kreis mit einem Radius = 1 (hier: Buchstabe c). Der Umfang eines Kreises beträgt 2 π = 2 x 3,1415926 = 6,2831852

Um den Winkel zu beschreiben gibt es das Gradmaß (siehe oben) und das Bogenmaß.

    

Im linken Beispiel beträgt der Winkel α im Gradmaß 90° und das Bogenmaß x entspricht einem Viertel des Kreises - also π/2 = 1,57.
Im rechten Beispiel beträgt der Winkel α im Gradmaß 45° und das Bogenmaß x entspricht einem Achtel des Kreises - also π/4 = 0,785.

Winkelfunktionen in der Praxis

Beim Kauf eines Flachbildfernsehers ist neben vielen anderen Kritierien häufig die Größe eine wichtige Angabe - für manchen Käufer die wichtigste überhaupt. "Was hast du für einen Fernseher?", häufige Antwort: "65 Zoll"! Aber wie groß ist jetzt 65 Zoll? Zur Beantwortung benötigen wir das bereits oben gezeigte rechtwinklige Dreieck:



Die Hypotenuse entspricht der Größenangabe beim TV, der Bildschirmdiagonalen, also c = 65 Zoll = 65 x 2,54 cm = 165,1 cm. Um jetzt die Breite und die Höhe zu bestimmen ist das Format wichtig. (Fast) alle gängigen Fernseher nutzen das Breitbildformat im Verhältnis 16 : 9. 16 / 9 = 1,778, d.h. die Breite entspricht 1,7778 multipliziert mit der Höhe. Damit entspricht die Höhe der Gegenkathete a und die Breite der Ankathete b. Anders ausgedrückt: b = 1,7778 x a.

Zuerst wird der Winkel α bestimmt:



Um jetzt den Winkel α zu erhalten, wird die Umkehrfunktion von Tangens benötigt: der Arcustangens, abgekürzt mit arctan oder tan-1.

Winkel α = arctan(1 / 1,778) = 29,36°

Zur Berechnung der Breite wird jetzt noch die Cosinus Funktion benötigt.



... und die Höhe erhält man über die Sinus Funktion:



Die Breite des sichtbaren Bildes beträgt 143,9 cm und die Höhe 80,9 cm. Hinzukommt noch der Rand auf beiden Seiten, der bei aktuellen Modellen oft nur noch wenige Millimeter beträgt. Die Höhe ist oft ein paar Zentimeter höher. Eventuell kommt noch der Standfuß hinzu (wenn der Fernseher nicht an der Wand montiert wird).

PHP Code:
$winkel = atan(1/1.778) * 180 / pi();
echo "Breite = " . round(cos(pi() * $winkel / 180) * 165.1,1) ." cm";
echo "Höhe = " . round(sin(pi() * $winkel / 180) * 165.1,1) ." cm";
Ergebnis:
Breite = 143.9 cm
Höhe = 80.9 cm

JavaScript Code:
winkel = Math.atan(1/1.778) * 180 / Math.PI;
breite = Math.round(Math.cos(Math.PI * winkel / 180) * 165.1 * 10) / 10;
hoehe = Math.round(Math.sin(Math.PI * winkel / 180) * 165.1 * 10) / 10;
alert("Breite = " + breite + " cm\nHöhe = " + hoehe + " cm");



Im Gegensatz zu PHP rundet die JavaScript Funktion Math.round() nur auf den nächsten Integer Wert. Es ist nicht möglich Nachkommastellen anzugeben, um z.B. auf 2 Nachkommastellen zu runden. Der Trick: der berechnete Wert wird mit 10 multipliziert, dann gerundet und das Ergebnis durch 10 dividiert. Damit wird das Ergebnis auf eine Nachkommastelle gerundet. Für 2 Nachkommastellen entsprechend mit 100 multiplizeren, runden und durch 100 dividieren.


Siehe auch Bildschirmgröße, Auflösung, Pixel, Farbtiefe, dpi, ...