gKit2 light
Loading...
Searching...
No Matches

representation d'une transformation, une matrice 4x4, organisee par ligne / row major. More...

#include <mat.h>

Public Member Functions

 Transform (const float t00=1, const float t01=0, const float t02=0, const float t03=0, const float t10=0, const float t11=1, const float t12=0, const float t13=0, const float t20=0, const float t21=0, const float t22=1, const float t23=0, const float t30=0, const float t31=0, const float t32=0, const float t33=1)
 constructeur.
 Transform (const Vector &x, const Vector &y, const Vector &z, const Vector &w)
 constructeur a partir de 4 Vector colonnes, met (0, 0, 0, 1) dans la 4e ligne
 Transform (const vec4 &x, const vec4 &y, const vec4 &z, const vec4 &w)
 constructeur a partir de 4 colonnes
Transformcolumn (const unsigned id, const float t0, const float t1, const float t2, const float t3)
 initialise une colonne de la matrice a partir de 4 floats.
vec4 column (const unsigned id) const
 renvoie une colonne.
vec4 column (const unsigned id)
 renvoie une colonne.
Transformrow (const unsigned id, const float t0, const float t1, const float t2, const float t3)
 initialise une ligne de la matrice.
vec4 row (const unsigned id) const
 renvoie une ligne.
vec4 row (const unsigned id)
 renvoie une ligne.
Transformcolumn_major (const float matrix[16])
 initialise la matrice avec 16 floats organises par colonne.
Transformrow_major (const float matrix[16])
 initialise la matrice avec 16 floats organises par ligne.
Vector operator[] (const unsigned c) const
 renvoie le Vector colonne c de la matrice
Point operator() (const Point &p) const
 renvoie le point transforme.
Vector operator() (const Vector &v) const
 renvoie le vecteur transforme.
vec4 operator() (const vec4 &v) const
 renvoie le point/vecteur homogene transforme.
Transform operator() (const Transform &b) const
 renvoie la composition de la transformation this et b, t = this * b. permet de transformer un point sans "ambiguite" Point q= a(b(c(p)));
Transform transpose () const
 renvoie la transposee de la matrice.
Transform inverse () const
 renvoie l'inverse de la matrice.
Transform normal () const
 renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.
const float * data () const
 renvoie l'adresse de la premiere valeur de la matrice.

Public Attributes

float m [4][4]

Detailed Description

representation d'une transformation, une matrice 4x4, organisee par ligne / row major.

Definition at line 20 of file mat.h.

Constructor & Destructor Documentation

◆ Transform() [1/3]

Transform::Transform ( const float t00 = 1,
const float t01 = 0,
const float t02 = 0,
const float t03 = 0,
const float t10 = 0,
const float t11 = 1,
const float t12 = 0,
const float t13 = 0,
const float t20 = 0,
const float t21 = 0,
const float t22 = 1,
const float t23 = 0,
const float t30 = 0,
const float t31 = 0,
const float t32 = 0,
const float t33 = 1 )

constructeur.

Definition at line 20 of file mat.cpp.

25{
26 m[0][0]= t00; m[0][1]= t01; m[0][2]= t02; m[0][3]= t03;
27 m[1][0]= t10; m[1][1]= t11; m[1][2]= t12; m[1][3]= t13;
28 m[2][0]= t20; m[2][1]= t21; m[2][2]= t22; m[2][3]= t23;
29 m[3][0]= t30; m[3][1]= t31; m[3][2]= t32; m[3][3]= t33;
30}

◆ Transform() [2/3]

Transform::Transform ( const Vector & x,
const Vector & y,
const Vector & z,
const Vector & w )

constructeur a partir de 4 Vector colonnes, met (0, 0, 0, 1) dans la 4e ligne

Definition at line 90 of file mat.cpp.

91{
92 m[0][0] = x.x; m[0][1] = y.x; m[0][2] = z.x; m[0][3] = w.x;
93 m[1][0] = x.y; m[1][1] = y.y; m[1][2] = z.y; m[1][3] = w.y;
94 m[2][0] = x.z; m[2][1] = y.z; m[2][2] = z.z; m[2][3] = w.z;
95 m[3][0] = 0; m[3][1] = 0; m[3][2] = 0; m[3][3] = 1;
96}

◆ Transform() [3/3]

Transform::Transform ( const vec4 & x,
const vec4 & y,
const vec4 & z,
const vec4 & w )

constructeur a partir de 4 colonnes

Definition at line 98 of file mat.cpp.

99{
100 m[0][0] = x.x; m[0][1] = y.x; m[0][2] = z.x; m[0][3] = w.x;
101 m[1][0] = x.y; m[1][1] = y.y; m[1][2] = z.y; m[1][3] = w.y;
102 m[2][0] = x.z; m[2][1] = y.z; m[2][2] = z.z; m[2][3] = w.z;
103 m[3][0] = x.w; m[3][1] = y.w; m[3][2] = z.w; m[3][3] = w.w;
104}

Member Function Documentation

◆ column() [1/3]

Transform & Transform::column ( const unsigned id,
const float t0,
const float t1,
const float t2,
const float t3 )

initialise une colonne de la matrice a partir de 4 floats.

Definition at line 46 of file mat.cpp.

47{
48 m[0][id]= t0;
49 m[1][id]= t1;
50 m[2][id]= t2;
51 m[3][id]= t3;
52 return *this;
53}

◆ column() [2/3]

vec4 Transform::column ( const unsigned id) const

renvoie une colonne.

Definition at line 55 of file mat.cpp.

56{
57 assert(id < 4);
58 return vec4(m[0][id], m[1][id], m[2][id], m[3][id]);
59}

◆ column() [3/3]

vec4 Transform::column ( const unsigned id)

renvoie une colonne.

Definition at line 61 of file mat.cpp.

62{
63 assert(id < 4);
64 return vec4(m[0][id], m[1][id], m[2][id], m[3][id]);
65}

◆ row() [1/3]

Transform & Transform::row ( const unsigned id,
const float t0,
const float t1,
const float t2,
const float t3 )

initialise une ligne de la matrice.

Definition at line 68 of file mat.cpp.

69{
70 m[id][0]= t0;
71 m[id][1]= t1;
72 m[id][2]= t2;
73 m[id][3]= t3;
74 return *this;
75}

◆ row() [2/3]

vec4 Transform::row ( const unsigned id) const

renvoie une ligne.

Definition at line 77 of file mat.cpp.

78{
79 assert(id < 4);
80 return vec4(m[id][0], m[id][1], m[id][2], m[id][3]);
81}

◆ row() [3/3]

vec4 Transform::row ( const unsigned id)

renvoie une ligne.

Definition at line 83 of file mat.cpp.

84{
85 assert(id < 4);
86 return vec4(m[id][0], m[id][1], m[id][2], m[id][3]);
87}

◆ column_major()

Transform & Transform::column_major ( const float matrix[16])

initialise la matrice avec 16 floats organises par colonne.

Definition at line 32 of file mat.cpp.

33{
34 for(int i= 0; i < 4; i++)
35 column(i, matrix[4*i], matrix[4*i+1], matrix[4*i+2], matrix[4*i+3]);
36 return *this;
37}
Transform & column(const unsigned id, const float t0, const float t1, const float t2, const float t3)
initialise une colonne de la matrice a partir de 4 floats.
Definition mat.cpp:46

◆ row_major()

Transform & Transform::row_major ( const float matrix[16])

initialise la matrice avec 16 floats organises par ligne.

Definition at line 39 of file mat.cpp.

40{
41 for(int i= 0; i < 4; i++)
42 row(i, matrix[4*i], matrix[4*i+1], matrix[4*i+2], matrix[4*i+3]);
43 return *this;
44}
Transform & row(const unsigned id, const float t0, const float t1, const float t2, const float t3)
initialise une ligne de la matrice.
Definition mat.cpp:68

◆ operator[]()

Vector Transform::operator[] ( const unsigned c) const

renvoie le Vector colonne c de la matrice

Definition at line 106 of file mat.cpp.

107{
108 assert(c < 4);
109 return Vector(m[0][c], m[1][c], m[2][c]);
110}

◆ operator()() [1/4]

Point Transform::operator() ( const Point & p) const

renvoie le point transforme.

Definition at line 114 of file mat.cpp.

115{
116 float x= p.x;
117 float y= p.y;
118 float z= p.z;
119
120 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3]; // dot(vec4(m[0]), vec4(p, 1))
121 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3]; // dot(vec4(m[1]), vec4(p, 1))
122 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3]; // dot(vec4(m[2]), vec4(p, 1))
123 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3]; // dot(vec4(m[3]), vec4(p, 1))
124
125 assert(wt != 0);
126 float w= 1.f / wt;
127 if(wt == 1.f)
128 return Point(xt, yt, zt);
129 else
130 return Point(xt*w, yt*w, zt*w);
131}

◆ operator()() [2/4]

Vector Transform::operator() ( const Vector & v) const

renvoie le vecteur transforme.

Definition at line 134 of file mat.cpp.

135{
136 float x= v.x;
137 float y= v.y;
138 float z= v.z;
139
140 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z; // dot(vec4(m[0]), vec4(v, 0))
141 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z; // dot(vec4(m[1]), vec4(v, 0))
142 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z; // dot(vec4(m[2]), vec4(v, 0))
143 // dot(vec4(m[3]), vec4(v, 0)) == dot(vec4(0, 0, 0, 1), vec4(v, 0)) == 0 par definition
144
145 return Vector(xt, yt, zt);
146}

◆ operator()() [3/4]

vec4 Transform::operator() ( const vec4 & v) const

renvoie le point/vecteur homogene transforme.

Definition at line 149 of file mat.cpp.

150{
151 float x= v.x;
152 float y= v.y;
153 float z= v.z;
154 float w= v.w;
155
156 float xt= m[0][0] * x + m[0][1] * y + m[0][2] * z + m[0][3] * w; // dot(vec4(m[0]), v)
157 float yt= m[1][0] * x + m[1][1] * y + m[1][2] * z + m[1][3] * w; // dot(vec4(m[1]), v)
158 float zt= m[2][0] * x + m[2][1] * y + m[2][2] * z + m[2][3] * w; // dot(vec4(m[2]), v)
159 float wt= m[3][0] * x + m[3][1] * y + m[3][2] * z + m[3][3] * w; // dot(vec4(m[3]), v)
160
161 return vec4(xt, yt, zt, wt);
162}

◆ operator()() [4/4]

Transform Transform::operator() ( const Transform & b) const

renvoie la composition de la transformation this et b, t = this * b. permet de transformer un point sans "ambiguite" Point q= a(b(c(p)));

Definition at line 175 of file mat.cpp.

176{
177 return compose_transform(*this, b);
178}
Transform compose_transform(const Transform &a, const Transform &b)
renvoie la composition des transformations a et b, t= a * b.
Definition mat.cpp:384

◆ transpose()

Transform Transform::transpose ( ) const

renvoie la transposee de la matrice.

Definition at line 165 of file mat.cpp.

166{
167 return Transform(
168 m[0][0], m[1][0], m[2][0], m[3][0],
169 m[0][1], m[1][1], m[2][1], m[3][1],
170 m[0][2], m[1][2], m[2][2], m[3][2],
171 m[0][3], m[1][3], m[2][3], m[3][3]);
172}
Transform(const float t00=1, const float t01=0, const float t02=0, const float t03=0, const float t10=0, const float t11=1, const float t12=0, const float t13=0, const float t20=0, const float t21=0, const float t22=1, const float t23=0, const float t30=0, const float t31=0, const float t32=0, const float t33=1)
constructeur.
Definition mat.cpp:20

◆ inverse()

Transform Transform::inverse ( ) const

renvoie l'inverse de la matrice.

Definition at line 399 of file mat.cpp.

400{
401 Transform minv= *this;
402
403 int indxc[4], indxr[4];
404 int ipiv[4] = { 0, 0, 0, 0 };
405
406 for (int i = 0; i < 4; i++) {
407 int irow = -1, icol = -1;
408 float big = 0.f;
409
410 // Choose pivot
411 for (int j = 0; j < 4; j++) {
412 if (ipiv[j] != 1) {
413 for (int k = 0; k < 4; k++) {
414 if (ipiv[k] == 0) {
415 if (fabsf(minv.m[j][k]) >= big) {
416 big = std::abs(minv.m[j][k]);
417 irow = j;
418 icol = k;
419 }
420 }
421 else if (ipiv[k] > 1)
422 printf("singular matrix in Transform::inverse()\n");
423 }
424 }
425 }
426
427 assert(irow >= 0 && irow < 4);
428 assert(icol >= 0 && icol < 4);
429
430 ++ipiv[icol];
431 // Swap rows _irow_ and _icol_ for pivot
432 if (irow != icol) {
433 for (int k = 0; k < 4; ++k)
434 std::swap(minv.m[irow][k], minv.m[icol][k]);
435 }
436
437 indxr[i] = irow;
438 indxc[i] = icol;
439 if (minv.m[icol][icol] == 0.)
440 printf("singular matrix in Transform::inverse()\n");
441
442 // Set $m[icol][icol]$ to one by scaling row _icol_ appropriately
443 float pivinv = 1.f / minv.m[icol][icol];
444 minv.m[icol][icol] = 1.f;
445 for (int j = 0; j < 4; j++)
446 minv.m[icol][j] *= pivinv;
447
448 // Subtract this row from others to zero out their columns
449 for (int j = 0; j < 4; j++) {
450 if (j != icol) {
451 float save = minv.m[j][icol];
452 minv.m[j][icol] = 0;
453 for (int k = 0; k < 4; k++)
454 minv.m[j][k] -= minv.m[icol][k]*save;
455 }
456 }
457 }
458
459 // Swap columns to reflect permutation
460 for (int j = 3; j >= 0; j--) {
461 if (indxr[j] != indxc[j]) {
462 for (int k = 0; k < 4; k++)
463 std::swap(minv.m[k][indxr[j]], minv.m[k][indxc[j]]);
464 }
465 }
466
467 return minv;
468}
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition text.cpp:140

◆ normal()

Transform Transform::normal ( ) const

renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m.

Definition at line 181 of file mat.cpp.

182{
183 return inverse().transpose();
184}
Transform inverse() const
renvoie l'inverse de la matrice.
Definition mat.cpp:399
Transform transpose() const
renvoie la transposee de la matrice.
Definition mat.cpp:165

◆ data()

const float * Transform::data ( ) const
inline

renvoie l'adresse de la premiere valeur de la matrice.

Definition at line 75 of file mat.h.

75{ return &m[0][0]; }

Member Data Documentation

◆ m

float Transform::m[4][4]

Definition at line 77 of file mat.h.


The documentation for this struct was generated from the following files: