14.1 Graphisme dans le plan
Certaines opérations fondamentales en graphisme informatique utilisent des concepts propres à l’algèbre linéaire. Les processeurs graphiques ont souvent une composante physique dédiée exclusivement à la multiplication matricielle en parallèle. Dans cette section, nous étudions trois opérations graphiques communes, en passant par la la multiplication matricielle telle que retrouvée dans le standard OpenGL.
14.1.1 Opérations graphiques
Les trois opérations que sous considérations sont la translation, la dilatation, et la rotation. Nous illustrons l’effet de chaque opération sur le cercle unitaire dans le plan : \[C := \left\{ \begin{bmatrix} x_1 \\ x_2\end{bmatrix} \,:\,x_1^2 + x_2^2 = 1 \right\}.\]
14.1.2 Translation
Notons que le centre de \(C\) se situe à l’origine. On peut déplacer le cercle unitaire de façon à ce que le centre se retrouve à \(\begin{bmatrix} p \\q\end{bmatrix}\), tout simplement en additionnant le vecteur \(\begin{bmatrix} p \\q\end{bmatrix}\) à chaque élément de \(C\). Le résultat peut prend la forme \[C' := \left\{ \begin{bmatrix} x_1+p \\ x_2+q\end{bmatrix} \,:\, x_1^2 + x_2^2 = 1 \right\}.\] Cet ensemble peut aussi s’écrire sous la forme \[C' := \left\{ \begin{bmatrix} x_1 \\ x_2\end{bmatrix} \,:\, (x_1-p)^2 + (x_2-q)^2 = 1 \right\}.\]
Donc, la translation de points du plan est réalisée par l’addition d’uplet. Nous décrirons plus tard les translations à l’aide de multiplication matricielle.
14.1.3 Dilatation
Pour étirer le cercle unitaire horizontalement par un facteur de deux, il suffit de multiplier la coordonnée \(x_1\) de chaque élément de \(C\) par \(2\). Le résultat prend la forme \[C'' := \left\{ \begin{bmatrix} 2x_1 \\ x_2\end{bmatrix} \,:\, x_1^2 + x_2^2 = 1 \right\}.\] Cet ensemble peut aussi s’écrire sous la forme \[C'' := \left\{ \begin{bmatrix} x_1 \\ x_2\end{bmatrix} \,:\, \left(\frac{x_1}{2}\right)^2 + x_2^2 = 1 \right\}.\]
Nous pouvons aussi étirer simultanément à la verticale. En fait, si le facteur d’étirement horizontal est \(a\) et le facteur vertical est \(b\), nous obtenons, pour \(a,b > 0\), \[C''' := \left\{ \begin{bmatrix} a x_1 \\ b x_2\end{bmatrix} \,:\, x_1^2 + x_2^2 = 1 \right\},\] ou encore \[C''' := \left\{ \begin{bmatrix} a & 0 \\ 0 & b\end{bmatrix} \begin{bmatrix} x_1 \\ x_2\end{bmatrix} \,:\, x_1^2 + x_2^2 = 1 \right\}.\] La matrice \(\begin{bmatrix} a & 0 \\ 0 & b\end{bmatrix}\) est une matrice de dilatation. Notons que cette matrice est inversible et son inverse est \(\begin{bmatrix} \frac{1}{a} & 0 \\ 0 & \frac{1}{b}\end{bmatrix}\).
14.1.4 Rotation
Soit \(\mathbf{R}(\theta)\) la matrice \(\begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix},\) où \(\theta \in \mathbb{R}.\)
La rotation par \(\theta\) radians d’un ensemble \(S\) par rapport à l’origine est donnée par \[\left \{ \mathbf{R}(\theta) \begin{bmatrix} x_1 \\ x_2\end{bmatrix} \,:\, \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} \in S\right \}.\]
Il va de soit que la rotation de \(C\) par rapport à l’origine ne modifie pas l’ensemble de points. Ce n’est pas le ca pour tous les ensembles, cependant.
Considérons \(S := \left \{ \begin{bmatrix} x_1 \\ 0\end{bmatrix} \,:\,0 \leq x_1 \leq 1\right \},\) le segment de droite compris entre l’origine et le point \(\begin{bmatrix} 1\\ 0\end{bmatrix}\).
Pour tourner ce segment par un angle de \(\pi/4\) radians, on forme d’abord \(\mathbf{R}(\pi/4)\), qui est \(\begin{bmatrix} \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{bmatrix}\). Ainsi, \[S' := \left \{ \mathbf{R}(\pi/4) \begin{bmatrix} x_1 \\ x_2\end{bmatrix} \,:\, \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} \in S\right \} = \left \{ \begin{bmatrix} \frac{1}{\sqrt{2}}x_1 \\ \frac{1}{\sqrt{2}}x_1\end{bmatrix} \,:\, 0 \leq x_1 \leq 1\right \}.\] En dessinant cet ensemble, on voit que le segment de droite compris entre l’origine et le point \(\begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}}\end{bmatrix}\) peut effectivement être obtenu à partir de \(S\) en effectuant une rotation de \(\pi/4\) radians par rapport à l’origine.
La matrice \(\mathbf{R}(\theta)\) est appelée matrice de rotation. On peut facilement vérifier que son inverse est \(\mathbf{R}(-\theta) = \begin{bmatrix} \cos \theta & \sin \theta \\ -\sin \theta & \cos \theta\end{bmatrix}\), qui est aussi une matrice de rotation.
14.1.5 Soulèvement et projet
En résumé, si \(S\) est un ensemble de points dans le plan, il nous est possible de faire une translation par l’addition d’uplet, et de dilater et produire une rotation (par rapport à l’origine) en multipliant chaque éléments de \(S\) par une matrice appropriée.
Nous décrivons maintenant une approche qui nous permettant d’unifier les trois opérations en utilisant la multiplication matricielle. Pour ce faire, nous devons cependant utiliser une dimension supplémentaire.
Premièrement, soit \(S' = \left \{ \begin{bmatrix} x \\ y \\1 \end{bmatrix} \,:\,\begin{bmatrix} x \\ y \end{bmatrix} \in S\right\}\). On dit que l’ensemble \(S\) est soulevé du plan dans l’espace à 3 dimensions.
La matrice correspondant à une translation horizontale par \(p\) et une translation verticale par \(q\) est \(\begin{bmatrix} 1 & 0 & p \\ 0 & 1 & q \\ 0 & 0 & 1 \end{bmatrix}.\)
La matrice correspondant à une dilatation horizontale de facteur \(a\) et une dilatation verticale de facteur \(b\) est \(\begin{bmatrix} a & 0 & 0 \\ 0 & b & 0 \\ 0 & 0 & 1 \end{bmatrix}.\)
Finalement, la matrice correspondant à une rotation d’angle \(\theta\) par rapport à l’origine est \(\begin{bmatrix} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix}\)
Nous obtenons alors \[\begin{bmatrix} 1 & 0 & p \\ 0 & 1 & q \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1\end{bmatrix} = \begin{bmatrix} x + p \\ y + q \\ 1 \end{bmatrix},\] \[\begin{bmatrix} a & 0 & 0 \\ 0 & b & 0 \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1\end{bmatrix} = \begin{bmatrix} ax \\ by \\ 1 \end{bmatrix},\] et \[\begin{bmatrix} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1\end{bmatrix} = \begin{bmatrix} (\cos \theta )x -(\sin\theta) y \\ (\sin \theta)x + (\cos \theta) y \\ 1 \end{bmatrix}.\]
On projette dans le plan en n’utilisant que les deux composantes du haut de chacun des résultats, ce qui correspond aux transformations recherchées.
Notons que la troisième composante dans tous les cas demeure \(1\). Nous pouvons ainsi ficeler ensemble les opérations à l’aide d’un produit de matrices. Par exemple, l’opération qui consiste en une dilatation suivie d’une translation peut être représentée par le produit \[\begin{bmatrix} 1 & 0 & p \\ 0 & 1 & q \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} a & 0 & 0 \\ 0 & b & 0 \\ 0 & 0 & 1 \end{bmatrix}.\] Notons l’ordre selon lequel les matrices se présentent.
Nous avons vu que les dilatations et la rotation sont faites par rapport à l’origine. Que faire si nous désirons les faire par rapport à un autre point \(\begin{bmatrix} p \\ q\end{bmatrix}\)? Nous devons d’abord faire subir à l’ensemble une translation selon \(\begin{bmatrix} -p \\ -q\end{bmatrix}\), pour ensuite effectuer la dilatation ou la rotation par rapport à l’origine demandée, et finalement translater le résultat par \(\begin{bmatrix} p \\ q\end{bmatrix}\). Par exemple, l’opération pour un rotation de \(\theta\) par rapport à \(\begin{bmatrix} p \\ q\end{bmatrix}\) est représentée par le produit de matrice \[\begin{bmatrix} 1 & 0 & p \\ 0 & 1 & q \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \cos \theta & -\sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & -p \\ 0 & 1 & -q \\ 0 & 0 & 1 \end{bmatrix}.\]
Les idées pour les opérations en 3D sont similaires. Plus de détails peuvent être obtenus au site OpenGL.
Exercices
Décrivez comment effectuer une réflexion par rapport à l’axe horizontal en utilisant un produit de matrices.
Décrivez comment effectuer une réflexion par rapport à la droite définie par \(ax + by + c = 0\) en utilisant un produit de matrices.