Globale und lokale Transformationen

Aktualisiert: November 2007

Eine globale Transformation ist eine Transformation, die für jedes Element gilt, das von einem bestimmten Graphics-Objekt gezeichnet wird. Eine lokale Transformation ist dagegen eine Transformation, die für ein bestimmtes zu zeichnendes Element gilt.

Globale Transformationen

Um eine globale Transformation zu erstellen, konstruieren Sie ein Graphics-Objekt und bearbeiten dann dessen Transform-Eigenschaft. Die Transform-Eigenschaft ist ein Matrix-Objekt und kann daher eine beliebige Folge von affinen Transformationen speichern. Die in der Transform-Eigenschaft gespeicherte Transformation wird als globale Transformation bezeichnet. Die Graphics-Klasse stellt mehrere Methoden zum Erstellen einer zusammengesetzten globalen Transformation bereit: MultiplyTransform, RotateTransform, ScaleTransform und TranslateTransform. Im folgenden Beispiel wird eine Ellipse zweimal gezeichnet: einmal vor dem Erstellen einer globalen Transformation und einmal danach. Die Transformation führt zuerst eine Skalierung um den Faktor 0,5 in y‑Richtung aus, dann eine Verschiebung um 50 Einheiten in x‑Richtung und anschließend eine Drehung um 30 Grad.

myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)
myGraphics.ScaleTransform(1, 0.5F)
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append)
myGraphics.RotateTransform(30, MatrixOrder.Append)
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50)

myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1, 0.5f);
myGraphics.TranslateTransform(50, 0, MatrixOrder.Append);
myGraphics.RotateTransform(30, MatrixOrder.Append);
myGraphics.DrawEllipse(myPen, 0, 0, 100, 50);

Die folgende Abbildung zeigt die bei der Transformation verwendeten Matrizen.

Hinweis:

Im obigen Beispiel wird die Ellipse um den Ursprung des Koordinatensystems herum gedreht. Dieser befindet sich in der linken oberen Ecke des Clientbereichs. Dies führt zu einem anderen Ergebnis als das Drehen der Ellipse um ihren Mittelpunkt.

Lokale Transformationen

Eine lokale Transformation gilt für ein bestimmtes zu zeichnendes Element. Beispielsweise hat ein GraphicsPath-Objekt eine Transform-Methode, mit der Sie die Datenpunkte dieses Pfades transformieren können. Im folgenden Beispiel wird ein Rechteck ohne Transformation und ein Pfad mit einer Drehungstransformation gezeichnet. (Eine globale Transformation ist nicht vorhanden.)

Dim myMatrix As New Matrix()
myMatrix.Rotate(45)
myGraphicsPath.Transform(myMatrix)
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50)
myGraphics.DrawPath(myPen, myGraphicsPath)

Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);

Sie können die globale Transformation mit lokalen Transformationen kombinieren, um verschiedenste Ergebnisse zu erzielen. Beispielsweise können Sie mithilfe der globalen Transformation das Koordinatensystem ändern und mit lokalen Transformationen Objekte, die in dem neuen Koordinatensystem gezeichnet wurden, drehen und skalieren.

Angenommen, der Ursprung eines Koordinatensystems soll 200 Pixel vom linken Rand des Clientbereichs entfernt und 150 Pixel vom oberen Rand des Clientbereichs entfernt liegen. Nehmen wir weiter an, dass Sie Pixel als Maßeinheit verwenden möchten, wobei die x‑Achse nach rechts und die y‑Achse nach oben zeigt. Beim Standardkoordinatensystem zeigt die y‑Achse nach unten, sodass Sie eine Spiegelung entlang der horizontalen Achse durchführen müssen. Die folgende Abbildung zeigt die Matrix für eine solche Spiegelung.

Nehmen wir als Nächstes an, Sie müssen eine Verschiebung um 200 Einheiten nach rechts und 150 Einheiten nach unten durchführen.

Im folgenden Beispiel wird das oben beschriebene Koordinatensystem durch Festlegen der globalen Transformation eines Graphics-Objekts erstellt.

Dim myMatrix As New Matrix(1, 0, 0, -1, 0, 0)
myGraphics.Transform = myMatrix
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append)

Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0);
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);

Der folgende Code (am Ende des vorherigen Beispiels platziert) erstellt einen Pfad, der aus einem einzigen Rechteck besteht, dessen linke untere Ecke sich im Ursprung des neuen Koordinatensystems befindet. Das Rechteck wird einmal ohne lokale Transformation und einmal mit lokaler Transformation gefüllt. Die lokale Transformation umfasst eine horizontale Skalierung um den Faktor 2 und eine Drehung um 30 Grad.

' Create the path.
Dim myGraphicsPath As New GraphicsPath()
Dim myRectangle As New Rectangle(0, 0, 60, 60)
myGraphicsPath.AddRectangle(myRectangle)

' Fill the path on the new coordinate system.
' No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath)

' Set the local transformation of the GraphicsPath object.
Dim myPathMatrix As New Matrix()
myPathMatrix.Scale(2, 1)
myPathMatrix.Rotate(30, MatrixOrder.Append)
myGraphicsPath.Transform(myPathMatrix)

' Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath)

// Create the path.
GraphicsPath myGraphicsPath = new GraphicsPath();
Rectangle myRectangle = new Rectangle(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRectangle);

// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(mySolidBrush1, myGraphicsPath);

// Set the local transformation of the GraphicsPath object.
Matrix myPathMatrix = new Matrix();
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrder.Append);
myGraphicsPath.Transform(myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(mySolidBrush2, myGraphicsPath);

Die folgende Abbildung zeigt das neue Koordinatensystem und die beiden Rechtecke.

Siehe auch

Weitere Ressourcen

Koordinatensysteme und Transformationen

Verwenden von Transformationen in Managed GDI+