0% ont trouvé ce document utile (0 vote)
71 vues112 pages

DUT Informatique - Graphisme 2D

YAML et C# pour deuxième année licence

Transféré par

Atef Hasni
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
71 vues112 pages

DUT Informatique - Graphisme 2D

YAML et C# pour deuxième année licence

Transféré par

Atef Hasni
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
Oyo ig LON I aura reece) COLLECTION Applications ENSEIGNEMENTS INFORMATIQUES Informatiques INFORMATIQUE DUT - BTS - Licence Cours:de 1ére année , GENERALITES GRAPHISME v/ LES ESSENTIELS 2D Vf LES APPLICATIONS Espace 2D - Point - Vecteur - Matrice Transformations - Figures geométriques Applications possibles des exemples du manuel avec l'environnement de développement gratuit VISUAL STUDIO Community 2015 et le langage C# IUT INFORMATIQUE DUT / BTS Licence Graphisme 2D Point - Vecteur - Matrice Transformations 2D Figures géométriques Graphisme avec WPF TOME 2 Patrice REY Tous les noms de produits ou marques cités dans ce livre sont des marques déposées par leurs propriétaires respects Titres disponibles en libra Initiation au jeu 2D avec SILVERLIGHT 4 Les structures de données illustrées avec WPF et C#4 La programmation graphique 2D de WPF 4 La programmation graphique 3D de WPF 4 Guide pratique de la modélisation 3D avec WPF 4 La modélisation 3D avec C# et WPF 4 Développez des applications internet avec SILVERLIGHT 5 La 3D avec SILVERLIGHT 5 Le traitement d'images avec SILVERLIGHT 5 Programmez des jeux vidéo 3D avec C#5 et WPF XML expliqué et illustré avec C#5, WPF et LINQ Développement des applications web 3D avec WebGL Traitement des images avec C#5 et WPF Formation 3D par la pratique - Modéliser des molécules Modélisation 3D et Animation avec C#5 et WPF Techniques créatives avec CANVAS 2D de HTML 5 LINQ To XML avec C#5 et WPF Filtrage des images avec CANVAS 2D de HTML 5 Structures de données avec C#5 et WPF Manuel de la programmation 3D avec C#5 et WPF Détection des collisions dans les jeux vidéo 2D Formation G XML avec C#5 et WPF Initiation au jeu vidéo 2D avec SILVERLIGHT 5 IUT Informatique DUT BTS Licence - Tome 1 Books on Demand GmbH, © 2016 Patrice REY 12/14 rond point des Champs Elysées, 85 rue de vincennes - App 23 B 75008 Paris, France 33000 BORDEAUX ISBN : 9782810617500 email : patricerey33@[Link] Dépét legal : AVRIL 2016 site web : [Link] fr (6) Table des matiéres 3.13 - Calculer le déterminant de deux vecteurs .. 3.14- Déterminer la projection orthogonale d'un vecteu! 3 - Matrice dans I'espace 2D 1. La translation avec une matrice 2x1 . 1.1-Composer une figure géométrique 1.2- Matrice de translation 2x1 ..... . La mise |'échelle avec une matrice 2x2 La rotation avec une matrice 2x2... . Le cisaillement avec une matrice 2x2 aR ON . Combinaison de transformations ... 5.1 - Rotation suivie par une mise a I'échelle 5.2- Mise 4 I'6chelle suivie par une rotation 5.3 - Multiplication matricielle de matrice 2x2 4 - Les transformations en coordonnées homogénes 1. Les coordonnées homogénes 1.1-Définition des coordonnéeshomogénes . ition’ tri 1.3 - La multiplication matricielle ..... 1.4-L'associativité du produit matriciel ... 1.6 - Transposer une matrice 3x3 1.7 - Cloner une matrice 3x3 1.8 - Egalité et inégalité de matrice 3x3 1.9 - Inverser une matrice .. 1.10- Appliquer une matrice 4 un point 2. La translation avec UNE MALICE 3X3 assseesssessesssesssesseee 184 Table des matiéres 4. Lecisaillementavec une matrice 3x3. 5. La rotation avec une matrice 3x3... 6. Combinaisonde transformations... 6.1- La mise a |'échelle avec un centre quelconque.......... 208 6.2 - Le cisaillement avec un centre quelconque . 218 6.3 - La rotation avec un centre quelconaque.... 228 6.4- Combiner des transformations de haut niveau 238 5 - Les figures géométriques 1. Le point... 1.1 - Définir un quadrillage ... 1.2 - Définir un point graphique avec D2UcPoint 1.3 - Visualiser des instances de type D2UcPoint . 255 255 263 2. Appliquer une transformation & un point D2UcPoint ........ 274 3. Unsegment avec un coniréle D2UcSegment ... . 280 4. Appliquer une transformation a un segment 285 5. Une droite avec un contr6le D2UCDrOite vse 224 6. Appliquer une transformation @ une droite 299 7. Unrectangle avec un contréle D2UcRectangle 307 8. Un cercle avec un contréle D2UcCercle ..... 314 9. Détecter les collisions ... .- 320 9.1 - Collision entre deux points ..... . 321 we 325 - 330 337 346 . 352 9,2 - Collision entre un point et une droite 9.3 - Collision entre un point et un segment 9.4 - Collision entre un point et un rectangle 9.5 - Collision entre un point et un cercle .. 9.6 - Collision entre deux droites ..... Table des matiéres 9.7-Collisionentre une droiteet unsegment 9.8- Collision entre une droite et unrectangle 9.9- Collision entre une droite et un cercle.... 9.10- Collision entre deux segments .... 9.11 - Collision entre un segment et un rectangle 9.12- Collision entre un segment et un cercle .. 9.13 - Collision entre deux rectangles 9.14 - Collision entre deux cercles ... oe 9.15 - Collision entre un rectangle et un cercle 6 - Le graphisme 2D avec WPF 1. Lesystéme de coordonnées 2D 2. Les systémes de disposition ..... 2.1 - Le conteneur Canvas 2.2 - Le conteneur StackPanel 2.3 - Le conteneur Grid 2.4 - Le conteneur DockPanel .. 2.5 - Le conteneur WrapPanel .... 3. Propriétés impactant sur la disposition 4, Les conteneurs Border, Viewbox et ScrollViewer 5. La typographie ... 5.1-La qualité d'affichage ... 5.2 - Les propriétés de la police d'écriture . 5.3 - L'affichage avec TextBlock 6. Les fonctionnalités graphiques vectorielles 6.1 - La classe Line 6.2 - Les classes Rectangle et Ellipse 6.3 - La classe Polyline .. Table des matiéres @) 6.4 - La classe Polygon . 446 7. Les géométries et les tracés .. 450 7.1 - Les géométries de type ligne, rectangle et ellipse ...... 451 7.2 - La classe GeometryGroup ..... . 452 7.3 - La classe CombinedGeome?tr .... - 455 7.4- La classe PathGeometry - 458 8. Couleur et transparence .. 466 9. Les pinceaux .. 472 9.1 - Le pinceau uni 473 9.2 - Les pinceaux dégradés .... - 476 9.3 - Le pinceau image .... .. 481 9.4 - Le pinceau de type Visual ... -. 484 10. Les effets graphiques évolués . 488 11. Les transformations ... A492 11.1 -La translation avec TranslateTransform A94 11.2-La mise a 'échelle avec ScaleTransform . 497 11.3 - La rotation avec RotateTransform ... 506 11.4 - Linclinaison avec SkewTransform ..... - S11 11.5 - Le regroupement de transformations ..... . 514 11.6 - Récapitulatif des matrices de transformations ....... 519 . 521 (152) FIGURE 3.48 UT Informatique - DUT / BTS / Licence 07 - figure aprés combinaison matricielle: mise a l'échelle + rotation ‘ensemble des points pour la figure aprés combinaison: échelle + rotation (-1.00,-3.00) (-1.00,-1.50) (-0.50,-1.50) (-0.50,-3.00) matrice globale résultant de la mise & léchelle suivie par la rotation: [0-05 150) Copyright 2016 Patrice REY Les transformations en coordonnées homogénes Dans le précédent chapitre, nous avons vu les transformations linéaires (rotation, mise a I'échelle et cisaillement) et les transformations non linéaires (translation). Nous avons vu aussi la combinaison des transformations qui pouvait s'effectuer par une multiplication matricielle si les transformations utilisées étaient des transformations linéaires. Comme la translation est une transformation non lingaire, cela pose des problémes pour réaliser des combinaisons de transformations composées avec des translations. Le reméde a cela est l'utilisation d'une matrice 3x3 qui permet de réaliser des calculs matriciels sur des points dont les composantes sont exprimées en coordonnées homogenes. 1 - Les coordonnées homogénes Nous allons voir dans ce premier paragraphe comme définir des points dotés de coordonnées homogénes et comment utiliser des matrices 3x3 pour réaliser des calculs matriciels. La solution de projet Matrice3x3_CoordonneeHomogene.sin, placée dans le dossier VS_code_iut_tome_2/10_Matrice3x3_CoordonneeHomogene, contient la définition des structures D2PointHomo (point exprimé avec des coordonnées homogénes) et D2Matrice3x3 (matrice 3x3 composée de trois lignes et de trois colonnes). Un sélecteur permet de choisir des actions a réaliser (figure 4.1). FIGURE 4.1 a Matrice3x3_CoordonneeHomogene - oie Fichier Sélectionnez une action ... ‘Sélectionnez une action b 01 - utilisation de la structure D2PointHomo 02 - utilisation de la structure D2Matrice3x3 avec la matrice identité 03 - 'associativité dans le produit des matrices D2Matrice3x3 04 - calculer le déterminant d'une matrice D2Matrice3x3 05 - transposer une matrice D2Matrice3x3 06 - cloner une matrice D2Matrice3x3 07 - inverser une matrice quand c'est possible 08 - calculer les coordonnées d'un point en fonction d'une matrice 3x3 (154) UT Informatique - DUT / BTS / Licence 1.1 - Définition des coordonnées homogénes —En mathématiques, et plus particuligrement en géométrie projective, les coordonnées homogénes, introduites par August Ferdinand Mébius, rendent les calculs possibles dans ’espace projectif comme les coordonnées cartésiennes le font dans espace euclidien. Les coordonnées homogénes sont largement utilisées en infographie 2D et 3D car elles sont adaptées a la géométrie projective et elles permettent de caractériser les transformations de l’espace. La notation sous forme matricielle est plus particuligrement employée dans les bibliothéques de programmation graphique 2D et 3D telles que OpenGL et Direct3D. Un point est représenté par deux coordonnées cartésiennes (x,y) dans l'espace euclidien 2D. Avec les coordonnées homogénes, ce méme point sera représenté avec trois coordonnées (x,y,w). Siw est différent de 0, ’écriture des coordonnées de ce point est (x/v,yAv,w). Les coordonnées xAv et y/w sont appelées les coordonnées du point dans le systéme des coordonnées homogénes. Quand w égal 0, on parle de point a l’infini. En infographie 2D et 3D, on fixe la coordonnée wa 7. Comme les points ont désormais trois coordonnées, les matrices de transformation seront de taille 3x3 pour réaliser le calcul des coordonnées des points aprés transformation. Pour gérer des points composés avec des coordonnées homogénes, on ajoute dans le dossier geometrie_2d/point une structure D2PointHomo. Les champs v_coord_x, v_coord_y et v_coord_w, de type double, stockent les valeurs des composantes d'un point qui sont exprimées en coordonnées homogenes. La lecture et I'écriture de ces champs se font par I'intermédiaire des propriétés P_X, P_Y et P_W. Le constructeur surchargé D2pointHomo initialise les champs v_coord_x, v_coord_y et v_coord_w en fonction des trois valeurs, de type double, passées en paramétre. La méthode d'instance ToString retourne une représentation textuelle des trois composantes du point, et la méthode d'instance Affichage Texte retourne une représentation textuelle des trois composantes du point arrondies deux chiffres aprés la virgule. On a vu au début du livre que la structure D2Point définit un point cartésien avec les coordonnées (x,y). Ici, un point de type D2PointHomo est un point dont les composantes sont exprimées en coordonnées homogénes (x,y,w). Comme on sera amené a effectuer des calculs avec des points de type D2PointHomo et 4 visualiser des points cartésiens de type D2Point, on ajoute une opération qui permet d'effectuer un cast du type D2PointHomo en D2Point (les propriétés cartésiennes P_X et P_Y de D2Point sont les mémes que les propriétés P_X et P_Y en coordonnées homogénes de D2PointHomo). Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (755) public struct D2PointHomo { //champs private double v_coord_x; private double v_coord_y; private double v_coord_w; //propriétés public double P_X { get { return v_coord x; } set { v_coord_x = value; } } public double P_Y { get { return v_coord_y; } set { v_coord_y = value; } 3 public double P_W { get { return v_coord_w; } set { v_coord_w = value; } } //constructeur public D2PointHomo(double coord_x, double coord_y, double coord_w) { v_coord x = coord x; v_coord_y = coord_y; v_coord_w = coord _w; } //redéfinition de la méthode héritée ToString public override string ToString() { string aff = ""; aff + v_coord_x.ToString().Replace(’,', yas aff += v_coord_y.ToString().Replace(’,’, ') + ",": aff += v_coord_w.ToString().Replace(’,’, '.') + ")"; return aff; e //sortie texte avec arrondi a 2 chiffres public string AffichageTexte(bool arrondi_2_chiffres) { string aff ="; if (arrondi_2_chiffres == true) { aff += "(" + v_coord_x.ToString("0.0#").Replace(’,', '.') + ","; aff += v_coord_y.ToString("0.0#").Replace(,’, '.') + ","; aff += v_coord_w.ToString("0.0#").Replace(’,', .') + ")"; * else { aff += "(" + v_coord_x.ToString().Replace(’,', '.') + ","7 aff += v_coord_y.ToString().Replace(’,’, ') + ","; aff += v_coord_w.ToString().Replace(’,’, '.') + ")"; e return aff; 3 //convertit une structure D2Point en une structure D2PointHomo public static explicit operator D2Point(D2PointHomo point_homogene) { D2Point d2point = new D2Point(); (158) UT Informatique - DUT / BTS / Licence d2point.P_X = point_homogene.P_X; d2point.P_Y = point_homogene.P_Y; return d2point; } Jyend struct Il sera nécessaire aussi de pouvoir passer d'un point de type D2Point en un point de type D2PointHomo en effectuant un cast. On ajoute pour cela a la structure D2Point une opération qui permet dieffectuer un cast du type D2Point en D2PointHomo (les propriétés cartésiennes P_X et P_Y de D2Point sont les mémes que les propriétés P_X et P_Y en coordonnées homogénes de D2PointHomo). public struct D2Point { //champs private double v_coord_x; private double v_coord_y; //propriétés public double P_X { get { return v_coord_x; } set { v_coord_x = value; } 3 public double P_Y { get { return v_coord_y; } set { v_coord_y = value; } } //constructeur public D2Point(double coord_x, double coord_y) { v_coord_x = coord_x; v_coord_y = coord_y; } public static explicit operator D2PointHomo(D2Point point) { D2PointHomo pt_homogene = new D2PointHomo(); pt_homogene.P_X = point.P_X; pt_homogene.P_Y = point.P_Y; pt_homogene.P_W = 1.0; return pt_homogene; } } Le premier choix du sélecteur, intitulé "01 - utilisation de la structure D2PointHomo", permet de réaliser des manipulations avec les structures D2PointHomo et D2Point. La figure 4.2 montre le résultat obtenu. L’écriture D2Point pt_a = new D2Point(+2.5, +4.5) permet d'instancier un point pt_a de type D2Point qui est un point cartésien de composantes A(+2.5,+4.5). Avec I'écriture D2PointHomo pt_a_homo = (D2PointHomo)pt_a, on instancie un Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogeénes (757) point pt_a_homo de type D2PointHomo en effectuant un cast du type D2Point en D2PointHomo. Le point obtenu posséde des composantes en coordonnées homogénes qui sont (+2.5,+4.5,+1). Et 'écriture D2PointHomo pt_b_homo = new D2PointHomo(1.0, 2.0, 1.0) permet d'instancier un point pt_b_homo de type D2PointHomo en utilisant le constructeur surchargé D2PointHomo qui recoit en paramétre trois valeurs de composantes (x,y,w). FIGURE 4.2 01 - utilisation de la structure D2PointHomo ~ on définit un point cartésien A(+2.5,+4.5) D2Point pta composantes de A, D2PointHomo pt.a_homo = (D2PointHomo}pt.a A([Link].1.0) composantes de A= => on définit un point B{+1.0,+2.0,+1.0) en coordonnées homogénes D2PointHomo pt_b_homo = new D2PointHomo(1.0, 20, 1.0) composantes de 8 => B(1.0,2.0,1.0) //01 - utilisation de la structure D2PointHomo private void ActionSelection01() { Infos("=> on définit un point cartésien A(+2.5,+4.5)" + RC); D2Point pt_a = new D2Point(+2.5, +4.5); Infos("D2Point pt_a = new D2Point(+2.5, +4.5)" + RC, [Link]); Infos("composantes de A => A" + pt_a.AffichageTexte(true) + RC, [Link]); Infos("=> on définit un point A(+2.5,+4.5,+1) en coordonnées homogénes" + RC); D2PointHomo pt_a_homo = (D2PointHomo)pt_a; Infos("D2PointHomo pt_a_homo = (D2PointHomo)pt_a” + RC, [Link]); Infos("composantes de A => A" + pt_a_homo.AffichageTexte(true) + RC, [Link]); Infos("=> on définit un point B(+1.0,+2.0,+1.0) en coordonnées homogénes" + RC); D2PointHomo pt_b_homo = new D2PointHomo(1.0, 2.0, 1.0); Infos("D2PointHomo pt_b_homo = new D2PointHomo(1.0, 2.0, 1.0)" + RC, [Link]); Infos("composantes de B => B" + pt_b_homo.AffichageTexte(true) + RC, [Link]); } 1.2 - Composition d'une matrice 3x3 Une matrice 3x3 est une matrice composée de trois lignes et de trois colonnes. Elle contient un ensemble de 9 coefficients qui sont m11, m12, m13, m21, m22, m23, m31, m32 et m33 selon la disposition de la figure 4.3. mit mi2 0 mi3 FIGURE 4.3 Matrice 3x3 mp | m21 9 m22 m23 m31 m32 0 m33 (158) Pour gérer une matrice 3x3, on ajoute dans le dossier geometrie_2d/matrice une structure D2Matrice3x3 (fichier [Link]). Les 9 coefficients de la matrice sont stockés dans les champs v_m11, v_m12, v_m13, v_m21, v_m22, v_m23, v_ m31, v_m32 et v_m33. Ces champs sont accessibles en lecture et en écriture par les propriétés P_M11, P_M12, P_M13, P_M21, P_M22, P_M23, P_M31, P_M32 et P_M33. Un constructeur surchargé D2Matrice3x3 initialise les 9 champs par les 9 valeurs de type double passées en parametre. La méthode d'instance ToString retourne un affichage texte personnalisé pour visualiser les 9 composantes de la matrice. UT Informatique - DUT / BTS / Licence public struct D2Matrice3x3 { //champs private double v_m11; private double v_m12; private double v_m13; private double v_m21; private double v_m22; private double v_m23; private double v_m31; private double v_m32; private double v_m33; //propriétés public double P_M11 { get { return vm11; } set { v_m11 = value; } } public double P_M12 { get { return v_m12; } set { v_m12 = value; } } public double P_M13 { get { return v_m13; } set { v_m13 = value; } } public double P_M21 { get { return v_m21; } set { v_m21 = value; } 3 public double P_M22 { get { return v_m22; } set { v_m22 = value; } } public double P_M23 { get { return v_m23; } set { v_m23 = value; } 3 public double P_M31 { get { return v_m31; } Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (759) set { v_m31 = value; } } public double P_M32 { get { return v_m32; } set { v_m32 = value; } 3 public double P_M33 { get { return v_m33; } set { v_m33 = value; } } //constructeur public D2Matrice3x3(double m11, double m12, double m13, double m21, double m22, double m23, double m31, double m32, double m33) { vimtt = m1; v_mi2 = m12; v_m13 = m13; vim21 = m21; vim22 = m2; v_m23 = m23; v_m31 = m31; v_m32 = m32; v_m33 = m33; } “ public override string ToString() { string RC = [Link]; string aff = "[" + v_m11.ToString("00.00") +" "+ v_m12.ToString("00.00") + """ + v_m13,ToString("00.00") + RC; aff +=""+ v_m21.ToString("00.00") +" "+ v_m22.ToString("00.00") +" " + v_m23.ToString("00.00") + RC; aff += "_"+ v_m31.ToString("00.00") + " "+ v_m32.ToString("00.00") +" " + v_m33.ToString("00.00") + "J"; return aff; } Byend struct En algébre linéaire, la matrice identité ou matrice unité (figure 4.4) est une matrice carrée avec des 7 sur la diagonale (coefficients 11, m22 et m33) et des 0 partout ailleurs (coefficients m12, m13, m21, m23, m31 et m32). 1 0 0 mito mi2 m13 FIGURE 4.4 0 1 ° mat m22_—ma3 0 0 1 m31-m32_—«m33 Matrice 3x3 Matrice identité Dans la_ structure D2Matrice3x3, on commence par ajouter une méthode (160) UT Informatique - DUT / BTS / Licence statique CreerMatriceldentite, qualifié par le mot-clé private, qui retourne une matrice identité de type D2Matrice3x3. Puis on ajoute un champ statique v_ mat_identite, qualifié par le mot-clé private, qui recoit la valeur retournée par la méthode statique [Link]. Et pour accéder en lecture 4 ce champ depuis I'extérieur, on ajoute une propriété P_Matriceldentite de type D2Matrice3x3 qui lit la valeur de ce champ. De cette fagon, l'écriture D2Matrice3x3 mat_identite = D2Matrice3x3.P_Matriceldentite permettra d'instancier une matrice identité mat_identite directement depuis une propriété statique. L'autre facon conventionnelle d'instancier une matrice identité est d'utiliser le constructeur surchargé par I'écriture D2Matrice3x3 mat_identite = new D2Matrice3x3(1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0, 1.0). public struct D2Matrice3x3 { private static D2Matrice3x3 v_mat_identite = [Link](); public static D2Matrice3x3 P_MatriceIdentite { get { return D2Matrice3x3.v_mat_identite; } } //créer une matrice identité 3x3 en coordonnées homogénes private static D2Matrice3x3 CreerMatriceIdentite() { D2Matrice3x3 matrice = new D2Matrice3x3(1, 0, 0, 0, 1, 0, 0, 0, 1); return matrice; } }/jend struct 1.3 - La multiplication matricielle La combinaison des transformations s'exprime généralement avec une matrice 3x3 qui résulte d'une multiplication matricielle correspondant aux transformations effectuées. Nous verrons plus loin dans le chapitre ce que donne visuellement une matrice consécutive 4 une combinaison de transformations. Nous allons voir ici comment effectuer une multiplication matricielle entre deux matrices de taille 3x3, a la fois avec un stylo sur du papier et en programmation. En ayant une premiére matrice 3x3 nommée mat_1 avec les coefficients a11, a12, a13, a21, a22, a23, a31, a32 et a33, et une seconde matrice 3x3 nommée mat_2 avec les coefficients b11, b12, 613, b21, b22, b23, b31, b32 et b33, la multiplication matricielle donne une matrice 3x3 nommée mat, de valeur mat = mat_1 * mat_2, avec les coefficients ¢11, c12, c13, c21, c22, c23, c31, c32 et c33, selon un procédé de calcul tenant compte des lignes de la premiére matrice et des colonnes de la seconde matrice. Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogeénes (761) Comme le montre la figure 4.5, la premiere ligne de la premiere matrice et les trois colonnes de la seconde matrice servent a déterminer les coefficients c11, 12 et c13 avec ctf = aff *bit + a12*b21 +a13*b31, c12= alt *b12 +a12*b22+ a13 *b32 et c13 = aft *b13 +12 *b23 + a13 *b33. FIGURE 4.5 all at2 a8 bit b12—b13 a cz «3 a2 a2 a3 *) bat b22 ba = | ci c22) 23 a31 3233 b31-b32—«b33 B31 23 i= att*bi1 + at2*bors aia*bs1 dl alt at2_— a3 bit b12 b13 at 2B a1 aaa = fer a2 23 a1 a2 b33 y 32 33 12 = a11 *b12 + a2 * b22 + a13 * b32 all al2 al3 bli b12 b13 ct 12 13, a2t b21 b22 22 23 a3l a32 a 32 33, c13 = a11 *b13 + a2 *b23 + a13 * b33 Comme le montre la figure 4.6, la seconde ligne de la premiére matrice et les trois colonnes de la seconde matrice servent a déterminer les cooefficients 621, c22 et c23 avec c21 = a21 *b11 + a22* b21 + a23 *b31, c22 = a21 *b12+a22*b22+ a23 * b32 et 23 = a21 * b13 + a22 * b23 + a23 * b33. FIGURE 4.6 all a2 a3 bit b12b13 acta a2t 2223 | *] bar baz baz, = | 21 22 ca aB1 3283 b31b32—b33 Bl 28 c21= 221 11 + a22*b21 + a23"b31 ell all ata a3 bit b12. b13 ca cla ct 21 aaa = |e a2 aa 231 a32 b33 a1 G2 33 c22=a21"b12 + a22*b22 + a23"b32 ald ail a2 a3 bit b12. b13 acta a2t baa f= | ett e223 a3t 32 bat b32—b33 a1 233 23 = a21*b13 + a22 *b23 + a23 *b33 da (162) IUT Informatique - DUT / BTS / Licence Comme le montre la figure 4.7, la troisiéme ligne de la premiere matrice et les trois colonnes de la seconde matrice servent a déterminer les covefficients ¢31, c32 et 33 avec 631 = a31 *b11 + a32 *b21 + a33 *b31, 32 = a31 *b12 + a32*b22+ 233 * b32 et 033 = a31 * b13 + a32 *b23 + a33 *b33. FIGURE 4.7 all a2 a3 bit b12— b13 at 23 a21 a2 a3 212223 P= | cat 22 ca. a31 a2 a3 b31b32_— 33 31 3233 631 = a31*b11 + a32*b21 + a33*b31 d all ald at bit b12. b13 a cla a21ad2 a3 |] bat ba bass f= | cet e223 231 a32— a3 b31 3233 31 2 33 632= 031 *b12 + a32*b22 + 033"b32 add ail a2 a3 bit b12. b13 at cae a1 a22_ a3 *) bai b22— 23 =] e2t 22 023 a31 3233 b31b32—b33 31 G2 33 33= 031 *b13 + aB2*b23+ 0334633 dd Du cété de la programmation, en reprenant les explications ci-dessus, on ajoute une méthode statique ProduitMatriciel, qui recoit en paramétre deux matrices et qui retourne le résultat de la multiplication matricielle sous forme d'une matrice de type D2Matrice3x3. Pour plus de souplesse dans la programmation, on ajoute une surcharge pour I'opérateur "*" (opérateur de multiplication) pour permettre la multiplication matricielle de deux matrices exprimées par leurs variables représentatives. public struct D2Matrice3x3 { //produit matriciel de matrice_1 par matrice_2 dans cet ordre public static D2Matrice3x3 ProduitMatriciel(D2Matrice3x3 mat_1, D2Matrice3x3 mat_2) { double a11 = mat_1.P_M11; double a12 = mat_1.P_M12; double a13 = mat_1.P_M13; double a21 = mat_1.P_M21; double a22 = mat_1.P_M22; double a23 = mat_1.P_M23; double a31 = mat_1,P_M31; double a32 = mat_1.P_M32; double a33 = mat_1.P_M33; Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (763) double b11 = mat_2.P_M11; double b12 = mat_2.P_M12; double b13 = mat_2.P_M13; double b23 t 2.P_i double b31 = mat_2.P_M31; double b32 = mat_2.P_M32; double b33 = mat_2.P_M33; D2Matrice3x3 mat_res = new D2Matrice3x3(); mat_res.v_m1 all * b11 + a12 * b21 + a13 * b31; mat_res.v_m12 = all * b12 + al2 * b22 + a13 * b32; mat_res.v_m13 = all * b13 + a12 * b23 + a13 * b33; mat_res.v_m2. a21 * b11 + a22 * b21 + a23 * b31; mat_res.v_m22 = a21 * b12 + a22 * b22 + a23 * b32; mat_res.v_m23 = a21 * b13 + a22 * b23 + a23 * b33; mat_res.v_m31 = a31 * b11 + a32 * b21 + a33 * b31; mat_res.v_m32 = a31 * b12 + a32 * b22 + a33 * b32; mat_res.v_m33 = a31 * b13 + a32 * b23 + a33 * b33; return mat_res; } //surcharge opérateur * pour le produit matriciel de matrice_1 par matrice_2 dans //cet ordre public static D2Matrice3x3 operator *(D2Matrice3x3 mat_1, D2Matrice3x3 mat_2) { double a11 = mat_1.P_M11; double a12 = mat_1.P_M12; double a13 = mat_1.P_M13; double a21 = mat_1.P_M21; double a22 = mat_1.P_M22; double a23 = mat_1.P_M23; double a31 = mat_1.P_M31; double a32 = mat_1.P_M32; double a33 = mat_1.P_M33; double b11 = mat_2.P_M11; double b12 = mat_2,P_M12; double b13 = mat_2.P_M13; double b21 = mat_2.P_M21; double b22 ; double b23 double b31 double b32 double b33 t D2Matrice3x3 mat_res = new D2Matrice3x3(); mat_res.v_m11 = al1 * b11 + a12 * b21 + a13 * b31; mat_res.v_m12 = al1 * 612 + a12 * 622 + a13 * b32; mat_res.v_m13 = al1 * b13 + a12 * b23 + a13 * b33; mat_res.v_m21 = a21 * b11 + a22 * b21 + a23 * b31; mat_res.v_m22 = a21 * b12 + a22 * b22 + a23 * b32; mat_res.v_m23 = a21 * b13 + a22 * b23 + a23 * b33; mat_res.v_m31 = a31 * b11 + a32 * b21 + a33 * b31; (164) UT Informatique - DUT / BTS / Licence mat_res.v_m3) mat_res.v_m33 return mat_res; } 3 /Jend struct a31 * b12 + a32 * b22 + a33 * b32; a31 * b13 + a32 * b23 + a33 * b33; Soit M une matrice quelconque de type D2Matrice3x3 et M,, une matrice identité de type D2Matrice3x3, on aura la relation M “M,,= M,, *M = M. C'est une propriété de la matrice identité: multiplier une matrice quelconque avec une matrice identité donne comme résultat la matrice quelconque quel que soit I'ordre de la multiplication matricielle. Le second choix du sélecteur, intitulé "02 - utilisation de la structure D2Matrice3x3 avec la matrice identité", permet de réaliser des manipulations avec la structure D2Matrice3x3 et la multiplication matricielle. La figure 4.8 montre le résultat obtenu. L'écriture | D2Matrice3x3_— mat_identite = D2Matrice3x3.P_Matriceldentite permet d'instancier une matrice identité mat_identite directement depuis une propriété statique de D2Matrice3x3. L'écriture D2Matrice3x3 mat_qcq = new D2Matrice3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0) permet d'instancier une matrice quelconque mat_qceq en passant 9 coefficients au constructeur surchargé D2Matrice3x3. L'écriture D2Matrice3x3 mat_prod_identite_qcq = D2Matrice3x3. ProduitMatriciel(mat_identite, mat_qcq) permet dieffectuer la multiplication matricielle de mat_identite par mat_geq et de I'affecter a la variable mat_prod_ identite_qcq de type D2Matrice3x3. L'écriture D2Matrice3x3 mat_prod_identite_ qeq = mat_identite * mat_qcq permet de réaliser la multiplication matricielle en multipliant directement les variables qui représentent les matrices (ce qui est possible grace a la surcharge ajoutée pour l'opérateur "*"). On remarque au passage que multiplier une matrice quelconque par une matrice identité donne comme résultat la matrice quelconque, et que multiplier une matrice identité par une matrice quelconque donne comme résultat la matrice quelconque. //02 - utilisation de la structure D2Matrice3x3 avec la matrice identité private void ActionSelection02() { Infos("=> on définit une matrice identité 3x3" + RC); D2Matrice3x3 mat_identite = D2Matrice3x3,P_Matriceldentite; Infos("D2Matrice3x3 mat_identite = D2Matrice3x3.P_Matriceldentite" + RC, [Link]); Infos(mat_identite.ToString() + RC, [Link]); Infos("coefficient m11 = "+ mat_identite.P_M11.ToString() + RC, [Link]); Infos("coefficient m12 = "+ mat_identite.P_M12.ToString() + RC, [Link]); Infos("coefficient m13 = " + mat_identite,P_M13.ToString() + RC, [Link]); Infos("coefficient m21 = " + mat_identite.P_M21.ToString() + RC, [Link]); Infos("coefficient m22 = " + mat_identite.P_M22.ToString() + RC, [Link]); Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogeénes FIGURE 4.8 Fichier 02 - utilisation de la structure D2Matrice3x3 avec la matrice identité => on définit une matrice identité 3x3 D2Matrice3x3 mat identite = D2Matrice3x3.P_Matriceldentite [01,00 00,00 00,00 (00,00 01,00 00,00 00,00 00,00 01,00} coefficient m11 = 1 coefficient m13 = 0 coefficient m21 = 0 coefficient m22 coefficient m23 = 0 coefficient m31 = 0 coefficient m32 = 0 coefficient m33 = 1 => on définit une matrice quelconque 3x3 D2Matrice3x3 mat_qcq = new D2Matrice3x3(1.0, 2.0, 3.0, 40, 5.0, 60, 7.0, 8.0, 20) [01,00 02,00 03,00 (04,00 05,00 06,00 07,00 08,00 09,00} => on effectue le produit matric mat_identite * matqcq DaMatrice3x3 produit. identite_qcq = [Link](mat_identite, mat_qcq) [07,00 02,00 03,00 (04,00 05,00 06,00 07,00 08,00 03,00} D2Matrice3x3 mat_prod identite_qcq = mat identite * mat_qcq [01,00 02,00 03,00 (04,00 05,00 06,00 07,00 08,00 09,00} => on effectue le produit matricie: mat_qcq * mat identite DaMatrice3x3 mat_prod_qcq_identite = [Link](mat_qcq, mat identite) [01,00 02,00 03,00 (04,00 05,00 06,00 07,00 08,00 09,00} DaMatrice3x3 mat_prod_qcq_identite = mat_qeq * mat identite [07,00 02,00 03,00 (04,00 05,00 06,00 07,00 08,00 09,00] (168) UT Informatique - DUT / BTS / Licence Infos("coefficient m23 = " + mat_identite,P_M23.ToString() + RC, [Link]); Infos("coefficient m31 = " + mat_identite.P_M31.ToString() + RC, [Link]); Infos("coefficient m32 = "+ mat_ >_M32.ToString() + RC, [Link]); Infos("coefficient m33 = "+ mat_identite.P_M33.ToString() + RC, [Link]); Infos("=> on définit une matrice quelconque 3x3" + RC); D2Matrice3x3 mat_qcq = new D2Matrice3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6. Infos("D2Matrice3x3 mat_qcq = new D2Matrice3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0)" + RC, [Link]); Infos(mat_qcq.ToString() + RC, [Link]); Infos("=> on effectue le produit matriciel: mat_identite * mat_qcq” + RC); D2Matrice3x3 mat_prod_identite_qcq = D2Matrice3x3. ProduitMatriciel(mat_identite, mat_qcq); Infos("D2Matrice3x3 produit_identite_qcq = D2Matrice3x3. ProduitMatriciel(mat_identite, mat_qcq)" + RC, [Link]); Infos(mat_prod_identite_qcq.ToString() + RC, [Link]); mat_prod_identite_qcq = mat_identite * mat_qcq; Infos("D2Matrice3x3 mat_prod_identite_qcq = mat_identite * mat_qcq" + RC, [Link]); Infos(mat_prod_identite_qcq.ToString() + RC, [Link]); Infos("=> on effectue le produit matriciel: mat_qcq * mat_identite" + RC); D2Matrice3x3 mat_prod_qcq_identite = [Link](mat_qcq, mat_identite); Infos("D2Matrice3x3 mat_prod_qcq_identite = [Link](mat_qcq, mat_identite)" + RC, [Link]); Infos(mat_prod_qcq_identite. ToString() + RC, [Link]); mat_prod_qcq_identite = mat_qcq * mat_identite; Infos("D2Matrice3x3 mat_prod_qcq_identite = mat_qcq * mat_identite" + RC, [Link]); Infos(mat_prod_qcq_identite. ToString() + RC, [Link]); } 7.0, 8.0, 9.0); 1.4 - L'associativité du produit matriciel Supposons que l'on ait une premiére matrice M1, une seconde matrice M2 et une troisime matrice M3, I'associativité du produit matriciel permet d'avoir la relation (M1 * M2) * M3 = M1 * (M2 * M3). Le troisieme choix du sélecteur, intitulé "03 - /'associativité dans le produit des matrices D2Matrice3x3", permet de réaliser des manipulations sur l'associativité dans une multiplication matricielle. La figure 4.9 montre le résultat obtenu. On instancie trois matrices mat_1, mat_2 et mat_3 de type D2Matrice3x3. On stocke dans mat_12_fois_3 de type D2Matrice3x3 le produit matriciel (mat_1 * mat_2) * mat_3 et on stocke dans mat_1_fois_23 de type D2Matrice3x3 le produit matriciel mat_1 *(mat_2 * mat_3). En éditant les composantes des matrices mat_12_fois_3 et mat_1_fois_23, on constate qu'elles sont identiques. A noter ici que l'on parle de |'associativité par un positionnement des parenthéses avec (M1 Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (167) * M2) * M3 = M1 * (M2 * M3) et non pas de commutativité oti le produit matriciel M1 * M2 est différent du produit matriciel M2 * M1 dans le cas général. FIGURE 4.9 ie} Matrice3x3,CoordonneeHomogene - oe Fichier 03 - l'associativité dans le produit des matrices D2Matrice3x3 : => on définit une matrice 2x3 mat_1 D2Matrice3x3 mat_qcq = new D2Matrice3x3(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0) [01,00 01,00 01,00 01,00 01,00 01,00, 01,00 01,00 01,00} => on définit une matrice 3x3 mat_2 D2Matrice3x3 mat_2 = new D2Matrice3x3(2.0, 2.0, 20, 2.0, 2.0, 20, 2.0, 2.0, 2.0 [02,00 02,00 02,00 02,00 02,00 02,00 02,00 02,00 02,00] => on définit une matrice 3x3 mat_3 D2Matrice3x3 mat_3 = new D2Matrice3x3(3.0, 3.0, 30, 30, 3.0, 30, 3.0, [03,00 03,00 03,00 03,00 03,00 03,00 03,00 03,00 03,00] => on effectue le produit matriciel (mat_1 * mat_2) * mat 3 D2Metrice3x3 mat_12 fois 3 = (mat_1 * mat_2) * mat 3 [54,00 54,00 54,00 54,00 54,00 5400 54,00 54,00 54,00] => on effectue le produit matriciel mat_1 * (mat_2 * mat_3) D2Matrice3x3 mat_1_fois_23 = matt * (mat_2* mat_3) [54,00 54,00 54,00 4,00 $4,00 54,00 ,00 54,00 54,00} //03 - l'associativité dans le produit des matrices D2Matrice3x3 private void ActionSelection03() { Infos("=> on définit une matrice 3x3 mat_1" + RC); D2Matrice3x3 mat_1 = new D2Matrice3x3(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0); Infos("D2Matrice3x3 mat_qcq = new D2Matrice3x3(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0)" + RC, [Link]); Infos(mat_1.ToString() + RC, [Link]); Infos("=> on définit une matrice 3x3 mat_2" + RC); D2Matrice3x3 mat_2 = new D2Matrice3x3(2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0); Infos("D2Matrice3x3 mat_2 new D2Matrice3x3(2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0" + RC, [Link]); Infos(mat_2.ToString() + RC, [Link]); Infos("=> on définit une matrice 3x3 mat_3" + RC); D2Matrice3x3 mat_3 = new D2Matrice3x3(3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0); Infos("D2Matrice3x3 mat_3 = new D2Matrice3x3(3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0)" + RC, [Link]); Infos(mat_3.ToString() + RC, [Link]); (168) UT Informatique - DUT / BTS / Licence Infos("=> on effectue le produit matriciel (mat_1 * mat_2) * mat_3" + RC); D2Matrice3x3 mat_12_fois_3 = (mat_1 * mat_2); mat_12_fois_3 = mat_12_fois_3 * mat_3; Infos("D2Matrice3x3 mat_12_fois_3 = (mat_1 * mat_2) * mat_3" + RC, [Link]); Infos(mat_12_fois_3.ToString() + RC, [Link]); Infos("=> on effectue le produit matriciel mat_1 * (mat_2 * mat_3)" + RC); D2Matrice3x3 mat_1_fois_23 = (mat_2 * mat_3); mat_1 fois 23 = mat_1 * mat_1_fois 23; Infos("D2Matrice3x3 mat_1_fois_23 = mat_1 * (mat_2 * mat_3)" + RC, [Link]); Infos(mat_1_fois_23.ToString() + RC, [Link]); 1.5 - Calculer le déterminant d'une matrice 3x3 Le calcul du déterminant d'une matrice est un outil nécessaire tant en algebre linéaire pour vérifier une inversibilité ou calculer l'inverse d'une matrice qu'en analyse vectorielle avec par exemple le calcul d'un jacobien. Soit une matrice Mavec ses coefficients m11, m12, m13, m21, m22, m23, m31, M32 et m33, et soit det(M) la valeur du déterminant de la matrice M, le déterminant det(M) de la matrice M est égal a (figure 4.10): m11 * det(cofacteurs de m11) - m12 * det(cofacteurs de m12) + m13 * det(cofacteurs de m13). Les cofacteurs de m11 sont les coefficients m22, m23, m32 et m33, et le déterminant des cofacteurs de m11 est égal a la valeur m22 * m33 - m32 * m23. Les cofacteurs de m12 sont les coefficients m21, m23, m31 et m33, et le déterminant des cofacteurs de m12 est égal ala valeur m21 * m33 - m31 * m23. Les cofacteurs de m13 sont les coefficients m21, m22, m31 et m32, et le déterminant des cofacteurs de m13 est égal ala valeur m21 * m32-m31 *m22. FIGURE 4.10 mit m12— m13 etm) Matrice M= | m21 m22_— m23 est le déterminant de la matrice M m31 32 m3 122 21 21 22, det(M) = m11* det | "2 ™3] miz* det} ™! ™3 | 4 m13* det}! ™ m32_m33 m31_m33 31 m32 mit mi2— 13 m1 mi2—m13 mito mi2 m3 m21 22 m23 m21 22 m23 m21 22 m23 m31-m32_—«m33 m31m32_—«m33. m31m32_—«m33 cofacteurs de m11 cofacteurs de m12 cofacteurs de m13 Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (769) Le produit de m1 par le déterminant des cofacteurs de m11 est égal a la valeur m11 * (m22 * m33 - M32 * m23) = m11 * m22 *m33 - m11 * m32 * m23. Le produit de -m12 par le déterminant des cofacteurs de m12 est égal la valeur -m12 *(m21 *m33 - m31 * m23) = -m12*m21 *m33 + m12 *m31 *m23. Et le produit de m13 par le déterminant des cofacteurs de m13 est égal a la valeur m13 * (m21 *m32 - m31 * m22) = m13 * m21 * m32 - m13 * m31 * m22. La figure 4.11 récapitule ces différents calculs. FIGURE 4.11 mito mi2_m13 m21m22_m23_— | am m1 *det [vs | m31m32_—m33 m32__m33 m11 * (m22 * m33 - m32 * m23) = m11 * m22 * M33 - M11 * M32 * M23 mit mi2. m13. mat m22m23_— | mm -m12 * det [v "2 m31 3233 m31_m33 =m12 * (m21 * m33 - m31 * m23) = -m12 * m21 * m33 + m12 * M31 * M23 mito m12 m1 m21m22_— m3 m> m13*det m21_m22 m31m32_—-m33 m31_m32 = m13* (m21 * m32 - m31 * m22) = m13 *m21 *m32 - M13 * M31 * M22 Dans la structure D2Matrice3x3, on ajoute une méthode d'instance Determinant qui retourne une valeur de type double correspondant au calcul du déterminant de la matrice conformément aux explications ci-dessus. public struct D2Matrice3x3 { ... //determinant d'une matrice 3x3 public double Determinant() { double val_determinant = 0; val_determinant += v_m11 * v_m22 * v_m33 - v_m11 * v_m32 * v_m23; val_determinant += -v_m12 * v_m21 * v_m33 + v_m12 * v_m31 * v_m23; val_determinant += v_m13 * v_m21 * v_m32 - v_m13 * v_m31 * v_m22; return val_determinant; Pow 3 //end struct Le quatriéme choix du sélecteur, intitulé "04 - calculer le déterminant d'une matrice D2Matrice3x3", permet de réaliser des manipulations sur le calcul du déterminant d'une matrice 3x3 de type D2Matrice3x3. La figure 4.12 montre le résultat obtenu. (170) FIGURE 4.12 UT Informatique - DUT / BTS / Licence 04 = calculer le déterminant d'une matrice D2Matrice3x3 g => on définit une matrice 3x3 mat_1 " iat_1 = new D2Matrice3x3(-1.0, 05,00 -02,00 08,00 10,00} => on calcule le déterminant de la matrice mat_t double deter.mat_1 = mat_1.Dete valeur du déterminant = 32 30, -2.0, 80, 10.0) On instancie une matrice mat_1 par D2Matrice3x3 mat_1 = new D2Matrice3x3/-1.0, 2.0, 5.0, 1.0, 2.0, 3.0, -2.0, 8.0, 10.0). Dansla variable deter_mat_1 de type double, on stocke la valeur du déterminant de la matrice mat_1 par application de la méthode Determinant d'oil I'écriture double deter_mat_1 = mat_1.Determinant(). On obtient ainsi une valeur de +32.0 pour le calcul du déterminant de la matrice mat_1. //04 - calculer le déterminant d'une matrice D2Matrice3x3 private void ActionSelection04() { Infos("=> on définit une matrice 3x3 mat_1" + RC); D2Matrice3x3 mat_1 new D2Matrice3x3(-1.0, 2.0, 5.0, 1.0, 2.0, 3.0, -2.0, 8.0, 10.0); Infos("D2Matrice3x3 mat_1 = new D2Matrice3x3(-1.0, 2.0, 5.0, 1.0, 2.0, 3.0, -2.0, 8.0, 10.0)" + RC, [Link]); Infos(mat_1.ToString() + RC, [Link]); Infos("=> on calcule le déterminant de la matrice mat_1" + RC); double deter_mat_1 = mat_1.Determinant(); Infos("double deter_mat_1 = mat_1.Determinant()" + RC, [Link]); Infos("valeur du déterminant = "+ deter_mat_1.ToString() + RC, [Link]); } 1.6 - Transposer une matrice 3x3 Dans certains calculs, il est nécessaire de procéder a une transposition de matrice. La transposée M' d'une matrice M s'obtient par symétrie axiale par rapport a la diagonale principale de la matrice c'est-d-dire en échangeant les lignes et les colonnes de M. La diagonale principale d'une matrice est composée par les coefficients m11, m22 et m33. Comme le montre la figure 4.13, on a la premiere ligne de la matrice transposée qui recoit les coefficients m11, m21 et m31, la seconde ligne de la matrice transposée qui recoit les coefficients m12, m22 et m32, et la troisiéme ligne de la matrice transposée qui recoit les coefficients m13, m23 et m33. Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (771) FIGURE 4.13 mit mi2 m13. mit m2t m3 mt m22 m23 => m12 0 m22—m32 m31 m32 —-m33 m13 9 m23--m33 Matrice M Matrice transposée M™ mito mi2 m3 mit mat mat m2i m22 m23 -> mi2 = m22 m32 m31 m32—-m33 m13— m23-m33 mit mi2 m13 mit m21 m31 mat m22 m23 -_> mi2 m22- m32 m31 m32 m33 m13— 0 m23——s«m33 mit mi2 m13 mit m21 m31 mai m22 m23 -_> m12) m22_m32 m31 m32-m33 m13— m23- m33 Dans la structure D2Matrice3x3, on ajoute une méthode d'instance Transposer qui réalise la transposition de la matrice 3x3 en cours conformément aux explications ci-dessus. public struct D2Matrice3x3 { ... //transposer une matrice public void Transposer() { double c11 = v_m11; double 12 = v_m12; double c13 = v_m13; double c21 = v_m21; double c22 = v_m22; double c23 = v_m23; double 31 = v_m31; double ¢32 = v_m32; double 33 = v_m33; vimil = cll; vimi2 = c21; v_m13 = 631; vim2i = c12; vim22 = c22; vim23 = ¢32; v_m31 = c13; v_m32 = c23; v_m33 = ¢33; den 3 /end struct (172) Le cinquiéme choix du sélecteur, intitulé "05 - transposerune matrice D2Matrice3x3", permet de réaliser des manipulations sur la transposition d'une matrice 3x3 de type D2Matrice3x3. La figure 4.14 montre le résultat obtenu. FIGURE 4.14 UT Informatique - DUT / BTS / Licence 05 - transposer une matrice D2Matrice3x3 on définit une matrice 3x3 mat_1 on transpose la matrice mat_1 Transp 21,00 Oninstancie une matrice mat_1 par D2Matrice3x3 mat_1 = new D2Matrice3x3(11.0, 12.0, 13.0, 21.0, 22.0, 23.0, 31.0, 32.0, 33.0). On applique la méthode d'instance Transposer a |a matrice mat_1. On termine en affichant les composantes de la matrice mat_1 pour vérifier que la matrice initiale a bien été transposée. //05 - transposer une matrice D2Matrice3x3 private void ActionSelection05() { Infos("=> on définit une matrice 3x3 mat_1" + RC); D2Matrice3x3 mat_1 = new D2Matrice3x3(11.0, 12.0, 13.0, 21.0, 22.0, 23.0, 31.0, 32.0, 33.0); Infos("D2Matrice3x3 mat_1 = new D2Matrice3x3(11.0, 12.0, 13.0, 21.0, 22. 31.0, 32.0, 33.0)" + RC, [Link]); Infos(mat_1.ToString() + RC, [Link]); Infos("=> on transpose la matrice mat_1" + RC); mat_1.Transposer(); Infos("mat_1.Transposer()" + RC, [Link]); Infos(mat_1.ToString() + RC, [Link]); } 23.0, 1.7 - Cloner une matrice 3x3 Fréquemment on est amené a instancier une matrice par clonage d'une autre matrice existante. Le clonage d'une matrice consiste 4 instancier une nouvelle matrice dont les coefficients sont identiques a la matrice a cloner. Dans la structure D2Matrice3x3, on ajoute une méthode d'instance Cloner qui réalise le clonage de la matrice en cours en retournant une nouvelle instance de matrice de type D2Matrice3x3 (les 9 coefficients de la matrice en cours sont recopiés dans les 9 Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (173) champs de la matrice instanciée et retournée). public struct D2Matrice3x3 { //cloner une matrice public D2Matrice3x3 Cloner() { D2Matrice3x3 mat_clone = new D2Matrice3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); mat_clone.v_m11 = v_m11; mat_clone.v_m12 = v_m12; mat_clone.v_m13 = v_m13; mat_clone.v_m21 = v_m21; mat_clone.v_m22 = v_m22; mat_clone.v_m23 = v_m23; mat_clone.v_m31 = v_m31; mat_clone.v_m32 = v_m32; mat_clone.v_m33 = v_m33; return mat_clone; } }/jend struct Le sixieme choix du sélecteur, intitulé "06 - cloner une matrice D2Matrice3x3", permet de réaliser des manipulations sur le clonage d'une matrice 3x3 de type D2Matrice3x3. La figure 4.15 montre le résultat obtenu. FIGURE 4.15, 06 - cloner une matrice D2Matrice3x3 . on définit une matrice 3x3 matt wat_1 = new D2Matric 0,40 0, 8.0, 9.0) 02, 0 4,00 05,00 06,00 (00 09,00} matrice mat_1 en une matrice mat_2 mat_1.Cloner) On instancie une matrice mat_1 par D2Matrice3x3 mat_1 = new D2Matrice3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0). Pour obtenir une matrice mat_2 par clonage de la matrice mat_1, on affecte a la variable mat_2 le retour de l'application de la méthode d'instance Cloner a mat_1 d'ou |'écriture D2Matrice3x3 mat_2 = mat_1. Cloner(). On termine en affichant les composantes de la matrice mat_2 pour vérifier que la matrice posséde des coefficients identiques a la matrice 4 cloner mat_1. (174) UT Informatique - DUT / BTS / Licence //06 - cloner une matrice D2Matrice3x3 private void ActionSelection06() { Infos("=> on définit une matrice 3x3 mat_1" + RC); D2Matrice3x3 mat_1 = new D2Matrice3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0); Infos("D2Matrice3x3 mat_1 = new D2Matrice3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0)" + RC, [Link]); Infos(mat_1.ToString() + RC, [Link]); Infos("=> on clone la matrice mat_1 en une matrice mat_2” + RC); D2Matrice3x3 mat_2 = mat_1.Cloner(); Infos("D2Matrice3x3 mat_2 = mat_1.Cloner()" + RC, [Link]); Infos("composantes de mat_2: "+RC + mat_2.ToString() + RC, [Link]); 3 1.8 - Egalité et inégalité de matrice 3x3 L'égalité entre deux matrices de type D2Matrice3x3 consiste a vérifier que les neuf champs sont égaux un a un. La méthode statique [Link], qui recoit en paramétre deux matrices mat_1 et mat_2 de type D2Matrice3x3, retourne un booléen indiquant si ces deux matrices sont égales (avec une implémentation qui consiste en une comparaison champ par champ). public struct D2Matrice3x3 { //méthode statique pour I'égalité public static boo! Egalite(D2Matrice3x3 mat_1, D2Matrice3x3 mat_2) { bool egalite = false; if (mat_1.v_m11 if (mat_t.v_m12 if (mat_1.v_m4 if (mat_1.v_m21 = if (mat_1.v_m22 if (mat_1.v_m23 if (mat_1.v_m31 if (mat_1.v_m32 = if (mat_1.v_m33 egalite = true; mat_2.v_m11) { mat_2.v_m12) { mat_2.v_m13) { mat_2.v_m21) { mat_2.v_m22) { mat_2.v_m23) { mat_2.v_m31) { mat_2.v_m32) { mat_2.v_m33) ¢ return egalite; 3 3 //end struct Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (175) Pour pouvoir tester directement I’égalité de matrices par I'écriture mat_1 mat_2, on ajoute une surcharge de l'opérateur "==" (opérateur d'égalité) pour comparer les 9 coefficients un a un des deux matrices. public struct D2Matrice3x3 { //surcharge opérateur == pour I'égalité de matrices public static bool operator ==(D2Matrice3x3 mat_1, D2Matrice3x3 mat_2) { bool egalite = false; if (mat_1.v_m11 if (mat_1.v_m12 if (mat_1.v_m1. if (mat_1.v_m21 = if (mat_t.v_m22 if (mat_1.v_m23 if (mat_t.v_m31 if (mat_1.v_m32 = if (mat_ egalite mat_2.v_m11) { mat_2.v_m12) { mat_2.v_m13) { mat_2.v_m21) { mat_2.v_m22) { mat_2.v_m23) € mat_2.v_m31) { mat_2.v_m32) { mat_2.v_m33) { return egalite; } 3 //end struct Pour pouvoir tester directement I'inégalité de matrices par l'écriture mat_1 /= mat_2, on ajoute une surcharge de l'opérateur "!=" (opérateur d'inégalité) pour comparer les deux matrices. Deux matrices mat_1 et mat_2 qui sont inégales c'est vérifier qu'elles ne sont pas égales d'ou le retour du test /(mat_1 == mat_2). public struct D2Matrice3x3 { //surcharge opérateur != pour l'inégalité de matrices public static bool operator !=(D2Matrice3x3 mat_1, D2Matrice3x3 mat_2) { return !(mat_1 == mat_2); } 3 //end struct On complete le principe de I'égalité des matrices en redéfinissant la méthode héritée Equals pour la comparaison d'objets de type D2Matrice3x3. (176) IUT Informatique - DUT / BTS / Licence public struct D2Matrice3x3 { //méthode redéfinie de I'égalité d’objet public override bool Equals(object obj) ¢ if (obj == null || !(obj is D2Matrice3x3)) { return false; 3 D2Matrice3x3 matrice = (D2Matrice3x3)obj; return [Link](this, matrice); } 3 //end struct 1.9 - Inverser une matrice En mathématiques et plus particuligrement en algébre linéaire, une matrice carrée Md'ordre n est dite inversible (ou réguliére ou encore non singuliére) s'il existe une matrice M" d'ordre n, appelée matrice inverse de M telle que M*M'=M'* M=M, avec M,, étant la matrice identité. Une matrice carrée qui n'est pas inversible est dite non inversible ou singuliére. On démontre qu'une matrice carrée a coefficients dans un corps commutatif est inversible si et seulement si son déterminant est non nul. Le procédé d'inversion de matrice est assez simple mais il nécessite plusieurs étapes que nous allons détailler. Une matrice 3x3 peut étre inversée uniquement si son déterminant est non nul. On commence par ajouter a la structure D2Matrice3x3 une méthode d'instance booléenne Est/nversible pour déterminer si l'instance en cours de la matrice peut étre inversée. Son implémentation consiste a calculer le déterminant de l'instance en cours par la méthode d'instance Determinant et a vérifier que la valeur du déterminant n'est pas nulle. public struct D2Matrice3x3 { //matrice est inversible ou pas public bool EstInversible() { bool retour = false; if (this. Determinant() != 0.0) retour = true; 3 return retour; + 3 //end struct Pour trouver la matrice inversée M* d'une matrice initiale M, on compose une Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (177) matrice (figure 4.16) ou le coefficient m17 est égal a la valeur +det(cofacteurs de m1), le coefficient m12 est égal a la valeur -det(cofacteurs de m12), le coefficient m13 est égal a la valeur +det(cofacteurs de m713), le coefficient m21 est égal a la valeur -det(cofacteurs de m21), le coefficient m22 est égal a la valeur +det(cofacteurs de m22), le coefficient m23 est égal a la valeur -det(cofacteurs de m23), le coefficient m31 est égal a la valeur +det(cofacteurs de m31), le coefficient m32 est égal a la valeur -det(cofacteurs de m32), et le coefficient m33 est égal a la valeur +det(cofacteurs de m33). Le sigle det signifie le calcul du déterminant. FIGURE 4.16 Fedet(cofacteurs de mil) = det(cofacteurs dem12)_ edet(cofacteurs de m13) = det(cofacteurs de m21) 4 det(cofacteurs dem22) = det(cofacteurs de m23) Fdet(cofacteurs dem31) = det(cofacteurs de m32) — f-det(cofacteurs de m33) +(m22 * m33 - m32* 23) -(m21*m33-m31* m23)_—_+(m21 * m32 -m31* m22) “(rn 12 * m33 ~ m32* M13) (m7 * m33- M31 * M13) -(m11 * m32- m31* M12) +(m12* m23 - m22* 13) -(m11* m23-m21* m13)_—-+(mI7* M22 -m27* M12) mii omi2 mi3 mi mi2) m3 mit mi2 m13 m21 m22- m23 m21 m22. m23 m2i m22 m23 m31 m320 m33 m31 m32 = -m33 m31 m32 m33 cofacteur | 22 m23 cofacteur | m21_ m23 cofacteur | m21_ m22 demi1 m32 m33 demi2 m31 m33 lem13 m31_ m32 mit m12— m13 mit m12— m13 m1 m12 m13 m21 m22 m21 m22 m23 mat m22 —-m23 m31m32_—m33 m31 m3 m31-m32_—-m33 cofacteur | m12_m13 cofacteur | m11_m13 cofacteur | ™11_ m12 dem21 m32_ m33 dem22 m31_ m33 de m23 m31_ m32 mit mi2— m13 mit omi2— m3 mi m12— m13 m21 m22 m23 m2t m22_ m2: mi m22— m23 m31 = m320—m33 m31 m32——sm3. m31 m32—-m33 cofacteur | 12 m13 cofacteur | 11 m13 cofacteur mit mi2 dem31 | mae m23 dem32 | mai m23 dem33 | m21 maz (va) Ensuite on divise chaque coefficient de la matrice par la valeur du déterminant det(M) de la matrice initiale M (figure 4.17). UT Informatique - DUT / BTS / Licence FIGURE 4.17 # det(cofacteurs dem11) = det(cofacteurs demi2) + det(cofacteurs de m13) Hdet(M) Het(M) /det(M) = det(cofacteurs de m21) det(cofacteurs de m22) = det(cofacteurs de m23) Zéet(M) Héet(M) /det(M) $ det(cofacteurs dem31) = det(cofacteurs dem32) det(cofacteurs de m33) Hdet(M) Hdet(M) /det(M) #(m22 *m33-m32* 23) -(m21*m33-m31*m23)——-+(m2T * m32 - m31 * m2) /det(M) ‘Hdet(M) det) -(m12* m33 ~m32* M13) +(mI1*m33-~m31* M13) ~(m1T * 32-37 * M12) /det(M) /det(t) /det(M) +(m12* m23-m22*m13) (m1 * m23-m21*m13)_—+(m11* m22 - maT * 12) Zdet(™) /det(M) /det(M) Et on termine en effectuant une transposition dela matrice. La matrice ainsi obtenue est une matrice inversée M" correspondant a la matrice initiale M. Dans la structure D2Matrice3x3, on ajoute une méthode d'instance /nverser qui inverse la matrice en cours si cette derniére est inversible en suivant les explications ci-dessus. Dans l'implémentation de l'inversion, on utilise la méthode d'instance Estinversible pour déterminer si la matrice peut étre inversée, la méthode d'instance Determinant pour calculer la valeur du déterminant et la méthode d'instance Transposer pour transposer la matrice en cours. public struct D2Matrice3x3 { //inverser une matrice public void Inverser() { if ([Link]() == true) { double det_mat = [Link](); //+(m22 * m33 - m32 * m23)/det(M) double ci1 = +(v_m22 * v_m33 - v_m32 * v_m23) / det_mat; //-(m21 * m33 - m31 * m23)/det(M) double c12 = -(v_m21 * v_m33 - v_m31 * v_m23) / det_mat; //+(m21 * m32 = m31 *m22)/det(M) double c13 = +(v_m21 * v_m32 - v_m31 * v_m22) / det_mat; //-(m12 * m33 - m32 * m13)/det(M) double c21 = -(v_m12 * v_m33 - v_m32 * v_m13) / det_mat; //+(m14 * m33 - m3L * m13)/det(M) double c22 = +(v_m11 * v_m33 - v_m31 * v_m13) / det_mat; //-(m11 * m32 - m31 * m12)/det(M) double c23 = -(v_m11 * v_m32- v_m31 * v_m12) / det_mat; Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (179) //+(m12 * m23 - m22 * m13)/det(M) double c31 = +(v_m12 * v_m23 - v_m22 * v_m13) / det_mat; //-(m11 * m23 - m21 * m13)/det(M) double c32 = -(v_m11 * v_m23 - v_m21 * v_m13) / det_mat; //+(m11 * m22 ~ m21 * m12)/det(M) double c33 = +(v_m11 * v_m22 - v_m21 * v_m12) / det_mat; vimi1 = cll; vim12 = 12; vim13 = 13; v_m2i = c21; vim22 = c22; v_m23 = ¢23; vim31 = ¢31; v_m32 = ¢32; v_m33 = 33; this. Transposer(); , }/jend struct Le septiéme choix du sélecteur, intitulé "07 - inverser une matrice quand c'est possible", permet de réaliser des manipulations sur I'inversion d'une matrice 3x3 de type D2Matrice3x3. La figure 4.18 montre le résultat obtenu. On instancie une matrice mat_1 par D2Matrice3x3 mat_1 = new D2Matrice3x3(-3, 5, 6, -1, 2, 2, 1, -1, -1) et on vérifie si c'est une matrice inversible par la méthode d'instance Estinversible. Si mat_1 est inversible, on clone mat_1 en mat_1_ inverser par D2Matrice3x3 mat_1_inverser = mat_1.Cloner(). On inverse la matrice mat_1_inverser par application de la méthode d'instance /nverser avec I'écriture mat_1_inverser Inverser(). Si on effectue les produits matriciels D2Matrice3x3 produit_sens_1 = mat_1 * mat_1_inverser et D2Matrice3x3 produit_sens_2 = mat_1_inverser * mat_1, on trouve alors que les matrices produit_sens_1 et produit_sens_2 sont des matrices de type matrice identité. Pour tester si une matrice est une matrice identité, on applique la méthode d'instance booléenne Estldentite. public struct D2Matrice3x3 { //matrice est une matrice identité ou pas public bool EstIdentite() { bool retour = false; if (this == D2Matrice3x3.P_Matriceldentite) { retour = true; + return retour; + } 180 )!UT Informatique - DUT / BTS / Licence FIGURE 4.18 Fichier 07 - inverser une matrice quand c'est possible => on définit une matrice 3x3 mat_1 D2Matrice3x3 mat_1 = new D2Matrice3x3(-3, 5, 6, -1, 2.2.1, [-03,00 05,00 06,00 -01,00 02,00 02,00 01,00 -01,00 -01,00] => on calcule le déterminant de la matrice mat_1 double deter_mat_1 = mat_1.DeterminantO valeur du déterminant = -1 => on vétifie sila matrice mat_1 est inversible bool mat_1_invers = mat_1.EstinversibleQ True: la matrice mat_t est inversible ‘=> on clone mat_1 pour devenir mat_1_inverser D2Matrice3x3 mat_1_inverser = mat_1.Cloner() [-03,00 05,00 06,00 -01,00 02,00 02,00 01,00 -01,00 -01,00) => on calcule la matrice inversible de mat_1_inverser [Link] [00,00 01,00 02,00 -01,00 03,00 00,00 01,00 -02,00 01,00] => on calcule le produit mat_t * mat_t_inverser DaMatrice3x3 produit. sens_1 = matt mat_1_inverser [01,00 00,00 00,00 (00,00 01,00 00,00 (00,00 00,00 01,00 ‘=> on vérifie si produit sens_1 est une matrice identité TRUE: la matrice produit sens_1 est une matrice identité => on calcule le produit mat_1_inverser* mat 1 DaMatrice3x3 produit sens_2 = mat [01,00 00,00 00,00 (00,00 01,00 00,00 00,00 00,00 01,00} => on vérifie si produit_sens.2 est une matrice identité TRUE: la matrice produit sens.2 est une matrice identité Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (781) //07 - inverser une matrice quand c'est possible private void ActionSelection07() { Infos("=> on définit une matrice 3x3 mat_1" + RC); D2Matrice3x3 mat_1 = new D2Matrice3x3(-3, 5, 6, ~1, 2, 2, 1, -1, -1); Infos("D2Matrice3x3 mat_1 = new D2Matrice3x3(-3, 5, 6, -1, 2, 2, 1, -1, -1)" + RC, [Link]); Infos(mat_1.ToString() + RC, [Link]); Infos("=> on calcule le déterminant de la matrice mat_1" + RC); double deter_mat_1 = mat_1.Determinant(, Infos("double deter_mat_1 = mat_1.Determinant()" + RC, [Link]); Infos(“valeur du déterminant = "+ deter_mat_1.ToString() + RC, [Link]); Infos("=> on vérifie si la matrice mat_1 est inversible" + RC); boo! mat_1_invers = mat_1.Estinversible(); Infos("bool mat_1_invers = mat_1.EstInversible()" + RC, [Link]); if (mat_1_invers == true) { Infos(mat_1_invers.ToString() + ": la matrice mat_1 est inversible" + RC, [Link]); } else { Infos(mat_1_invers.ToString() + [Link]); } Infos("=> on clone mat_1 pour devenir mat_1_inverser" + RC); D2Matrice3x3 mat_1_inverser = mat_1.Cloner(); Infos("D2Matrice3x3 mat_1_inverser = mat_1.Cloner()" + RC, [Link]); Infos(mat_1_inverser.ToString() + RC, [Link]); if (mat_1_inverser.EstInversible() == true) { Infos("=> on calcule la matrice inversible de mat_1_inverser" + RC); mat_1_inverser.Inverser(); Infos("mat_1_inverser.Inverser()" + RC, [Link]); Infos(mat_1_inverser.ToString() + RC, [Link]); Infos("=> on calcule le produit mat_1 * mat_1_inverser" + RC); D2Matrice3x3 produit_sens_1 = mat_1 * mat_1i_inverser; Infos("D2Matrice3x3 produit_sens_1 = mat_1 * mat_1_inverser" + RC, [Link]); Infos(produit_sens_1.ToString() + RC, [Link]); Infos("=> on vérifie si produit_sens_1 est une matrice identité” + RC); if (produit_sens_1.EstIdentite() == true) { Infos("TRUE: la matrice produit_sens_1 est une matrice identité" + RC, [Link]); } else { Infos("FALSE: la matrice produit [Link]); o Infos("=> on calcule le produit mat_1_inverser * mat_i" + RC); D2Matrice3x3 produit_sens_2 = mat_i_inverser * mat_1; Infos("D2Matrice3x3 produit_sens_2 = mat_1_inverser * mat_1" + RC, [Link]); Infos(produit_sens_2.ToString() + RC, [Link]); Infos("=> on vérifie si produit_sens_2 est une matrice identité" + RC); if (produit_sens_2.EstIdentite() == true) { Infos("TRUE: la matrice produit_sens_2 est une matrice identité" + RC, [Link]); : la matrice mat_1 n'est pas inversible" + RC, sens_1 n'est pas une matrice identité” + RC, (182) UT Informatique - DUT / BTS / Licence + else { Infos("FALSE: la matrice produit_sens_2 n'est pas une matrice identité” + RC, [Link]); + 3 # 1.10 - Appliquer une matrice 4 un point la matrice 3x3 représente une transformation ou une combinaison de transformations. Si on applique une transformation avec une matrice M de type D2Matrice3x3 a un point initial A(x,y,w) en coordonnées homogénes de type D2PointHomo, on obtient un point B(x‘y',w’) en coordonnées homogeénes de type D2PointHomo apres application de la transformation. La figure 4.19 visualise le détail du calcul a effectuer avec: 2 xSmit*x+m12*y+m13"w 2 y=m21*x+m22"*y+m23*w © w'=m31 *x +m32*y +m33 *w x mito mi2m13 x FIGURE 4.19 y }= omar ma ma faly w m31-m32_——«m33 w point B matrice M point A x! mit m12_m13 x y }=] omar m2z maz J * fy | mm = mit tx + mt2ty + m13 tw w m31-m32_—«m33 w x mito m12 m3 x y J= | mar maz maz fay | > m21*x + m22*y +m23*w w m31m32_—«m33 w x mito m12_m13 y J=]omar m2z max fe Ly] mm w= mat tx + m32 ty + m33*W w m31m32_—-m33 w Dans la structure D2Matrice3x3, on ajoute une méthode statique CalculCoordonnee, qui recoit en paramétre un point de type D2PointHomo et une matrice de type D2Matrice3x3, et qui retourne un point de type D2PointHomo Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (783) par application de la matrice au point. On ajoute aussi une surcharge de l'opérateur "*" (opérateur de multiplication) pour permettre de multiplier directement une variable de type D2Matrice3x3 avec une variable de type D2PointHomo dans cet ordre précis. public struct D2Matrice3x3 { //calculer les coordonnées d'un point en fonction d'une matrice 3x3 public static D2PointHomo CalculCoordonnee(D2PointHomo point, D2Matrice3x3 matrice) { D2PointHomo point_modif = new D2PointHomo(); point_modif.P_X = matrice.v_m11 * point.P_X + matrice.v_m12 * point.P_Y + matrice.v_m13 * point.P_W; point_modif.P_Y = matrice.v_m21 * point.P_X + matrice.v_m22 * point.P_Y + matrice.v_m23 * point.P_W; point_modif.P_W = matrice.v_m31 * point.P_X + matrice.v_m32 * point.P_Y + matrice.v_m33 * point.P_W; return point_modif; } //surcharge de l'opérateur * pour calculer les coordonnées d'un point en fonction d'une /imatrice 3x3 public static D2PointHomo operator *(D2Matrice3x3 mat_1, D2PointHomo pt_1) { D2PointHomo point_modif = new D2PointHomo(); point_modif.P_X = mat_1.v_m11 * pt_1.P_X + mat_1.v_m12 * pt_1.P_Y + mat_1.v_m13 * pt_1.P_W; point_modif.P_Y = mat_1.v_m21 * pt_1.P_X + mat_1.v_m22 ™ pt 1.P_Y + mat_1.v_m23 * pt_1.P_W; point_modif.P_W = mat_1.v_m31 * pt_1.P_X + mat_1.v_m32*pt_1.P_Y + mat_1.v_m33 * pt_1.P_W; return point_modif; } } FIGURE 4.20 08 - calculer les coordonnées d'un point en fonction d'une matrice 3x3 ‘=> on instance pt_a de type D2PointHomo composantes de A -> (2,3,1) => on instancie mat_1 de type D2Matrice3x3 composantes de mat_1 = [01,00 02,00 03,00 01.00 02,00 03,00 01,00 02,00 03,00 => on calcule le nouveau point pt_b = mat_1* pta -omposantes de 8 -> (11,11,11) => on calcule le nouveau point pt_b = [Link](pt_a, mat_t) B-> (111.11) composantes d Le huitieme choix du sélecteur, intitulé "08 - calculer les coordonnées d'un point (184) UT Informatique - DUT / BTS / Licence en fonction d'une matrice 3x3”, permet de trouver un point final par application d'une matrice M a un point initial A. La figure 4.20 montre le résultat obtenu. On instancie un point pt_a de type D2PointHomo par D2PointHomo pt_a = new D2PointHomo(2.0, 3.0, 1.0) et une matrice mat_1 de transformation de type D2Matrice3x3 par D2Matrice3x3 mat_1 = new D2Matrice3x3(1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 1.0, 2.0, 3.0). L'écriture D2PointHomo pt_b = mat_1 * pta permet de trouver le point pt_b de type D2PointHomo par une surcharge de l'opérateur "*" de D2Matrice3x3. L'écriture D2PointHomo pt_b = D2Matrice3x3. CalculCoordonnee(pt_a, mat_1) permet de trouver le point pt_b de type D2PointHomo par la méthode statique D2Matrice3x3. CalculCoordonnee. //08 - calculer les coordonnées d'un point en fonction d'une matrice 3x3 private void ActionSelection08() { Infos("=> on instancie pt_a de type D2PointHomo" + RC); D2PointHomo pt_a = new D2PointHomo(2.0, 3.0, 1.0); Infos(composantes de A -> " + pt_a.ToString() + RC, [Link]); Infos("=> on instancie mat_1 de type D2Matrice3x3" + RC); D2Matrice3x3 mat_1 = new D2Matrice3x3(1.0, 2.0, 3.0, 1.0, 2.0, 3.0, 1.0, 2.0, 3.0); Infos("composantes de mat_1 =" + RC + mat_1.ToString() + RC, [Link]); > on calcule le nouveau point pt_b = mat_1 * pt_a" + RC); D2PointHomo pt_b = mat_1 * pt_a; Infos("composantes de B -> " + pt_b.ToString() + RC, [Link]); Infos("=> on calcule le nouveau point pt_b = [Link](pt_a, mat_1)" + RC); pt_b = [Link](pt_a, mat_1); Infos("composantes de B -> " + pt_b.ToString() + RC, [Link]); 3 2 - La translation avec une matrice 3x3 Au précédent paragraphe, nous avons vu la définition d'une matrice 3x3 avec ses principales méthodes pour des utilisations courantes pour le calcul matriciel. Nous allons utiliser maintenant systématiquement des matrices 3x3 pour réaliser des transformations ainsi que des combinaisons de transformations. Commencons par la transformation de translation qui permet de déplacer, d'une valeur Tx suivant I'axe X et Ty suivant I'axe Y, un point A(x,y,1) en coordonnées homogénes pour donner un point B(x'y,1) en coordonnées homogénes. Pour composer une matrice 3x3 dans le but d'effectuer une translation, on part d'une matrice identité et on personnalise son coefficient m13 avec la valeur Tx et son coefficient m23 avec la valeur Ty. La figure 4.21 visualise une matrice 3x3 générale (cété gauche), une matrice identité (au milieu) et une matrice de translation coté droit. Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (785) FIGURE 4.21 mit mi2 mi3 1 0 oO 1 0 abs m2 m22_—m23 o 14 0 o 4 Vy m3t m32-m33 0 0 1 0 0 1 Matrice 3x3 Matrice identité Matrice de translation de coefficients Tx et Ty Un point B¢x,y;1) est le résultat de l'application d'une matrice de translation, de coefficients Tx et Ty, a un point A(x,y,1) par la relation x'= x + Txet y'=y +Ty (la figure 4.22 détaille le calcul effectué). FIGURE 4.22 point B Matrice de translation point A de coefficients Tx et Ty x 1 0 1 *x) + (Oty) + (#1) y }J=]o 1 ly xly)= O*x) + *y + y*) 1 ° 0 1 1 1 x 1 0 Tk x x= (14x) + *y) +k *1) y}=]o 1 y «ly ]=[y=om+ay+ay*) 1 ° 0 1 1 1 1 0 & x xaxt Tk =]o 1 ly ely]= ytly 1 ° 0 1 1 La solution de projet Matrice3x3_Homogene Translation. sin, placée dans le dossier VS_code_iut_tome_2/11_Matrice3x3_HomogeneTranslation, contient une application qui permet d'appliquer a une figure donnée une translation suivant X et suivant Y. Deux glissiéres permettent de délivrer des coefficients de déplacement a réaliser suivant les axes X et Y. Une zone d'affichage au format texte visualise en temps réel le contenu de la matrice 3x3 de translation appliquée aux points de la figure dessinée. Les figures 4.23 et 4.24 montrent le résultat obtenu: + sur la figure 4.23, la figure dessinée est dans sa position initiale, + sur la figure 4.24 au repére 1, la figure dessinée est déplacée suivant I'axe X d'une valeur de +2.93 unités et suivant l'axe Y d'une valeur de +1.32 unités. + sur la figure 4.24 au repére 2, la figure dessinée est déplacée suivant I'axe X d'une valeur de -4. 15 unités et suivant l'axe Y d'une valeur de -0.83 unités. (188) UT Informatique - DUT / BTS / Licence FIGURE 4.23 7 T T | errr ia i + | | rt —T | | | | 1 | | ; ee ee) Se Se eS | matrice de translation 3x3 => [01,00 00,00 00,00 00,00 01,00 00,00 00,00 00,00 01,00} ‘ensemble de points: (1.9) (21) (2) ea) 1.9) i] Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes FIGURE 4.24 (188) UT Informatique - DUT / BTS / Licence FIGURE 4.25, AY (0,2) B(-2,1) A(-1,0) (1,0) > H(-2;-1) F(2,-1), G(0,-2) AY de coefficients Tx = +6 1 0 +6 0 1 +3 0 oO 1 Comme le schématise le haut de la figure 4.25, on a une figure dessinée composée par les points A(-1,0), B(-2,1), C(0,2), D(2,1), (1,0), F(2,-1), G(0,-2) et H(-2,-1). On compose une matrice de translation de coefficients Tx = +6 et Ty = +3. On obtient une figure translatée comme le montre le bas de la figure 4.24 ott par exemple le point F(2,-1) initial devient aprés translation le point F(8,2) final. D'un point de vue programmation, on stocke dans les variables deplac_x et deplac_y les valeurs des coefficients Tx et Ty de la translation a réaliser. On compose une matrice 3x3 de translation nommée v_mat_3x3_translation en Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (789) partant d'une matrice identité et en personnalisant les propriétés P_IM13 et P_ M23 en fonction des coefficients de la translation a effectuer (valeurs de deplac_x et depiac_y). En parcourant la liste v_liste_d2point des points originaux de la figure, on récupére un point d2point de type D2Point. On transforme un point d2point en un point d2point_homo de type D2PointHomo (point en coordonnées homogénes) en effectuant un cast par |'écriture D2PointHomo d2point_homo = (D2PointHomo)d2point. Par I'écriture d2point_homo = v_mat_3x3_translation * d2point_homo, on trouve les nouvelles coordonnées homogénes du point par application de la translation. A noter que I'écriture d2point_homo = D2Matrice3x3. CalculCoordonnee(d2point_homo, v_mat_3x3_translation) aurait donné la méme chose en utilisant la méthode statique D2Matrice3x3. CalculCoordonnee. L'écriture d2point = (D2Point)d2point_homo permet d'obtenir les coordonnées cartésiennes du point d2point a partir des coordonnées homoganes du point d2point_homo en effectuant un cast. On établit ainsi une nouvelle liste liste_d2point_modifcontenant les points de type D2Point a afficher aprés application de la translation. Par la méthode ViderCollectionPoint, on vide la collection des points de la figure x_figure et par la méthode RemplirCollectionD2Point, on affecte a x_figure une nouvelle collection de points a visualiser. private void AfficherMatrice() { double deplac_x = x_slider_x.Value; double deplac_y = x_slider_y. Value; v_mat_3x3_translation = D2Matrice3x3.P_Matriceldentite; v_mat_3x3_translation.P_M13 = deplac_x; v_mat_3x3_translation.P_M23 = deplac_y; x_tbl_matrice.Text = v_mat_3x3_translation.ToString(); x_figure. ViderCollectionPoint(); List liste_d2point_modif = new List(); for (int xx = 0; xx < v_liste_d2point.Count; xx++) { D2Point d2point = v_liste_d2point{xx]; D2PointHomo d2point_homo = (D2PointHomo)d2point; d2point_homo = v_mat_3x3_translation * d2point_homo; //d2point_homo = [Link](d2point_homo, // v_mat_3x3_translation); d2point = (D2Point)d2point_homo; liste_d2point_modif.Add(d2point); liste_d2point_modif.Add(d2point); } x_figure. RemplirCollectionD 2Point(liste_d2point_modif); } private void x_slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e) { if (v_fen_charge! true) { AfficherMatrice(); }} (120) UT Informatique - DUT / BTS / Licence 3 - La mise G I'échelle avec une matrice 3x3 Dans ce paragraphe, nous effectuons une transformation de mise 4 |'échelle de centre l'origine 0(0,0) et de coefficients de redimensionnement la valeur Sx suivant l'axe X et la valeur Sy suivant I'axe Y. Un point A(x,y,1) en coordonnées homogénes donne un point B(x‘y'1) en coordonnées homogénes apres application d'une matrice Ms de mise a |'échelle, de taille 3x3, par la relation: B = Ms * A. Pour composer une matrice 3x3 dans le but d'effectuer une mise a I'échelle, on part d'une matrice identité et on personnalise son coefficient m17 avec la valeur Sx et son coefficient m22 avec la valeur Sy. La figure 4.26 visualise une matrice 3x3 générale (cété gauche), une matrice identité (au milieu) et une matrice de mise a "échelle cété droit. Un point B(x‘y’,1) est le résultat de l'application d'une matrice de mise a I'échelle, de centre l'origine (0,0) et de coefficients Sx et Sy, a un point A(x,y,1) par la relation x'= Sx *xet y'= Sy *y (le bas de la figure 4.26 détaille le calcul effectué). FIGURE 4.26 mit mi2— mi3 1 ° 0 sx 0 0 m21m22—m23 0 1 0 0 y 0 m31m32—«m33 0 0 1 0 0 1 Matrice 3x3 Matrice identité Matrice de mise a ’échelle de coefficients Sx et Sy Matrice de mise 4 échelle pointB de coefficients Sx et Sy point A Sx 0 0 x x= (Sx *x) + (O*y) + (O*1) y J=]° sy ° * Ly P=] y= O*n+ By*y+ O*1) 1 0 1 1 1 x sx 0 ° x x’ = (Sx*x) + (O*y) + (0* 1) yj=lo os «fy |] =[ y= + Gy*ys or) 1 0 1 1 x sx 0 ° x x= SK*K y J= sy oO *Ly }= [yeasty 1 0 1 1 1 La solution de projet Matrice3x3_HomogeneEchelle. sin, placée dans le dossier VS_ code_iut_tome_2/12_Matrice3x3_HomogeneEchelle, contient une application qui Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (791) permet d'appliquer a une figure donnée une mise a I'échelle de centre l'origine 0(0,0) et de coefficient Sx suivant l'axe X et de coefficient Sy suivant I'axe Y. Deux glissiéres permettent de délivrer des coefficients de redimensionnement a réaliser suivant les axes X et Y. Une zone d'affichage au format texte visualise en temps réel le contenu de la matrice 3x3 de mise a I'échelle appliquée aux points de la figure dessinée. Les figures 4.27, 4.28 et 4.29 montrent le résultat obtenu: * sur la figure 4.27, la figure dessinée est dans sa position initiale. + sur la figure 4,28 au repére 1, la figure dessinée est redimensionnée suivant l'axe X d'une valeur de +2.33 unités et suivant l'axe Y d'une valeur de +7.00 unités, + sur la figure 4,28 au repére 2, la figure dessinge est redimensionnée suivant l'axe X d'une valeur de +7.00 unités et suivant l'axe Y d'une valeur de +2.24 unités, + sur la figure 4,29 au repére 3, la figure dessinée est redimensionnée suivant l'axe X d'une valeur de +2.26 unités et suivant l'axe Y d'une valeur de +0.29 unités, Comme le schématise le haut de la figure 4.30, on a une figure dessinée composée par les points A(-3,0), B(-1,1), C(0,3), D(1,1), E(3,0), F(1,-1), G(0,-3) et H(-1,-1). On compose une matrice de mise a I'échelle de centre O(0,0) et de coefficients Sx = +3 et Sy = +2. On obtient une figure redimensionnée comme le montre le bas de la figure 4.30 ot par exemple le point F(1,-1) initial devient apras la mise a I'échelle le point F(3,-2) final. D'un point de vue programmation, on stocke dans les variables echelle_x et echelle_y les valeurs des coefficients Sx et Sy de la mise a I'échelle a réaliser. On compose une matrice 3x3 de mise a l'échelle nommée v_mat_3x3_echelle en partant d'une matrice identité et en personnalisant les propriétés P_M11 et P_M22 en fonction des coefficients de la mise a l'échelle a effectuer (valeurs de echelle_x et echelle_y). En parcourant la liste v_liste_d2point des points originaux de la figure, on récupere un point d2point de type D2Point. On transforme un point d2point en un point d2point_homo de type D2PointHomo (point en coordonnées homogénes) en effectuant un cast par I'écriture D2PointHomo d2point_homo = (D2PointHomo) d2point. Par l'écriture d2point_homo = v_mat_3x3_echelle * d2point_homo, on trouve les nouvelles coordonnées homogenes du point par application de la mise & I'échelle. A noter que |'écriture d2point_homo = D2Matrice3x3. CalculCoordonnee(d2point_homo, v_mat_3x3_echelle) aurait donné la méme chose en utilisant la méthode statique D2Matrice3x3. CalculCoordonnee. L'écriture d2point = (D2Point)d2point_homo permet d'obtenir les coordonnées cartésiennes (2) FIGURE 4.27 UT Informatique - DUT / BTS / Licence “3 redimensionnement suivant¥=1.00 +3 matrice de mise & échelle 3x3 => 90,00 01,00 00,00 [01,00 00,00 00,00 00,00 00,00 01,00] x x 0 0 x yp=}o 5 0 Taly 1 oo 4 1 ‘ensemble de points: Go cu) (03) (a) Go) Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogeénes FIGURE 4.28 | matrice de mise & I’échelle 3x3 => (14) FIGURE 4.29 UT Informatique - DUT / BTS / Licence “3. redimensionnement suivantX= 226 +3 “3 redimensionnement suivant Y = 0.29 ed [02 | ee eed [02,26 00,00 00,00 matrice de mise & échelle 3x3 => 90,00 00,29 00,00 00,00 00,00 01,00} (st) ensemble de points: Copyright 2016 Patrice REY Chapitre 4 Les transformations en coordonnées homogénes (795) FIGURE 4.30 x £(3,0) G(0,-3) ‘matrice de mise 6 léchelle de centre lorigine 0(0,0) et de coefficients Sx = +3 et Sy = +2 43 du point d2point a partir des coordonnées homogénes du point d2point_homo en effectuant un cast. On établit ainsi une nouvelle liste liste_d2point_modifcontenant les points de type D2Point 8 afficher aprés application de la mise a I'échelle. Par la méthode ViderCollectionPoint, on vide la collection des points de la figure x_figure et par la méthode RemplirCollectionD2Point, on affecte a x_figure une nouvelle collection de points a visualiser. (196) IUT Informatique - DUT / BTS / Licence private void AfficherMatrice() { double echelle_x = x_slider_x.Value; double echelle_y = x_slider_y.Value; v_mat_3x3_echelle = D2Matrice3x3.P_Matriceldentite; v_mat_3x3_echelle.P_M11 = echelle_x; v_mat_3x3_echelle.P_M22 = echelle_y; x_tbl_matrice. Text = v_mat_3x3_echelle.ToString(); x_figure. ViderCollectionPoint(); List liste_d2point_modif = new List(); for (int xx = 0; xx < v_liste_d2point.Count; xx++) { D2Point d2point = v_liste_d2point[xx]; D2PointHomo d2point_homo = (D2PointHomo)d2point; //d2point_homo = [Link](d2point_homo, // v_mat_3x3_echelle); d2point_homo = v_mat_3x3_echelle * d2point_homo; d2point = (D2Point)d2point_homo; liste_d2point_modif.Add(d2point); } x_figure. RemplirCollectionD 2Point(liste_d2point_modif); 3 4 - Le cisaillement avec une matrice 3x3 Dans ce paragraphe, nous effectuons une transformation de cisaillement de centre l'origine 0(0,0) et de coefficients de valeur Cx suivant l'axe X et de valeur Cy suivant l'axe Y. Le cisaillement est utile pour créer l'illusion de profondeur tridimensionnelle dans un objet 2D, il représente une inclinaison 2D. Un point A(xy,1) en coordonnées homogénes donne un point B(x’y,1) en coordonnées homogenes aprés application d'une matrice Mc de cisaillement, de taille 3x3, par la relation: B = Mc * A. Pour composer une matrice 3x3 dans le but d'effectuer un cisaillement, on part d'une matrice identité et on personalise son coefficient m12 avec la valeur Cx et son coefficient m21 avec la valeur Cy. La figure 4.31 visualise une matrice 3x3 générale (cdté gauche), une matrice identité (au milieu) et une matrice de cisaillement cété droit. FIGURE 4.31 mit m12 m13 1 0 o 1 fog m21 m22_—m23 0 1 ° Gy 1 Matrice 3x3 Matrice identité Matrice de cisaillement de coefficients Cx et Cy Un point B(x‘y’, 1) est le résultat de 'application d'une matrice de cisaillement, de Copyright 2016 Patrice REY

Vous aimerez peut-être aussi