gKit2 light
Public Member Functions | Public Attributes | List of all members

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. More...
 
 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 derniere ligne. More...
 
 Transform (const vec4 &x, const vec4 &y, const vec4 &z, const vec4 &w)
 constructeur a partir de 4 colonnes More...
 
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. More...
 
vec4 column (const unsigned id) const
 renvoie une colonne. More...
 
vec4 column (const unsigned id)
 renvoie une colonne. More...
 
Transformrow (const unsigned id, const float t0, const float t1, const float t2, const float t3)
 initialise une ligne de la matrice. More...
 
vec4 row (const unsigned id) const
 renvoie une ligne. More...
 
vec4 row (const unsigned id)
 renvoie une ligne. More...
 
Transformcolumn_major (const float matrix[16])
 initialise la matrice avec 16 floats organises par colonne. More...
 
Transformrow_major (const float matrix[16])
 initialise la matrice avec 16 floats organises par ligne. More...
 
Vector operator[] (const unsigned c) const
 renvoie le Vector colonne c de la matrice More...
 
Point operator() (const Point &p) const
 renvoie le point transforme. More...
 
Vector operator() (const Vector &v) const
 renvoie le vecteur transforme. More...
 
vec4 operator() (const vec4 &v) const
 renvoie le point/vecteur homogene transforme. More...
 
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))); More...
 
Transform transpose () const
 renvoie la transposee de la matrice. More...
 
Transform inverse () const
 renvoie l'inverse de la matrice. More...
 
Transform normal () const
 renvoie la transformation a appliquer aux normales d'un objet transforme par la matrice m. More...
 
const float * data () const
 renvoie l'adresse de la premiere valeur de la matrice. More...
 

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 derniere 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 32 of file mat.cpp.

33 {
34  m[0][id]= t0;
35  m[1][id]= t1;
36  m[2][id]= t2;
37  m[3][id]= t3;
38  return *this;
39 }

◆ column() [2/3]

vec4 Transform::column ( const unsigned  id) const

renvoie une colonne.

Definition at line 41 of file mat.cpp.

42 {
43  assert(id < 4);
44  return vec4(m[0][id], m[1][id], m[2][id], m[3][id]);
45 }
vecteur generique 4d, ou 3d homogene, utilitaire.
Definition: vec.h:168

◆ column() [3/3]

vec4 Transform::column ( const unsigned  id)

renvoie une colonne.

Definition at line 47 of file mat.cpp.

48 {
49  assert(id < 4);
50  return vec4(m[0][id], m[1][id], m[2][id], m[3][id]);
51 }

◆ 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 54 of file mat.cpp.

55 {
56  m[id][0]= t0;
57  m[id][1]= t1;
58  m[id][2]= t2;
59  m[id][3]= t3;
60  return *this;
61 }

◆ row() [2/3]

vec4 Transform::row ( const unsigned  id) const

renvoie une ligne.

Definition at line 63 of file mat.cpp.

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

◆ row() [3/3]

vec4 Transform::row ( const unsigned  id)

renvoie une ligne.

Definition at line 69 of file mat.cpp.

70 {
71  assert(id < 4);
72  return vec4(m[id][0], m[id][1], m[id][2], m[id][3]);
73 }

◆ column_major()

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

initialise la matrice avec 16 floats organises par colonne.

Definition at line 76 of file mat.cpp.

77 {
78  for(int i= 0; i < 4; i++)
79  column(i, matrix[4*i], matrix[4*i+1], matrix[4*i+2], matrix[4*i+3]);
80  return *this;
81 }
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:32

◆ row_major()

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

initialise la matrice avec 16 floats organises par ligne.

Definition at line 83 of file mat.cpp.

84 {
85  for(int i= 0; i < 4; i++)
86  row(i, matrix[4*i], matrix[4*i+1], matrix[4*i+2], matrix[4*i+3]);
87  return *this;
88 }
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:54

◆ 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 }
representation d'un vecteur 3d.
Definition: vec.h:59

◆ 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 }
representation d'un point 3d.
Definition: vec.h:21

◆ 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
representation d'une transformation, une matrice 4x4, organisee par ligne / row major.
Definition: mat.h:21

◆ 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]; }

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