Transformations globales et locales
Une transformation globale est une transformation qui s’applique à chaque élément dessiné par un objet Graphics donné. Pour créer une transformation globale, construisez un objet Graphics , puis appelez sa méthode Graphics::SetTransform . La méthode Graphics::SetTransform manipule un objet Matrix associé à l’objet Graphics . La transformation stockée dans cet objet Matrix est appelée transformation du monde. La transformation du monde peut être une simple transformation affine ou une séquence complexe de transformations affines, mais quelle que soit sa complexité, la transformation de monde est stockée dans un seul objet Matrix .
La classe Graphics fournit plusieurs méthodes pour créer une transformation de monde composite : Graphics::MultiplyTransform, Graphics::RotateTransform, Graphics::ScaleTransform et Graphics::TranslateTransform. L’exemple suivant dessine une ellipse deux fois : une fois avant de créer une transformation de monde et une fois après. La transformation est d’abord mise à l’échelle d’un facteur de 0,5 dans la direction y, traduit 50 unités dans la direction x, puis pivote de 30 degrés.
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);
L’illustration suivante montre l’ellipse d’origine et l’ellipse transformée.
Notes
Dans l’exemple précédent, l’ellipse est pivotée autour de l’origine du système de coordonnées, qui se trouve dans l’angle supérieur gauche de la zone cliente. Cela produit un résultat différent de la rotation de l’ellipse autour de son propre centre.
Une transformation locale est une transformation qui s’applique à un élément spécifique à dessiner. Par exemple, un objet GraphicsPath a une méthode GraphicsPath::Transform qui vous permet de transformer les points de données de ce chemin. L’exemple suivant dessine un rectangle sans transformation et un chemin avec une transformation de rotation. (Supposons qu’il n’y ait pas de transformation du monde.)
Matrix myMatrix;
myMatrix.Rotate(45.0f);
myGraphicsPath.Transform(&myMatrix);
myGraphics.DrawRectangle(&myPen, 10, 10, 100, 50);
myGraphics.DrawPath(&myPen, &myGraphicsPath);
Vous pouvez combiner la transformation mondiale avec des transformations locales pour obtenir divers résultats. Par exemple, vous pouvez utiliser la transformation mondiale pour réviser le système de coordonnées et utiliser des transformations locales pour faire pivoter et mettre à l’échelle des objets dessinés sur le nouveau système de coordonnées.
Supposons que vous souhaitiez un système de coordonnées dont l’origine est située à 200 pixels du bord gauche de la zone cliente et à 150 pixels du haut de la zone cliente. En outre, supposons que vous souhaitez que l’unité de mesure soit le pixel, l’axe X pointant vers la droite et l’axe y pointant vers le haut. Le système de coordonnées par défaut a l’axe Y pointant vers le bas. Vous devez donc effectuer une réflexion sur l’axe horizontal. L’illustration suivante montre la matrice d’une telle réflexion.
Ensuite, supposons que vous deviez effectuer une traduction de 200 unités à droite et de 150 unités vers le bas.
L’exemple suivant établit le système de coordonnées que vous venez de décrire en définissant la transformation du monde d’un objet Graphics .
Matrix myMatrix(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
myGraphics.SetTransform(&myMatrix);
myGraphics.TranslateTransform(200.0f, 150.0f, MatrixOrderAppend);
Le code suivant (placé après le code de l’exemple précédent) crée un chemin qui se compose d’un rectangle unique avec son coin inférieur gauche à l’origine du nouveau système de coordonnées. Le rectangle est rempli une fois sans transformation locale et une fois avec une transformation locale. La transformation locale se compose d’une mise à l’échelle horizontale d’un facteur de 2 suivie d’une rotation de 30 degrés.
// 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);
L’illustration suivante montre le nouveau système de coordonnées et les deux rectangles.