Dieser Abschnitt zeigt wie sich Bilder um einen beliebigen Winkel φ (sprich PHI) rotieren lassen. Rotation (lat. rotatio: Drehung)
Dieser Abschnitt ist noch nicht komplett fertiggestellt.
Wenn Bilder um einen Winkel $\varphi$ gedreht (rotiert) werden sollen, muss beachtet werden, dass das rotierte Bild eventuell größer als das originale Bild werden kann.
Das originale Bild ist hier Quadratisch mit 222×222 Pixeln. | Das Bild wurde um 45° Grad im Uhrzeigersinn gedreht. Damit das komplette Bild sichtbar ist muss es jetzt 314×314 Pixel groß sein. |
Für die Umrechnung vom Gradmaß in das Bogenmaß gilt die Beziehung: \begin{equation} \frac{360° }{\text{Winkel im Gradmaß}} == \frac{2 \pi}{\text{Winkel im Bogenmaß}} \end{equation}
Bei der Rotation wird jeder Bildpunkt P(x|y) des Originalbildes in einen neuen Bildpunkt P´(x|y) überführt.
Gesucht ist eine Transformation, die ausgehend von dem alten Bildpunkt, sowie dem gewünschen Drehwinkel, einen neuen Bildpunkt berechnet.
\begin{equation} \left(\begin{array}{}p\prime_x\\p\prime_y\end{array}\right) = R(\varphi)\cdot \left(\begin{array}{}p_x\\p_y\end{array}\right) \end{equation}
Wir werden an dieser Stelle die Transformation gleich angeben und anschließend an einem Beispiel zeigen, wie man mit ihr arbeitet. Eine Herleitung dieser Gleichungen ist weiter unten angegeben. Die gesuchten Transformationsgleichungen sind:
\begin{equation} \color{blue}{p\prime_x} = cos(\varphi)\cdot \color{red}{p_x} - sin(\varphi) \cdot \color{red}{p_y} \\ \color{blue}{p\prime_y} = sin(\varphi)\cdot \color{red}{p_x} + cos(\varphi) \cdot \color{red}{p_y} \end{equation}
Wie lauten die Koordinaten des neuen Bildpunktes bei einer Drehung um 40°, wenn der alte Bildpunkt P(10,30) ist?
Für den Sinus und Cosinus ergibt sich:
Eingesetzt in die Transformationsformeln ergibt sich:
Die neuen Koordinaten sind damit P´( -11,63 | 29,41 ).
Die folgende Java Methode benutzt die Java Klasse Point, um die Transformation zu berechnen.
public Point rotation(Point point, double angle){ Point result = new Point(); double c = Math.cos(angle); double s = Math.sin(angle); result.x = c*point.x - s*point.y; result.y = s*point.x + c*point.y; return result; }
Orginal. | Das um Grad gedrehte Bild. |
Um Bilder zu rotieren, müssen grundsätzlich folgende Schritte abgearbeitet werden. Wir gehen hier davon aus, dass das Bild um seine Bildmitte rotiert werden soll.
Bildkoordinaten | fromScreen → | kartesische Koordinaten |
Mit fromScreen bezeichnen wir eine Java-Methode, die Bildkoordinaten in (mathematisch) kartesische Koordinaten transformiert.
kartesische Koordinaten | toScreen → | Bildkoordinaten |
Mit toScreen bezeichnen wir eine Java-Methode, die (mathematisch) kartesische Koordinaten in Bildkoordinaten transformiert.
Wir leiten jetzt die im vorherigen Abschnitt angegeben Transformationsgleichungen her.
Damit die Herleitung nachvollzogen werden kann, werden lediglich die Additionstheoreme für Sinus und Kosinus benötigt.
Eine einfache Herleitung dieser Formel kann mit Hilfe der komplexen Zahlen (Eulerformel) erfolgen. Für unsere Zwecke ist es aber ausreichend, sie in das Gedächtnis gerufen zu haben.