Transformations globales et locales
Une transformation globale s'applique à tous les éléments dessinés par un objet Graphics donné. En revanche, une transformation locale s'applique à un élément dessiné spécifique.
Transformations globales
Pour créer une transformation globale, vous construisez un objet Graphics, puis vous manipulez sa propriété Transform. La propriété Transform est un objet Matrix et peut donc contenir une séquence quelconque de transformations affines. La transformation stockée dans la propriété Transform est appelée transformation universelle. La classe Graphics fournit plusieurs méthodes pour construire une transformation universelle composite : MultiplyTransform, RotateTransform, ScaleTransform et TranslateTransform. L'exemple suivant montre comment dessiner deux fois une ellipse : une fois avant de créer une transformation universelle et une fois après. La transformation effectue tout d'abord une mise à l'échelle par un facteur 0,5 dans la direction y, puis une translation de 50 unités dans la direction x et enfin une rotation de 30 degrés.
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);
L'illustration suivante représente les matrices de cette transformation.
Notes
Dans l'exemple précédent, l'ellipse subit une rotation par rapport à l'origine du système de coordonnées (coin supérieur gauche de la zone cliente). Le résultat est différent de celui d'une rotation de l'ellipse autour de son propre centre.
Transformations locales
Une transformation locale s'applique à un élément dessiné spécifique. Par exemple, un objet GraphicsPath comprend une méthode Transform qui permet de transformer les points de données du tracé en question. L'exemple suivant dessine un rectangle sans transformation et un tracé avec une transformation de rotation. (Supposez qu'il n'y a aucune transformation universelle.)
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);
Il est possible de combiner la transformation universelle avec des transformations locales pour obtenir divers résultats. Par exemple, vous pouvez utiliser la transformation universelle pour réviser le système de coordonnées et des transformations locales pour faire pivoter et mettre à l'échelle des objets dessinés sur le nouveau système de coordonnées.
Supposons qu'il vous faut un système de coordonnées dont l'origine se trouve à 200 pixels du bord gauche de la zone cliente et à 150 pixels du bord supérieur de la zone cliente. D'autre part, vous voulez le pixel comme unité de mesure, un axe x qui pointe vers la droite et un axe y qui pointe vers le haut. Dans le système de coordonnées par défaut, l'axe y pointe vers le bas ; vous devez donc effectuer une réflexion par rapport à l'axe horizontal. L'illustration suivante représente la matrice de cette réflexion.
Supposons maintenant que vous deviez effectuer une translation de 200 unités vers la droite et de 150 unités vers le bas.
L'exemple suivant établit le système de coordonnées décrit précédemment en définissant la transformation universelle d'un objet Graphics.
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);
Le code suivant (placé à la fin de l'exemple précédent) crée un tracé constitué d'un rectangle dont le coin inférieur gauche se trouve sur l'origine du nouveau système de coordonnées. Ce rectangle est rempli une fois sans transformation locale et une fois avec une transformation locale. La transformation locale en question est une mise à l'échelle par un facteur 2 suivie d'une rotation de 30 degrés.
' 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);
L'illustration suivante représente le nouveau système de coordonnées et les deux rectangles.