Partager via


Annexe : Transformations matricielles

Cette rubrique fournit une vue d’ensemble mathématique des transformations de matrice pour les graphiques 2D. Toutefois, vous n’avez pas besoin de connaître les mathématiques matricielles pour utiliser des transformations dans Direct2D. Lisez cette rubrique si vous êtes intéressé par les mathématiques ; sinon, n’hésitez pas à ignorer cette rubrique.

Présentation des matrices

Une matrice est un tableau rectangulaire de nombres réels. L’ordre de la matrice est le nombre de lignes et de colonnes. Par exemple, si la matrice a 3 lignes et 2 colonnes, l’ordre est de 3 × 2. Les matrices sont généralement affichées avec les éléments de matrice placés entre crochets :

3 x 2 matrices.

Notation : une matrice est désignée par une lettre majuscule. Les éléments sont désignés par des lettres minuscules. Les indices indiquent le numéro de ligne et de colonne d’un élément. Par exemple, unij est l’élément au niveau de l’i’ième ligne et de la j’ième colonne de la matrice A.

Le diagramme suivant montre une matrice i × j, avec les éléments individuels dans chaque cellule de la matrice.

matrice avec i rows et j colonnes.

Opérations de matrice

Cette section décrit les opérations de base définies sur les matrices.

Ajout. La somme A + B de deux matrices est obtenue en ajoutant les éléments correspondants de A et B :

A + B = \[ a*ij* \] + \[ b*ij* \] = \[ a*ij* + b*ij* \]

Multiplication scalaire. Cette opération multiplie une matrice par un nombre réel. Avec un nombre réel k, le produit scalaire kA est obtenu en multipliant chaque élément de A par k.

kA = k\[ a*ij* \] = \[ k × a*ij* \]

Multiplication matricielle. Avec deux matrices A et B avec ordre (m × n) et (n × p), le produit C = A × B est une matrice avec ordre (m × p), défini comme suit :

Affiche une formule pour la multiplication matricielle.

ou, de manière équivalente :

c*ij* = a*i*1 x b1*j* + a*i*2 x b2*j* + ... + a*in* + b*nj*

Autrement dit, pour calculer chaque élément cij, procédez comme suit :

  1. Prenez la i’ième ligne de A et la j’ième colonne de B.
  2. Multipliez chaque paire d’éléments dans la ligne et la colonne : la première entrée de ligne par la première entrée de colonne, la deuxième entrée de ligne par la deuxième entrée de colonne, et ainsi de suite.
  3. Additionnez le résultat.

Voici un exemple de multiplication d’une matrice (2 × 2) par une matrice (2 × 3).

multiplication matricielle.

La multiplication matricielle n’est pas commutative. Autrement dit, A × B ≠ B × A. En outre, d’après la définition, il s’ensuit que toutes les paires de matrices ne peuvent pas être multipliées. Le nombre de colonnes dans la matrice de gauche doit être égal au nombre de lignes dans la matrice de droite. Sinon, l’opérateur × n’est pas défini.

Identifiez la matrice. Une matrice d’identité, désignée I, est une matrice carrée définie comme suit :

I*ij* = 1 si *i* = *j*, ou 0 sinon.

En d’autres termes, une matrice d’identité contient 1 pour chaque élément où le numéro de ligne est égal au numéro de colonne et zéro pour tous les autres éléments. Par exemple, voici la matrice d’identité 3 × 3.

matrice d’identité.

Les égalités suivantes se conservent pour n’importe quelle matrice M.

M x I = M I x M = M

Transformations affines

Une transformation affine est une opération mathématique qui mappe un espace de coordonnées à un autre. En d’autres termes, il mappe un ensemble de points à un autre ensemble de points. Les transformations affine ont certaines fonctionnalités qui les rendent utiles dans l’infographie.

  • Les transformations affines préservent la collinearité. Si trois points ou plus tombent sur une ligne, ils forment toujours une ligne après la transformation. Les lignes droites restent droites.
  • La composition de deux transformations affines est une transformation affine.

Les transformations affine pour l’espace 2D ont la forme suivante.

Montre une transformation affine pour l’espace 2D.

Si vous appliquez la définition de la multiplication de matrice donnée précédemment, vous pouvez montrer que le produit de deux transformations affines est une autre transformation affine. Pour transformer un point 2D à l’aide d’une transformation affine, le point est représenté sous la forme d’une matrice 1 × 3.

P = \| x y 1 \|

Les deux premiers éléments contiennent les coordonnées x et y du point. Le 1 est placé dans le troisième élément pour que les mathématiques fonctionnent correctement. Pour appliquer la transformation, multipliez les deux matrices comme suit.

P' = P × M

Ceci se développe comme suit.

affine transformer.

where

x' = ax + cy + e y' = bx + dy + f

Pour obtenir le point transformé, prenez les deux premiers éléments de la matrice P'.

p = (x', y') = (ax + cy + e, bx + dy + f)

Notes

Une matrice 1 × n est appelée vecteur de ligne. Direct2D et Direct3D utilisent des vecteurs de ligne pour représenter des points dans un espace 2D ou 3D. Vous pouvez obtenir un résultat équivalent en utilisant un vecteur de colonne (n × 1) et en transposant la matrice de transformation. La plupart des textes graphiques utilisent la forme vectorielle de colonne. Cette rubrique présente la forme vectorielle de ligne pour la cohérence avec Direct2D et Direct3D.

 

Les différentes sections suivantes dérivent les transformations de base.

Transformation de traduction

La matrice de transformation de traduction se présente sous la forme suivante.

transformation de traduction.

L’insertion d’un point P dans cette équation donne les résultats suivants :

P' = (*x* + *dx*, *y* + *dy*)

qui correspond au point (x, y) traduit par dx dans l’axe X et dy dans l’axe Y.

diagramme qui montre la traduction de deux points.

Mise à l’échelle de la transformation

La matrice de transformation de mise à l’échelle se présente sous la forme suivante.

transformation de mise à l’échelle.

L’insertion d’un point P dans cette équation donne les résultats suivants :

P' = (*x* • *dx*, *y* • *dy*)

qui correspond au point (x,y) mis à l’échelle par dx et dy.

diagramme qui montre la mise à l’échelle de deux points.

Rotation autour de l’origine

La matrice permettant de faire pivoter un point autour de l’origine a la forme suivante.

Affiche une formule pour une transformation de rotation.

Le point transformé est :

P' = (*x*cosΘ – ysinΘ, *x*sinΘ + *y*cosΘ)

Preuve. Pour montrer que P' représente une rotation, considérez le diagramme suivant.

diagramme qui montre la rotation autour de l’origine.

Soit :

P = (x,y)

Point d’origine à transformer.

Φ

Angle formé par la ligne (0,0) à P.

Θ

Angle de rotation (x,y) par rapport à l’origine.

P' = (x',y')

Point transformé.

R

Longueur de la ligne (0,0) à P. Également le rayon du cercle de rotation.

Notes

Ce diagramme utilise le système de coordonnées standard utilisé dans geometry, où l’axe y positif pointe vers le haut. Direct2D utilise le système de coordonnées Windows, où l’axe y positif pointe vers le bas.

 

L’angle entre l’axe X et la ligne (0,0) à P' est Φ + Θ. Les identités suivantes contiennent :

x = R cosΦ y = R sinΦ x' = R cos(Φ + Θ) y' = R sin(Φ+ Θ)

Résolvez maintenant x' et y' en termes de Θ. Par les formules d’addition trigonométrique :

x' = R(cosΦcosΘ – sinΦsinΘ) = RcosΦcosΘ – RsinΦsinΘ y' = R(sinΦcosΘ + cosΦsinΘ) = RsinΦcosΘ + RcosΦsinΘ

En remplaçant, nous obtenons :

x' = xcosΘ – ysinΘ y' = xsinΘ + ycosΘ

qui correspond au point transformé P' indiqué précédemment.

Rotation autour d’un point arbitraire

Pour effectuer une rotation autour d’un point (x,y) autre que l’origine, la matrice suivante est utilisée.

transformation de rotation.

Vous pouvez dériver cette matrice en prenant le point (x,y) comme origine.

diagramme qui montre la rotation autour d’un point.

Soit (x1, y1) le point qui résulte de la rotation du point (x0, y0) autour du point (x,y). Nous pouvons dériver x1 comme suit.

x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]

Rebranchez maintenant cette équation dans la matrice de transformation, à l’aide de la formule x1 = ax0 + cy0 + e de la précédente. Utilisez la même procédure pour dériver y1.

Transformation d’asymétrie

La transformation d’asymétrie est définie par quatre paramètres :

  • Θ : quantité à biaiser le long de l’axe x, mesurée sous forme d’angle à partir de l’axe y.
  • Φ : quantité à biaiser le long de l’axe y, mesurée sous la forme d’un angle à partir de l’axe x.
  • (px, py) : coordonnées x et y du point sur lequel l’asymétrie est effectuée.

La transformation d’asymétrie utilise la matrice suivante.

transformation d’asymétrie.

Le point transformé est :

P' = (*x* + *y*tanΘ – *py*tanΘ, *y* + *x*tanΦ) – *py*tanΦ

ou équivalent :

P' = (*x* + (*y* – *py*)tanΘ, *y* + (*x* – *px*)tanΦ)

Pour voir le fonctionnement de cette transformation, considérez chaque composant individuellement. Le paramètre Θ déplace chaque point dans la direction x d’une quantité égale à tanΘ. Le diagramme suivant montre la relation entre Θ et l’asymétrie de l’axe X.

Diagramme montrant l’asymétrie le long de l’axe des X.

Voici la même asymétrie appliquée à un rectangle :

Diagramme montrant l’asymétrie le long de l’axe des X en cas d’application à un rectangle.

Le paramètre Φ a le même effet, mais le long de l’axe y :

Diagramme montrant l’asymétrie le long de l’axe y.

Le diagramme suivant montre l’asymétrie de l’axe y appliquée à un rectangle.

Diagramme montrant l’asymétrie le long de l’axe y en cas d’application à un rectangle.

Enfin, les paramètres px et py déplacent le point central de l’asymétrie le long des axes x et y.

Représentation des transformations dans Direct2D

Toutes les transformations Direct2D sont des transformations affines. Direct2D ne prend pas en charge les transformations non affines. Les transformations sont représentées par la structure D2D1_MATRIX_3X2_F . Cette structure définit une matrice 3 × 2. Étant donné que la troisième colonne d’une transformation affine est toujours la même ([0, 0, 1]), et que Direct2D ne prend pas en charge les transformations non affines, il n’est pas nécessaire de spécifier l’intégralité de la matrice 3 × 3. En interne, Direct2D utilise 3 × 3 matrices pour calculer les transformations.

Les membres du D2D1_MATRIX_3X2_F sont nommés en fonction de leur position d’index : le membre _11 est l’élément (1,1), le membre _12 est l’élément (1,2), et ainsi de suite. Bien que vous puissiez initialiser directement les membres de la structure, il est recommandé d’utiliser la classe D2D1::Matrix3x2F . Cette classe hérite de D2D1_MATRIX_3X2_F et fournit des méthodes d’assistance pour créer l’une des transformations affines de base. La classe définit également operator*() pour la composition de deux transformations ou plus, comme décrit dans Application de transformations dans Direct2D.

Suivant

Module 4. Entrée utilisateur