Transformation Grafische Bildverarbeitung Vortrag: Kenny Schlör 29.11.1999 Theorie:Einführung in die zwei- und dreidimensionalen Transformation. Transformation ist ein Teilgebiet in der linearen Algbra. Siehe LAII. Die Transformationen kommen direkt in Anwendungsprogrammen und innerhalb vieler Graphikpakete zum Einsatz.Eine Applikation zur Stadtplanung würde mit einer Translation die Symbole für Gebäude und Bäume an die richtigen Stellen bringen ,die Symbole mit einer Rotation ausrichten und sie durch Skalierung auf die richtige Größe bringen.Im allgemeinen benutzen viele Applikationen die geometrische Transformation,um Position,Orientierung und Größe von Objekten in einer Zeichnung zu ändern. Formen der Transformationen in Graphikpaketen: Translation(Verschiebung): – Punkte werden mittels der Translation in einer Ebene (zweidimensionale Transformation) mittels eines gewünschten Betrages der Verschiebungen zu den Koordinaten addiert. – Ein Punkt beispielsweise P(x,y) wird um dx Einheiten parallel zur XAchse und um dy Einheiten parallel zur Y-Achse auf den neuen Punkt P‘(x‘,y‘)verschoben. x‘= x+ dx , y‘= y + dy P‘= P + T – Um eine Linie zu verschieben brauchen wir nur die Endpunkte zu verschieben.Dies gilt auch für die Skalierung(Vergrößerung oder Verkleinerung) und Drehung. Formen der Transformationen in Graphikpaketen Skalieren (dehnen oder strecken): Es gibt zwei Skalierungsarten: – die uniforme oder gleichmäßige Skalierung,wo die Skalierungsfaktoren gleich sind,also sx = sy.Die Proportionen bleiben beim Objekt erhalten. – Skalierung mit unterschiedliche Skalierungsfaktoren sx sy x‘= sx * x ,y‘=sy * y Formen der Transformationen in Graphikpaketen Drehung: Punkte können um einen Winkel 0 um den Ursprung gedreht werden(Rotation). Einen Drehung wird mathematisch definiert durch die Gleichungen x‘ = x* cos q -y*sin q, y‘ = x* sin q + y * cos q oder P‘ = R * P, wobei R die Drehungsmatrix in Matrixgleichung ist.Wie die Skalierung bezieht sich auch die Drehung auf den Ursprung. Positive Winkel werden gegen den Uhrzeigersinn von x nach y gemessen.Für negative Winkel(Also im Uhrzeigersinn) können wir die Gleichungen mit Hilfe der Identitäten cos(-q)=cos q und sin(-q)=-sinq umschreiben. Formen der Transformationen in Graphikpaketen Wir können bei einer Überführung von P(x,y) um Winkel p in den Punkt P‘(x‘,y‘) leicht ableiten. Da wir um den Ursprung drehen, sind die Abstände von P und P‘ zum Ursprung gleich. x= r*cos p, y= r* sin p und x‘=r*cos(p +q)=r *cos q *cos p - r*sin q*sin p y‘=r*sin (p +q)=r* cos q*sin p + r*sin q*cos p Homogene Koordinaten und Matrizendarstellung von 2D-Transformationen Die Translation wird im vergleich zu Skalierung und Rotation auf eine andere Weise dargestellt.Man strebt zu einer einheitlichen Behandlung aller Transformationen,damit sie leichter kombiniert werden können. Dafür werden die Punkte in homogene Koordinaten ausgedrückt.Die Transformationen können über die Multiplikation behandelt werden. Homogene Koordinaten wurden zuerst in der Geometrie dargestellt und dann später auf die Graphik angewandt. Jeder Punkt bekommt eine dritte Koordinate. P(x,y,W) [ein Tripel] Homogene Koordinaten und Matrizendarstellung von 2D-Transformationen Homogene Punkte (x,y,W) und (x‘,y‘,w‘) sind genau dann gleich, wenn der eine Punkt das Vielfache des anderen ist. Ein Punkt hat daher viele Verschieden Darstellungen in homogenen Koordinaten.Sie stehen für Punkte im zweidimensionalen Raum. Eine der Koordinaten muss ungleich null sein.(0,0,0) ist nicht gültig. Wenn W ungleich null ist , so wird durch W normalerweise dividiert. Die Zahlen x/W und y/W sind die kartesischen Koordinaten des homogenen Punktes. Die Punkte mit W = 0 heissen Punkte im Unendlichen. Homogene Koordinaten und Matrizendarstellung von 2D-Transformationen Mit der Form (tx,ty,tW) mit t 0 erhalten Wir eine Gerade im 3D-Raum, daher steht jeder homogene Punkt für eine Gerade . Homogenisieren wir den Punkt(Division durch W) erhalten wir (x,y,1).Dieser Punkt bildet eine Ebene mit W=1 im (x,y,W)System. Punkte im unendlichen werden auf dieser Ebene nicht dargestellt. Die Punkte sind jetzt also dreielementige Spaltenvektoren. Die Transformationsmatrizen ,die bei der Multiplikation mit einem Punktvektor einen anderen Punktvektor liefern, haben die Grösse einer 3x3-Matrix. Konventionen & Transformationsmatrizen Um Zeilenvektoren von links an die Matrix zu und Spaltenvektoren von rechts zu an die Matrix zu multiplizieren werden die Matrizen transponiert. (P*M)T = MT * PT oder P‘=(T(dx,dy) *P Translation:Wenn ein Punkt P mit der Translationsmatrix T(dx1,dy1) nach P‘ verschoben wird und anschliessend mit T(dx2,dy2) setzt sich das Matrizenprodukt als Komposition additiv zusammen. Aufeinander folgende Skalierung sind multiplikativ. Aufeinander folgende Rotation sind additiv. Betrachtung der linken oberen 2x2-Teilmatrix bei der Rotation Jede der beiden Zeilen werden asl Vektor drei Eigenschaften zugewiesen. – 1. Beide sind Einheitsvektoren. – 2. Die beiden Vektoren stehen senkrecht aufeinander. – 3. Rotiert man die beiden Vektoren um R(P), so kommen sie auf die positive x- bzw y-Achse zu liegen(zusammen mit den Eigenschaften 1 und 2 ist dies äquivalent dazu, dass die Determinate der Teilmatrix den Wert 1 hat). Eine Matrix mit diesen Eigenschaften nennt man spezielle orthogonale Matrix. Ähnlichkeitstransformationen und affine Transformationen Diese Matrix erhält Längen und Winkel,sie werden Ähnlichkeitstransformationen genannt,da sie das Transformierte Objekt nicht verzerren. Durch eine beliebige Folge von Rotations- und Transformationsmatrizen entsteht eine Matrix dieser Form: [Platz für die Matrix:siehe Tafel!!] Ein Produkt einer beliebigen Folge von Rotations-,Translationsund Skalierungsmatrizen liefert eine affine Transformation. – Parallelität von Linien werden erhalten jedoch nicht die Längen und Winkel. – Zustäzliche Rotation,Skalierung und Translation erhalten die Parallelität. Die speziele affine Transformation: Scherung Der Term a bei SHx und der Term b bei SHy sind die Proportionaltätskonstanten. Zusammengesetzte zweidimensionale Transformationen Zusammengesetzte Transformationen sind effektiver, als wenn wir einzelne Transformationen nacheinander ausführen. Die Basismatrizen R,S und T werden kombiniert. Beispiel:(Rotation) – Verschiebe P1 zum Ursprung. – Rotiere. – Verschiebe so, dass der Punkt im Ursprung zu P1 zurückkehrt. Beispiel:(Skalierung ) – Verschiebe P1 zum Ursprung. – Skalieren – Verschiebe zurück zu P1 Effizienz Die allgemeinste Komposition von Rotation,Skalierung und Translation ergibt eine Matrix der Form: • Siehe Tafel: Die obere 2x2 Teilmatrix ist die zusammensetzung von Rotation und Skalierung und tx und ty sind die Komponenten der Translation. Da die letzte Zeile der Gleichung konstant ist, sind nur folgende Operationen nötig x‘ = x*r11+y*r12 +tx, y‘ = x*r21 +y*r22 +ty Effizienz Diese Matrix brauch also nur vier Multiplikationen und vier Additionen . Dies ist einen beträchtliche Beschleunigung,wenn man bedenkt, dass diese Operation pro Bild auf Hundert oder gar Tausende von Punkten angewandt wird. Umsetzung in Java: Die Klasse AffineTransform Konstruktor: – AffineTransform() – AffineTransform(AffineTransform Tx) – Erzeugt ein neues Objekt AffineTransform ,dass eine Kopie von der allgemeinen Matrix ist. – AffineTransform(double [ ] flatmatrix) Erzeugt ein neues AffineTransform-Objekt mit einem Feld von Doublewerten. 4 Einträgen repräsentieren die Transformation ohne Translation oder alle 6 die allgemeine Transformationsmatrix. – AffineTransform(double m00,double m10,double m01,double m11, double m02,double m12) Erzeugt ein neues Objekt AffineTransform von 6 spezifischen Doubelwerten,die die 6 Einträge in die allgemeinen Form darstellen.(Anlog mit Float) Methoden von AffineTransform public void getMatrix(double[ ] flatmatrix) – Übergibt 6 Werte in die 3x3-Matrix und plaziert sie in einem DoubleFeld. public static AffineTransform getRotateInstance (double theta) – Gibt eine Rotationstransformation zurück. public static AffineTransform getRotateInstance(double theta, double x,doubel y) – Gibt eine Rotationstransformation um einen beliebigen festen Punkt zurück public static AffineTransform(double sx,double sy) – Gibt eine Skalierungstransformation zurück. Methoden von der Klasse AffineTransform public doubel getScaleX(): – Gibt den Skalierungsfaktor in Richtung der X-Koordinate zurrück.Der Faktor steht bei der allgemeinen Transformationsmatrix an der Stelle (m00). (Analog Y-Koordinate) public static AffineTransform getTranslateInstance(double tx, double ty): – Gibt die Transformation für die Translation zurück. public double getTranslateX(): – Gibt die X-Koordinate der Translation ,das Element (m02) von der allgemeinen Transformationsmatrix zurück.(Analog Y-Koordinate) Methoden der Klasse AffineTransform void transform(double[ ] scrPts, int scrOff, double [ ] dstPts, int dstOff, int numPts) – Diese Methode transformiert ein Feld von Koordinaten.Diese Methode sichert ,das keine Quell-Daten von einer früheren Operation überschrieben wird,bevor die Quell-Daten transformiert sind. – Die Parameter: • scrPts : Dieses Feld beinhaltet die UrsprungsKoordinate. • dstPts : Dieses Feld beinhaltet die Zielkoordinaten • srcOff : Der Anfang des ersten Punktes der Quelle, der transformiert wird. • dstOff : Der Anfang des ersten Punktes des Zieles zu dem transponiert wird. • numPts- Die Nummer des transformierenden Punktes. Methoden der Klasse AffineTransform public void transform(double [ ]srcPts, int srcOff, float [ ] dstPts,int dstOff,int numPts) – Diese Methode transformiert ein Double-Feld und speichert das Ergebnis in ein Float-Feld. public void transform(float [ ]srcPts, int srcOff, double [ ] dstPts,int dstOff,int numPts) – Diese Methode transformiert ein Float-Feld und speichert das Ergebnis in ein Double-Feld. public void transform(float [ ]srcPts, int srcOff, float [ ] dstPts,int dstOff,int numPts)