0 évaluation 0% ont trouvé ce document utile (0 vote) 71 vues 112 pages DUT Informatique - Graphisme 2D
YAML et C# pour deuxième année licence
Copyright
© © All Rights Reserved
Formats disponibles
Téléchargez aux formats PDF ou lisez en ligne sur Scribd
Accéder aux éléments précédents Accéder aux éléments suivants
Enregistrer DUT Informatique - Graphisme 2D pour plus tard
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 REYTous 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 184Table 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 REYLes 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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 REYChapitre 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