Partager via


Importance de l'ordre des transformations

Un objet Matrix unique peut stocker une seule transformation ou une séquence de transformations. Cette dernière est appelée transformationcomposite. La matrice d’une transformation composite est obtenue en multipliant les matrices des transformations individuelles.

Dans une transformation composite, l’ordre des transformations individuelles est important. Par exemple, si vous commencez par faire pivoter, mettre à l’échelle, puis traduire, vous obtenez un résultat différent de celui que vous obtenez si vous commencez par traduire, puis faire pivoter, puis mettre à l’échelle. Dans Windows GDI+, les transformations composites sont générées de gauche à droite. Si S, R et T sont respectivement des matrices d’échelle, de rotation et de traduction, le produit SRT (dans cet ordre) est la matrice de la transformation composite qui commence par mettre à l’échelle, puis pivote, puis traduit. La matrice produite par le produit SRT est différente de la matrice produite par le produit TRS.

L’une des raisons pour lesquelles l’ordre est important est que des transformations telles que la rotation et la mise à l’échelle sont effectuées par rapport à l’origine du système de coordonnées. La mise à l’échelle d’un objet centré à l’origine produit un résultat différent de la mise à l’échelle d’un objet qui a été déplacé loin de l’origine. De même, la rotation d’un objet centré à l’origine produit un résultat différent de la rotation d’un objet qui a été déplacé loin de l’origine.

L’exemple suivant combine la mise à l’échelle, la rotation et la traduction (dans cet ordre) pour former une transformation composite. L’argument MatrixOrderAppend passé à la méthode Graphics::RotateTransform spécifie que la rotation suivra la mise à l’échelle. De même, l’argument MatrixOrderAppend passé à la méthode Graphics::TranslateTransform spécifie que la traduction suivra la rotation.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.ScaleTransform(1.75f, 0.5f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.TranslateTransform(150.0f, 150.0f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

L’exemple suivant effectue les mêmes appels de méthode que l’exemple précédent, mais l’ordre des appels est inversé. L’ordre des opérations résultant est d’abord traduire, puis pivoter, puis mettre à l’échelle, ce qui produit un résultat très différent de la première mise à l’échelle, puis pivoter, puis traduire :

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f);
graphics.RotateTransform(28.0f, MatrixOrderAppend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderAppend);
graphics.DrawRectangle(&pen, rect);

Une façon d’inverser l’ordre des transformations individuelles dans une transformation composite consiste à inverser l’ordre d’une séquence d’appels de méthode. Une deuxième façon de contrôler l’ordre des opérations consiste à modifier l’argument d’ordre de matrice. L’exemple suivant est le même que l’exemple précédent, sauf que MatrixOrderAppend a été remplacé par MatrixOrderPrepend. La multiplication de matrice est effectuée dans l’ordre SRT, où S, R et T sont les matrices pour la mise à l’échelle, la rotation et la traduction, respectivement. L’ordre de la transformation composite est d’abord mis à l’échelle, puis pivoter, puis traduire.

Rect rect(0, 0, 50, 50);
Pen pen(Color(255, 255, 0, 0), 0);
graphics.TranslateTransform(150.0f, 150.0f,MatrixOrderPrepend);
graphics.RotateTransform(28.0f, MatrixOrderPrepend);
graphics.ScaleTransform(1.75f, 0.5f, MatrixOrderPrepend);
graphics.DrawRectangle(&pen, rect);

Le résultat de l’exemple précédent est le même que celui obtenu dans le premier exemple de cette section. Cela est dû au fait que nous avons inversé à la fois l’ordre des appels de méthode et l’ordre de la multiplication de matrice.