Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine globale Transformation ist eine Transformation, die für jedes Element gilt, das von einem bestimmten Graphics-Objekt gezeichnet wird. Im Gegensatz dazu ist eine lokale Transformation eine Transformation, die für ein bestimmtes Element gilt, das gezeichnet werden soll.
Globale Transformationen
Um eine globale Transformation zu erstellen, erstellen Sie ein Graphics-Objekt, und bearbeiten Sie dann die Transform-Eigenschaft. Die Transform-Eigenschaft ist ein Matrix-Objekt, sodass sie eine beliebige Sequenz von affinen Transformationen enthalten kann. Die in der Transform-Eigenschaft gespeicherte Transformation wird als Welttransformation bezeichnet. Die Graphics-Klasse bietet mehrere Methoden zum Aufbau einer zusammengesetzten globalen Transformation: 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 skaliert zuerst um den Faktor 0,5 in y-Richtung, übersetzt dann 50 Einheiten in x-Richtung und dreht dann 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 Matrizen, die an der Transformation beteiligt sind.
Hinweis
Im vorherigen Beispiel wird die Ellipse um den Ursprung des Koordinatensystems gedreht, der sich in der oberen linken Ecke des Clientbereichs befindet. Dies führt zu einem anderen Ergebnis als das Drehen der Ellipse um ihr eigenes Zentrum.
Lokale Transformationen
Eine lokale Transformation gilt für ein bestimmtes Element, das gezeichnet werden soll. Ein GraphicsPath-Objekt verfügt beispielsweise über eine Transform Methode, mit der Sie die Datenpunkte dieses Pfads transformieren können. Das folgende Beispiel zeichnet ein Rechteck ohne Transformation und einen Pfad mit einer Drehungstransformation. (Gehen Sie davon aus, dass es keine Welttransformation gibt.)
Matrix myMatrix = new Matrix();
myMatrix.Rotate(45);
myGraphicsPath.Transform(myMatrix);
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50);
myGraphics.DrawPath(myPen, myGraphicsPath);
Dim myMatrix As New Matrix()
myMatrix.Rotate(45)
myGraphicsPath.Transform(myMatrix)
myGraphics.DrawRectangle(myPen, 10, 10, 100, 50)
myGraphics.DrawPath(myPen, myGraphicsPath)
Sie können die Welttransformation mit lokalen Transformationen kombinieren, um eine Vielzahl von Ergebnissen zu erzielen. Beispielsweise können Sie die Welttransformation verwenden, um das Koordinatensystem zu überarbeiten und lokale Transformationen zu verwenden, um Objekte zu drehen und zu skalieren, die im neuen Koordinatensystem gezeichnet wurden.
Angenommen, Sie möchten ein Koordinatensystem generieren, dessen Ursprung 200 Pixel vom linken Rand des Clientbereichs und 150 Pixel vom oberen Rand des Clientbereichs entfernt liegt. Gehen Sie außerdem davon aus, dass die Maßeinheit das Pixel sein soll, wobei die x-Achse nach rechts und die Y-Achse nach oben zeigt. Beim Standardkoordinatensystem zeigt die y-Achse nach unten, weshalb Sie eine Spiegelung an der horizontalen Achse vornehmen müssen. Die folgende Abbildung zeigt die Matrix einer solchen Spiegelung.
Angenommen, Sie müssen nun eine Translation von 200 Einheiten nach rechts und 150 Einheiten nach unten ausführen.
Im folgenden Beispiel wird das gerade beschriebene Koordinatensystem erstellt, indem die globale Transformation eines Graphics-Objekts festgelegt wird.
Matrix myMatrix = new Matrix(1, 0, 0, -1, 0, 0);
myGraphics.Transform = myMatrix;
myGraphics.TranslateTransform(200, 150, MatrixOrder.Append);
Dim myMatrix As 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 einzelnen Rechteck mit seiner unteren linken Ecke am Ursprung des neuen Koordinatensystems besteht. Das Rechteck wird einmal ohne lokale Transformation und einmal mit einer lokalen Transformation gefüllt. Die lokale Transformation besteht aus einer horizontalen Skalierung um einen Faktor von 2, gefolgt von einer 30-Grad-Drehung.
// 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);
' 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)
Die folgende Abbildung zeigt das neue Koordinatensystem und die beiden Rechtecke.
Siehe auch
.NET Desktop feedback