Freigeben über


Globale und lokale Transformationen

Eine globale Transformation ist eine Transformation, die für jedes Element gilt, das von einem bestimmten Graphics-Objekt gezeichnet wird. Um eine globale Transformation zu erstellen, erstellen Sie ein Graphics-Objekt , und rufen Sie dann dessen Graphics::SetTransform-Methode auf. Die Graphics::SetTransform-Methode bearbeitet ein Matrix-Objekt , das dem Graphics-Objekt zugeordnet ist. Die in diesem Matrix-Objekt gespeicherte Transformation wird als Welttransformation bezeichnet. Die Welttransformation kann eine einfache affine Transformation oder eine komplexe Sequenz von affinen Transformationen sein, aber unabhängig von ihrer Komplexität wird die Welttransformation in einem einzigen Matrix-Objekt gespeichert.

Die Graphics-Klasse bietet mehrere Methoden zum Erstellen einer zusammengesetzten Welttransformation: Graphics::MultiplyTransform, Graphics::RotateTransform, Graphics::ScaleTransform und Graphics::TranslateTransform. Im folgenden Beispiel wird eine Ellipse zweimal gezeichnet: einmal vor dem Erstellen einer globalen Transformation und einmal danach. Die Transformation skaliert zunächst um einen Faktor von 0,5 in der Y-Richtung, führt dann eine Translation um 50 Einheiten in X-Richtung aus, und dreht das Element anschließend um 30 Grad.

myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1.0f, 0.5f);
myGraphics.TranslateTransform(50.0f, 0.0f, MatrixOrderAppend);
myGraphics.RotateTransform(30.0f, MatrixOrderAppend);
myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);

Die folgende Abbildung zeigt die ursprüngliche Ellipse und die transformierte Ellipse.

Screenshot eines Fensters, das zwei überlappende Auslassungspunkte enthält; eine ist schmaler und gedreht

Hinweis

Im vorherigen Beispiel wird die Ellipse um den Ursprung des Koordinatensystems gedreht, das sich in der oberen linken Ecke des Clientbereichs befindet. Dies erzeugt ein anderes Ergebnis als die Drehung der Ellipse um ihr eigenes Zentrum.

 

Eine lokale Transformation ist eine Transformation, die für ein bestimmtes zu zeichnende Element gilt. Ein GraphicsPath-Objekt verfügt beispielsweise über eine GraphicsPath::Transform-Methode , mit der Sie die Datenpunkte dieses Pfads transformieren können. Im folgenden Beispiel werden ein Rechteck ohne Transformation und ein Pfad mit einer Drehungstransformation gezeichnet. (Gehen Sie davon aus, dass es keine globale Transformation gibt.)

 
Matrix myMatrix;
myMatrix.Rotate(45.0f);
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 eine Vielzahl unterschiedlicher Ergebnisse zu erzielen. Sie können beispielsweise die globale Transformation verwenden, um das Koordinatensystem zu überarbeiten, und dann mit lokalen Transformationen Objekte drehen und skalieren, die in dem neuen Koordinatensystem gezeichnet werden.

Angenommen, Sie möchten ein Koordinatensystem erzeugen, dessen Ursprung 200 Pixel vom linken Rand des Clientbereichs und 150 Pixel vom oberen Rand des Clientbereichs entfernt liegt. Weiterhin angenommen, Sie möchten, dass die Maßeinheit Pixel sein soll, wobei die X-Achse nach rechts zeigt und die Y-Achse nach oben. 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.

Abbildung einer Drei-nach-Drei-Matrix

Angenommen, Sie müssen eine Translation von 200 Einheiten nach rechts und 150 Einheiten nach unten ausführen.

Im folgenden Beispiel wird das soeben beschriebene Koordinatensystem durch Festlegen der Welttransformation eines Graphics-Objekts eingerichtet.

Matrix myMatrix(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
myGraphics.SetTransform(&myMatrix);
myGraphics.TranslateTransform(200.0f, 150.0f, MatrixOrderAppend);

Mit dem folgenden Code (nach dem Code im vorherigen Beispiel) wird ein Pfad erstellt, der aus einem einzelnen Rechteck besteht, dessen untere linke Ecke am Ursprung des neuen Koordinatensystems liegt. 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 Drehung um 30 Grad.

// Create the path.
GraphicsPath myGraphicsPath;
Rect myRect(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRect);

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

// Transform the path.
Matrix myPathMatrix;
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrderAppend);
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.

Screenshot einer x- und y-Achse und eines blauen Quadrats, überlagert von einem halbtransparenten Rectagle, das um die linke untere Ecke gedreht wird