Représentation matricielle des transformations
Une matrice m×n est un ensemble de nombres disposés en m lignes et n colonnes. L’illustration suivante montre plusieurs matrices.
Vous pouvez ajouter deux matrices de la même taille en ajoutant des éléments individuels. L’illustration suivante montre deux exemples d’ajout de matrice.
Une matrice m×n peut être multipliée par une matrice n×p , et le résultat est une matrice m×p . Le nombre de colonnes dans la première matrice doit être identique au nombre de lignes de la deuxième matrice. Par exemple, une matrice 4 ×2 peut être multipliée par une matrice 2 ×3 pour produire une matrice 4 ×3.
Les points dans le plan et les lignes et colonnes d’une matrice peuvent être considérés comme des vecteurs. Par exemple, (2, 5) est un vecteur avec deux composants et (3, 7, 1) est un vecteur à trois composants. Le produit dot de deux vecteurs est défini comme suit :
(a, b) • (c, d) = ac + bd
(a, b, c) • (d, e, f) = ad + be + cf
Par exemple, le produit point de (2, 3) et (5, 4) est (2)(5) + (3)(4) = 22. Le produit point de (2, 5, 1) et (4, 3, 1) est (2)(4) + (5)(3) + (1)(1) = 24. Notez que le produit point de deux vecteurs est un nombre, et non un autre vecteur. Notez également que vous pouvez calculer le produit point uniquement si les deux vecteurs ont le même nombre de composants.
Que A(i, j) soit l’entrée de la matrice A dans lai ième ligne et la jth colonne. Par exemple, A(3, 2) est l’entrée de la matrice A dans la3e ligne et la colonne 2ième . Supposons que A, B et C soient des matrices, et AB = C. Les entrées de C sont calculées comme suit :
C(i, j) = (ligne i de A) • (colonne j de B)
L’illustration suivante montre plusieurs exemples de multiplication matricielle.
Si vous considérez un point dans le plan comme une matrice 1 × 2, vous pouvez transformer ce point en le multipliant par une matrice 2 × 2. L’illustration suivante montre plusieurs transformations appliquées au point (2, 1).
Toutes les transformations illustrées dans la figure précédente sont des transformations linéaires. Certaines autres transformations, telles que la traduction, ne sont pas linéaires et ne peuvent pas être exprimées en multiplication par une matrice 2 × 2. Supposons que vous souhaitiez commencer par le point (2, 1), le faire pivoter de 90 degrés, le traduire 3 unités dans le sens x et le traduire 4 unités dans le sens y. Pour ce faire, effectuez une multiplication de matrice suivie d’un ajout de matrice.
Une transformation linéaire (multiplication par une matrice 2 × 2) suivie d’une traduction (ajout d’une matrice 1 × 2) est appelée transformation affine. Une alternative au stockage d’une transformation affine dans une paire de matrices (une pour la partie linéaire et l’autre pour la traduction) consiste à stocker la transformation entière dans une matrice 3 × 3. Pour que cela fonctionne, un point du plan doit être stocké dans une matrice 1 × 3 avec une coordonnée factice 3e. La technique habituelle consiste à rendre toutes les 3e coordonnées égales à 1. Par exemple, le point (2, 1) est représenté par la matrice [2 1 1]. L’illustration suivante montre une transformation affine (pivoter de 90 degrés ; traduire 3 unités dans la direction x, 4 unités dans le sens y) exprimée en multiplication par une seule matrice 3 × 3.
Dans l’exemple précédent, le point (2, 1) est mappé au point (2, 6). Notez que la troisième colonne de la matrice 3 × 3 contient les nombres 0, 0, 1. Ce sera toujours le cas pour la matrice 3 × 3 d’une transformation affine. Les nombres importants sont les six nombres des colonnes 1 et 2. La partie supérieure gauche 2 × 2 de la matrice représente la partie linéaire de la transformation, et les deux premières entrées de la 3e ligne représentent la traduction.
Dans Windows GDI+, vous pouvez stocker une transformation affine dans un objet Matrix . Étant donné que la troisième colonne d’une matrice qui représente une transformation affine est toujours (0, 0, 1), vous spécifiez uniquement les six nombres dans les deux premières colonnes lorsque vous construisez un objet Matrix . L’instruction Matrix myMatrix(0.0f, 1.0f, -1.0f, 0.0f, 3.0f, 4.0f);
construit la matrice illustrée dans la figure précédente.
Transformations composites
Une transformation composite est une séquence de transformations, l’une suivie de l’autre. Considérez les matrices et les transformations de la liste suivante :
- Matrice A Pivoter de 90 degrés
- Matrice B Mettre à l’échelle d’un facteur 2 dans la direction x
- Matrice C Traduire 3 unités dans la direction y
Si vous commencez par le point (2, 1) ( représenté par la matrice [2 1 1] – et que vous multipliez par A, puis B, puis C, le point (2,1) subira les trois transformations dans l’ordre indiqué.
[2 1 1] ABC = [-2 5 1]
Au lieu de stocker les trois parties de la transformation composite dans trois matrices distinctes, vous pouvez multiplier A, B et C ensemble pour obtenir une matrice 3 × 3 qui stocke la transformation composite entière. Supposons QUE ABC = D. Ensuite, un point multiplié par D donne le même résultat qu’un point multiplié par A, puis B, puis C.
[2 1 1] D = [ –2 5 1]
L’illustration suivante montre les matrices A, B, C et D.
Le fait que la matrice d’une transformation composite puisse être formée en multipliant les matrices de transformation individuelles signifie que toute séquence de transformations affines peut être stockée dans un seul objet Matrix .
Notes
L’ordre d’une transformation composite est important. En général, la rotation, la mise à l’échelle, puis la traduction ne sont pas identiques à la mise à l’échelle, puis à la rotation, puis à la traduction. De même, l’ordre de multiplication matricielle est important. En général, ABC n’est pas identique à BAC.
La classe Matrix fournit plusieurs méthodes pour créer une transformation composite : Matrix::Multiply, Matrix::Rotate, Matrix::RotateAt, Matrix::Scale, Matrix::Shear et Matrix::Translate. L’exemple suivant crée la matrice d’une transformation composite qui effectue d’abord une rotation de 30 degrés, puis une mise à l’échelle d’un facteur 2 dans le sens y, puis traduit 5 unités dans la direction x.
Matrix myMatrix;
myMatrix.Rotate(30.0f);
myMatrix.Scale(1.0f, 2.0f, MatrixOrderAppend);
myMatrix.Translate(5.0f, 0.0f, MatrixOrderAppend);
L’illustration suivante montre la matrice.