Benutzer-Werkzeuge

Webseiten-Werkzeuge


bilder_rotieren

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
bilder_rotieren [2024/01/20 10:01] – [Beispiel] torsten.roehlbilder_rotieren [2024/02/07 08:23] (aktuell) torsten.roehl
Zeile 12: Zeile 12:
  
  
-|FIXME|FIXME+{{ :inf:java:smiley00.png?150 |}} |{{ :inf:java:smiley45.png? |}}
-|Das originale Bild ist hier Quadratisch FIXME.|Das Bild wurde um 45° Grad gegen den Uhrzeigersinn gedreht.Damit das komplette Bild sichtbar ist muss es jetzt FIXME  groß sein. |+|Das originale Bild ist hier Quadratisch mit ''222x222'' Pixeln.|Das Bild wurde um 45° Grad im Uhrzeigersinn gedreht. Damit das komplette Bild sichtbar ist muss es jetzt ''314x314'' Pixel  groß sein. |
  
  
Zeile 43: Zeile 43:
  
 \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} \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}
-==== Beispiel ==== 
  
 +{{:inf:sample.gif?|}}
 <WRAP center round box 100%> <WRAP center round box 100%>
-**Aufgabe:**\\ +{{:inf:aufgabe.gif?|}} 
-Wie lauten die Koordinaten des neuen Bildpunktes bei einer Drehung um 40°, wenn der alte Bildpunkt P(10,30) ist? + 
-**Lösung:**\\+Wie lauten die Koordinaten des neuen Bildpunktes bei einer Drehung um **40°**, wenn der alte Bildpunkt **P(10,30)** ist?\\ 
 + 
 +{{:inf:solution.gif?|}} 
 + 
 +Für den Sinus und Cosinus ergibt sich: 
 +  sin(40°)=0,643 
 +  cos(40°)=0.766 
 + 
 +Eingesetzt in die Transformationsformeln ergibt sich: 
 +  px´ = 0.766·10 - 0,643·30 = -11,63 
 +  py´ = 0,643·10 + 0,766·30 = 29,41 
 + 
 +Die neuen Koordinaten sind damit** P´( -11,63 | 29,41 )**.
 </WRAP> </WRAP>
 +==== Java Methode zum Rotieren ====
 +Die folgende Java Methode benutzt die Java Klasse Point, um die Transformation zu berechnen.
  
 +<Code Java linenums:1>
 +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;
 +}
 +</Code>
  
 +| FIXME|FIXME |
 +|Orginal.|Das um FIXME Grad gedrehte Bild. |
 ===== Grundprinzip zum Rotieren von Bildern ===== ===== Grundprinzip zum Rotieren von Bildern =====
-==== Koordinaten toScreen and fromScreen ====+ 
 + 
 +==== fromScreen  ↔ toScreen ==== 
 + 
 +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. 
 + 
 +  - Vom zu rotierenden Bild<color #ff7f27> $\text{Bild}_{\text{ALT}}$</color> wird die  Größe (Breite und Höhe) ermittelt. 
 +  - Ein leeres Bild <color #7092be>$\text{Bild}_{\text{NEU}}$</color> wird erzeugt. 
 +      * Die neue Größe kann aus der alten Größe ermittelt werden! 
 +  - für jeden Bildpunkt des zu rotierenden Bildes  <color #ff7f27>$\text{Bild}_{\text{ALT}}$</color> gilt nun: 
 +      * **fromScreen** Die Bildkoordinaten werden in kartesische Koordinaten umgerechnet. 
 +      * Die kartesischen Koordinaten werden mithilfe der Transformationsformel um einen gegebenen Winkel rotiert. 
 +      * **toScreen** Die rotierten kartesischen Koordinaten werden wieder in Bildkoordinaten umgerechnet. 
 +      * Die so berechneten Bildkoordinaten werden im  <color #7092be>$\text{Bild}_{\text{NEU}}$</color> gespeichert.  
 + 
 +<note>Hierbei ist zu beachten, dass Bildkoordinaten **integer** Werte sind und die Transformation in der Regel **double** Werte ergibt. Grundsätzlich sollte man immer mit **double** rechnen. Nur beim Lesen der Bildkoordinaten und beim Schreiben in Bildkoordinaten müssen integer Werte verwendet werden. 
 +</note> 
 + 
 + 
 + 
 +=== fromScreen === 
 +|<color #ff7f27>Bildkoordinaten</color>|//fromScreen// →   |<color #7092be>kartesische Koordinaten</color>
 + 
 + 
 +Mit **fromScreen** bezeichnen wir eine Java-Methode, die Bildkoordinaten in (mathematisch) kartesische Koordinaten  transformiert. 
 +  * Kartesische Koordinaten, sind in der Regel** vorzeichenbehaftete double Werte**. 
 +          * häufig ist der Koordinatenursprung in der Mitte des Bildes überaus zweckmäßig. 
 +  
 + 
 +=== toScreen === 
 +|<color #7092be>kartesische Koordinaten</color>| //toScreen// ** →**   |<color #ff7f27>Bildkoordinaten</color>
 + 
 + 
 +Mit **toScreen** bezeichnen wir eine Java-Methode, die (mathematisch) kartesische Koordinaten in Bildkoordinaten transformiert. 
 +  * Bildkoordinaten haben ihren Ursprung (0|0) oben links und  besitzen nur positive integer Werte 
  
  
 ===== Herleitung der Transformationsgleichung: ===== ===== Herleitung der Transformationsgleichung: =====
-==== Herleitung ====+Wir leiten jetzt die im vorherigen Abschnitt angegeben Transformationsgleichungen her. 
 +==== Voraussetzungen ====
  
  
 +Damit die Herleitung nachvollzogen werden kann, werden lediglich die Additionstheoreme für Sinus und Kosinus benötigt. 
 +
 +
 +  * cos(φ + α ) = cos(φ)·cos(α) - sin(φ)·sin(α)
 +  * sin(φ + α )  = sin(φ)·cos(α) + cos(φ)·sin(α) 
 +
 +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.
 +==== Herleitung ====
 +
 +|{{:inf:java:rot2d.png?320|}} | {{:inf:java:cossin.png?170|}}|
 +|Der rote Punkt wird bei einer Drehung um den Winkel φ in den blauen Punkt überführt (transformiert). |Die oben stehenden Formeln lassen sich direkt aus dem Bild ablesen. \\ **Schauen Sie sich beides solange an, bis ihnen das gelingt!** |
 +|<WRAP>Ausgehend von den Addtionstheoremen für Cosinus und Sinus, werden zuerst cos(α) bzw. sin(α) durch ihre rechten Seiten ersetzt.\\ \\  Jetzt ersetzen wir
 +sin(φ+α) bzw. cos(φ+α) durch ihre rechten Seiten. \\ \\ \\ \\ Der Radius r kürzt sich heraus.</WRAP> | {{:inf:java:herleitung.png?330|}}|
 +| Damit sind die oben angegebenen Transformationsgleichungen gefunden. :-) ||
  
  
  
  
bilder_rotieren.1705744912.txt.gz · Zuletzt geändert: 2024/01/20 10:01 von torsten.roehl