7.1.10 Définition d'une matrice nulle et d'une matrice identité

Nous allons définir une matrice nulle et une matrice identité pour ne pas avoir à nous trimbaler l'initialisation d'une matrice à chaque foins qu'on en aura besoin :

1
2
3
4
///définition d'une Matrice NULLE
extern const Matrice4 MAT4_NULL;
///définition d'une Matrice IDENTITÉ
extern const Matrice4 MAT4_ID;

Et nous rajoutons le tout dans le fichier Matrice4.h :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#ifndef ___Matrice4_H__
#define ___Matrice4_H__

#include <math.h>
#include <iostream>
#include "Vecteur4.h"

void produitVectoriel(float & x, float & y, float & z, float x1, float y1, float z1, float x2, float y2, float z2);
void normaliseVecteur(float & x, float & y, float & z);

class Matrice4{
	public:
		Matrice4();
		Matrice4(const Vecteur4 & v1, const Vecteur4 & v2, const Vecteur4 & v3, const Vecteur4 & v4);
		Matrice4(float x1, float y1, float z1, float t1,
			float x2, float y2, float z2, float t2,
			float x3, float y3, float z3, float t3,
			float x4, float y4, float z4, float t4
		);
		Matrice4(const Matrice4 & other);
		virtual ~Matrice4();
		
		void setMatrice4(const Vecteur4 & v1, const Vecteur4 & v2, const Vecteur4 & v3, const Vecteur4 & v4);
		void setMatrice4(float x1, float y1, float z1, float t1,
			float x2, float y2, float z2, float t2,
			float x3, float y3, float z3, float t3,
			float x4, float y4, float z4, float t4
		);
		
		void loadIdentity();
		void loadNull();
		void translated(float x, float y, float z);
		void scale(float x, float y, float z);
		void rotateRad(float angle, float x, float y, float z);
		void rotateDeg(float angle, float x, float y, float z);
		void perspectiveRad(float angle, float ratio, float near, float far);
		void perspectiveDeg(float angle, float ratio, float near, float far);
		void lookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ);
		
		bool push();
		bool pop();
		void depiler();
		
		float * getValue() const;
		
		//Les opérateurs de la classe Matrice4
		Matrice4 & operator = (const Matrice4 & other);
		Matrice4 & operator - ();
		Matrice4 & operator -= (const Matrice4 & other);
		Matrice4 & operator += (const Matrice4 & other);
		Matrice4 & operator *= (const Matrice4 & other);
		Matrice4 & operator *= (float nb);
		Matrice4 & operator /= (float nb);

		//Les opérateurs amis de la classe Matrice4
		friend bool operator == (const Matrice4 & other1, const Matrice4 & other2);
		friend bool operator != (const Matrice4 & other1, const Matrice4 & other2);
		friend Matrice4 operator + (const Matrice4 & other1, const Matrice4 & other2);
		friend Matrice4 operator - (const Matrice4 & other1, const Matrice4 & other2);
		friend Matrice4 operator * (const Matrice4 & other1, const Matrice4 & other2);
		friend Matrice4 operator * (float nb, const Matrice4 & other1);
		friend Matrice4 operator * (const Matrice4 & other1, float nb);
		friend Vecteur4 operator * (const Matrice4 & matrice, const Vecteur4 & vecteur);
		friend Matrice4 operator / (const Matrice4 & other1, float nb);
		
		friend std::ostream & operator << (std::ostream & out, const Matrice4 & matrice);
		
	private:
		void initialisationMatrice4(const Vecteur4 & v1, const Vecteur4 & v2, const Vecteur4 & v3, const Vecteur4 & v4);
		void initialisationMatrice4(float x1, float y1, float z1, float t1,
						float x2, float y2, float z2, float t2,
						float x3, float y3, float z3, float t3,
						float x4, float y4, float z4, float t4
		);
		void createMatrice4();
		void copyMatrice4(const Matrice4 & other);
		
		float * p_mat;
		Matrice4 *p_sauvegardePrecedente;
		
};

///définition d'une Matrice NULLE
extern const Matrice4 MAT4_NULL;
///définition d'une Matrice IDENTITÉ
extern const Matrice4 MAT4_ID;

#endif //classe Matrice4

Et voilà pour le fichier Matrice4.h.