Importance de l'ordre des transformations
Un seul objet Matrix peut stocker une seule transformation ou une succession de transformations. Celle-ci est appelée transformation composite. La matrice d'une transformation composite s'obtient en multipliant les matrices des différentes transformations.
Exemples de transformations composites
Dans une transformation de ce type, l'ordre des diverses transformations constitue un aspect important. Par exemple, si vous effectuez d'abord une rotation, puis une mise à l'échelle, puis une translation, le résultat obtenu n'est pas le même que si vous commencez par appliquer une translation, puis une rotation, puis une mise à l'échelle. Dans GDI+, les transformations composites sont construites de gauche à droite. Si S, R et T représentent respectivement des matrices de mise à l'échelle, de rotation et de translation, le produit SRT (dans cet ordre) représente alors la matrice de la transformation composite qui commence par mettre à l'échelle, puis fait pivoter et effectue la translation. La matrice engendrée par le produit SRT est différente de celle qu'engendre le produit TRS.
L'une des raisons qui explique l'importance de l'ordre provient du fait que les transformations comme la rotation et la mise à l'échelle s'effectuent par rapport à l'origine du système de coordonnées. La mise à l'échelle d'un objet centré à l'origine ne produit pas le même résultat que la mise à l'échelle d'un objet qui a été éloigné de l'origine. De même, la rotation d'un objet centré à l'origine ne produit pas le même résultat que la rotation d'un objet qui a été éloigné de l'origine.
L'exemple suivant combine une mise à l'échelle, une rotation et une translation (dans cet ordre) pour constituer une transformation composite. L'argument Append passé à la méthode RotateTransform indique que la rotation suivra la mise à l'échelle. De même, l'argument Append passé à la méthode TranslateTransform indique que la translation suivra la rotation. Append et Prepend sont des membres de l'énumération MatrixOrder.
Dim rect As New Rectangle(0, 0, 50, 50)
Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
e.Graphics.ResetTransform()
e.Graphics.ScaleTransform(1.75F, 0.5F)
e.Graphics.RotateTransform(28, MatrixOrder.Append)
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append)
e.Graphics.DrawRectangle(pen, rect)
Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.DrawRectangle(pen, rect);
L'exemple suivant utilise les mêmes appels de méthode que dans l'exemple précédent, mais l'ordre des appels y est inversé. L'ordre des opérations qui en résulte, à savoir translation pour commencer, puis rotation et mise à l'échelle, produit un résultat très différent de celui obtenu en effectuant d'abord une mise à l'échelle, puis une rotation et une translation.
Dim rect As New Rectangle(0, 0, 50, 50)
Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
e.Graphics.ResetTransform()
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append)
e.Graphics.RotateTransform(28, MatrixOrder.Append)
e.Graphics.ScaleTransform(1.75F, 0.5F)
e.Graphics.DrawRectangle(pen, rect)
Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Append);
e.Graphics.RotateTransform(28, MatrixOrder.Append);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);
Il existe une manière d'inverser l'ordre des différentes transformations comprises dans une transformation composite qui consiste à inverser l'ordre d'une suite d'appels de méthode. Il existe une autre façon de contrôler l'ordre des opérations. Elle consiste à modifier l'argument pour l'ordre des matrices. L'exemple suivant est identique à l'exemple précédent, mais Append a été transformé en Prepend. La multiplication des matrices s'effectue dans l'ordre SRT, dans lequel S, R et T correspondent respectivement aux matrices de mise à l'échelle, de rotation et de translation. La transformation composite effectue d'abord une mise à l'échelle, puis une rotation et enfin une translation.
Dim rect As New Rectangle(0, 0, 50, 50)
Dim pen As New Pen(Color.FromArgb(128, 200, 0, 200), 2)
e.Graphics.ResetTransform()
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Prepend)
e.Graphics.RotateTransform(28, MatrixOrder.Prepend)
e.Graphics.ScaleTransform(1.75F, 0.5F)
e.Graphics.DrawRectangle(pen, rect)
Rectangle rect = new Rectangle(0, 0, 50, 50);
Pen pen = new Pen(Color.FromArgb(128, 200, 0, 200), 2);
e.Graphics.ResetTransform();
e.Graphics.TranslateTransform(150, 150, MatrixOrder.Prepend);
e.Graphics.RotateTransform(28, MatrixOrder.Prepend);
e.Graphics.ScaleTransform(1.75f, 0.5f);
e.Graphics.DrawRectangle(pen, rect);
Le résultat produit par l'exemple précédent est identique à celui produit par le premier exemple de cette rubrique. Cela provient du fait que l'ordre des appels de méthode et celui de la multiplication des matrices ont tous deux été inversés.