16
Matrix3x3(const Matrix3x3<T>&);
22
Matrix3x3<T>& operator = (const Matrix3x3<T>&);
23
t_bool operator == (const Matrix3x3<T>&);
24
Matrix3x3<T> operator * (const Matrix3x3<T>&) const;
25
Matrix3x3<T> operator + (const Matrix3x3<T>&) const;
26
Matrix3x3<T> operator - (const Matrix3x3<T>&) const;
27
Matrix3x3<T>& operator *= (const Matrix3x3<T>&) const;
28
Matrix3x3<T>& operator += (const Matrix3x3<T>&) const;
29
Matrix3x3<T>& operator -= (const Matrix3x3<T>&) const;
31
Matrix3x3<T> operator * (const T&) const;
32
Matrix3x3<T> operator / (const T&) const;
33
Matrix3x3<T>& operator *= (const T&) const;
34
Matrix3x3<T>& operator /= (const T&) const;
36
Vec3<T> operator * (const Vec3<T>&) const;
37
Matrix3x3<T> operator - ();
39
// Get the (i, j) element of the current matrix.
40
T& operator()(unsigned int i, unsigned int j);
41
T operator ()(unsigned int i, unsigned int j) const;
43
T Determinant() const ;
45
Matrix3x3<T> GetInverse() const;
47
//Matrix2x2<T> GetUpper2x2() const;
52
static Matrix3x3<T> IDENTITY();
53
static Matrix3x3<T> ZERO();
58
/***************************************************************************************\
59
Function: Matrix3x3<T>::Matrix3x3
61
Description: Constructor. Initialize the matrix to identity.
68
\***************************************************************************************/
70
Matrix3x3<T>::Matrix3x3()
75
/***************************************************************************************\
76
Function: Matrix3x3<T>::~Matrix3x3
78
Description: Destructor.
85
\***************************************************************************************/
87
Matrix3x3<T>::~Matrix3x3()
92
/***************************************************************************************\
93
Function: Matrix3x3<T>::Matrix3x3
102
\***************************************************************************************/
103
template <typename T>
104
Matrix3x3<T>::Matrix3x3(const Matrix3x3<T>& M)
106
m[0][0] = M.m[0][0]; m[0][1] = M.m[0][1]; m[0][2] = M.m[0][2];
107
m[1][0] = M.m[1][0]; m[1][1] = M.m[1][1]; m[1][2] = M.m[1][2];
108
m[2][0] = M.m[2][0]; m[2][1] = M.m[2][1]; m[2][2] = M.m[2][2];
111
/***************************************************************************************\
112
Function: Matrix3x3<T>::Matrix3x3
116
Parameters: T a00, T a01, T a02,
123
\***************************************************************************************/
125
Matrix3x3<T>::Matrix3x3(
130
m[0][0] = a00; m[0][1] = a01; m[0][2] = a02;
131
m[1][0] = a10; m[1][1] = a11; m[1][2] = a12;
132
m[2][0] = a20; m[2][1] = a21; m[2][2] = a22;
135
/***************************************************************************************\
136
Function: Matrix3x3<T>::operator =
142
Return Value: Matrix3x3<T>.
145
\***************************************************************************************/
146
template <typename T>
147
Matrix3x3<T>& Matrix3x3<T>::operator = (const Matrix3x3<T>& M)
149
m[0][0] = M.m[0][0]; m[0][1] = M.m[0][1]; m[0][2] = M.m[0][2];
150
m[1][0] = M.m[1][0]; m[1][1] = M.m[1][1]; m[1][2] = M.m[1][2];
151
m[2][0] = M.m[2][0]; m[2][1] = M.m[2][1]; m[2][2] = M.m[2][2];
156
template <typename T>
157
t_bool Matrix3x3<T>::operator == (const Matrix3x3<T>& M)
159
for(int i = 0; i < 3; i++)
160
for(int j = 0; j < 3; j++)
162
if(m[i][j] != M.m[i][j])
168
/***************************************************************************************\
169
Function: Matrix3x3<T>::operator *
171
Description: Multiply by matrix iM.
175
Return Value: Matrix3x3<T>.
178
\***************************************************************************************/
179
template <typename T>
180
Matrix3x3<T> Matrix3x3<T>::operator * (const Matrix3x3<T>& iM) const
184
oM.m[0][0] = m[0][0] * iM.m[0][0] + m[0][1] * iM.m[1][0] + m[0][2] * iM.m[2][0];
185
oM.m[1][0] = m[1][0] * iM.m[0][0] + m[1][1] * iM.m[1][0] + m[1][2] * iM.m[2][0];
186
oM.m[2][0] = m[2][0] * iM.m[0][0] + m[2][1] * iM.m[1][0] + m[2][2] * iM.m[2][0];
188
oM.m[0][1] = m[0][0] * iM.m[0][1] + m[0][1] * iM.m[1][1] + m[0][2] * iM.m[2][1];
189
oM.m[1][1] = m[1][0] * iM.m[0][1] + m[1][1] * iM.m[1][1] + m[1][2] * iM.m[2][1];
190
oM.m[2][1] = m[2][0] * iM.m[0][1] + m[2][1] * iM.m[1][1] + m[2][2] * iM.m[2][1];
192
oM.m[0][2] = m[0][0] * iM.m[0][2] + m[0][1] * iM.m[1][2] + m[0][2] * iM.m[2][2];
193
oM.m[1][2] = m[1][0] * iM.m[0][2] + m[1][1] * iM.m[1][2] + m[1][2] * iM.m[2][2];
194
oM.m[2][2] = m[2][0] * iM.m[0][2] + m[2][1] * iM.m[1][2] + m[2][2] * iM.m[2][2];
199
/***************************************************************************************\
200
Function: Matrix3x3<T>::operator +
202
Description: Add matrix iM.
206
Return Value: Matrix3x3<T>.
209
\***************************************************************************************/
210
template <typename T>
211
Matrix3x3<T> Matrix3x3<T>::operator+ (const Matrix3x3<T>& iM) const
215
oM.m[0][0] = m[0][0]+iM.m[0][0]; oM.m[0][1] = m[0][1]+iM.m[0][1]; oM.m[0][2] = m[0][2]+iM.m[0][2];
216
oM.m[1][0] = m[1][0]+iM.m[1][0]; oM.m[1][1] = m[1][1]+iM.m[1][1]; oM.m[1][2] = m[1][2]+iM.m[1][2];
217
oM.m[2][0] = m[2][0]+iM.m[2][0]; oM.m[2][1] = m[2][1]+iM.m[2][1]; oM.m[2][2] = m[2][2]+iM.m[2][2];
222
/***************************************************************************************\
223
Function: Matrix3x3<T>::operator -
225
Description: Substract matrix iM.
229
Return Value: Matrix3x3<T>.
232
\***************************************************************************************/
233
template <typename T>
234
Matrix3x3<T> Matrix3x3<T>::operator- (const Matrix3x3<T>& iM) const
238
oM.m[0][0] = m[0][0]-iM.m[0][0]; oM.m[0][1] = m[0][1]-iM.m[0][1]; oM.m[0][2] = m[0][2]-iM.m[0][2];
239
oM.m[1][0] = m[1][0]-iM.m[1][0]; oM.m[1][1] = m[1][1]-iM.m[1][1]; oM.m[1][2] = m[1][2]-iM.m[1][2];
240
oM.m[2][0] = m[2][0]-iM.m[2][0]; oM.m[2][1] = m[2][1]-iM.m[2][1]; oM.m[2][2] = m[2][2]-iM.m[2][2];
251
/***************************************************************************************\
252
Function: Matrix3x3<T>::operator *=
254
Description: Multiply by matrix iM.
258
Return Value: Matrix3x3<T>.
261
\***************************************************************************************/
262
template <typename T>
263
Matrix3x3<T>& Matrix3x3<T>::operator *= (const Matrix3x3<T>& iM) const
267
oM.m[0][0] = m[0][0] * iM.m[0][0] + m[0][1] * iM.m[1][0] + m[0][2] * iM.m[2][0];
268
oM.m[1][0] = m[1][0] * iM.m[0][0] + m[1][1] * iM.m[1][0] + m[1][2] * iM.m[2][0];
269
oM.m[2][0] = m[2][0] * iM.m[0][0] + m[2][1] * iM.m[1][0] + m[2][2] * iM.m[2][0];
271
oM.m[0][1] = m[0][0] * iM.m[0][1] + m[0][1] * iM.m[1][1] + m[0][2] * iM.m[2][1];
272
oM.m[1][1] = m[1][0] * iM.m[0][1] + m[1][1] * iM.m[1][1] + m[1][2] * iM.m[2][1];
273
oM.m[2][1] = m[2][0] * iM.m[0][1] + m[2][1] * iM.m[1][1] + m[2][2] * iM.m[2][1];
275
oM.m[0][2] = m[0][0] * iM.m[0][2] + m[0][1] * iM.m[1][2] + m[0][2] * iM.m[2][2];
276
oM.m[1][2] = m[1][0] * iM.m[0][2] + m[1][1] * iM.m[1][2] + m[1][2] * iM.m[2][2];
277
oM.m[2][2] = m[2][0] * iM.m[0][2] + m[2][1] * iM.m[1][2] + m[2][2] * iM.m[2][2];
283
/***************************************************************************************\
284
Function: Matrix3x3<T>::operator +=
286
Description: Add matrix iM.
290
Return Value: Matrix3x3<T>.
293
\***************************************************************************************/
294
template <typename T>
295
Matrix3x3<T>& Matrix3x3<T>::operator += (const Matrix3x3<T>& iM) const
299
oM.m[0][0] = m[0][0]+iM.m[0][0]; oM.m[0][1] = m[0][1]+iM.m[0][1]; oM.m[0][2] = m[0][2]+iM.m[0][2];
300
oM.m[1][0] = m[1][0]+iM.m[1][0]; oM.m[1][1] = m[1][1]+iM.m[1][1]; oM.m[1][2] = m[1][2]+iM.m[1][2];
301
oM.m[2][0] = m[2][0]+iM.m[2][0]; oM.m[2][1] = m[2][1]+iM.m[2][1]; oM.m[2][2] = m[2][2]+iM.m[2][2];
307
/***************************************************************************************\
308
Function: Matrix3x3<T>::operator -=
310
Description: Substract matrix iM.
314
Return Value: Matrix3x3<T>.
317
\***************************************************************************************/
318
template <typename T>
319
Matrix3x3<T>& Matrix3x3<T>::operator -= (const Matrix3x3<T>& iM) const
323
oM.m[0][0] = m[0][0]-iM.m[0][0]; oM.m[0][1] = m[0][1]-iM.m[0][1]; oM.m[0][2] = m[0][2]-iM.m[0][2];
324
oM.m[1][0] = m[1][0]-iM.m[1][0]; oM.m[1][1] = m[1][1]-iM.m[1][1]; oM.m[1][2] = m[1][2]-iM.m[1][2];
325
oM.m[2][0] = m[2][0]-iM.m[2][0]; oM.m[2][1] = m[2][1]-iM.m[2][1]; oM.m[2][2] = m[2][2]-iM.m[2][2];
332
/***************************************************************************************\
333
Function: Matrix3x3<T>::operator *
335
Description: Multiply all elements by f.
339
Return Value: Matrix3x3<T>.
342
\***************************************************************************************/
343
template <typename T>
344
Matrix3x3<T> Matrix3x3<T>::operator * (const T& f) const
348
oM.m[0][0] = m[0][0]*f; oM.m[0][1] = m[0][1]*f; oM.m[0][2] = m[0][2]*f;
349
oM.m[1][0] = m[1][0]*f; oM.m[1][1] = m[1][1]*f; oM.m[1][2] = m[1][2]*f;
350
oM.m[2][0] = m[2][0]*f; oM.m[2][1] = m[2][1]*f; oM.m[2][2] = m[2][2]*f;
355
/***************************************************************************************\
356
Function: Matrix3x3<T>::operator /
358
Description: Divide all elements by f.
362
Return Value: Matrix3x3<T>.
365
\***************************************************************************************/
366
template <typename T>
367
Matrix3x3<T> Matrix3x3<T>::operator/ (const T& f) const
371
oM.m[0][0] = m[0][0]/f; oM.m[0][1] = m[0][1]/f; oM.m[0][2] = m[0][2]/f;
372
oM.m[1][0] = m[1][0]/f; oM.m[1][1] = m[1][1]/f; oM.m[1][2] = m[1][2]/f;
373
oM.m[2][0] = m[2][0]/f; oM.m[2][1] = m[2][1]/f; oM.m[2][2] = m[2][2]/f;
382
/***************************************************************************************\
383
Function: Matrix3x3<T>::operator *=
385
Description: Multiply all elements by f.
389
Return Value: Matrix3x3<T>.
392
\***************************************************************************************/
393
template <typename T>
394
Matrix3x3<T>& Matrix3x3<T>::operator *= (const T& f) const
398
oM.m[0][0] = m[0][0]*f; oM.m[0][1] = m[0][1]*f; oM.m[0][2] = m[0][2]*f;
399
oM.m[1][0] = m[1][0]*f; oM.m[1][1] = m[1][1]*f; oM.m[1][2] = m[1][2]*f;
400
oM.m[2][0] = m[2][0]*f; oM.m[2][1] = m[2][1]*f; oM.m[2][2] = m[2][2]*f;
406
/***************************************************************************************\
407
Function: Matrix3x3<T>::operator /=
409
Description: Divide all elements by f.
413
Return Value: Matrix3x3<T>.
416
\***************************************************************************************/
417
template <typename T>
418
Matrix3x3<T>& Matrix3x3<T>::operator /= (const T& f) const
422
oM.m[0][0] = m[0][0]/f; oM.m[0][1] = m[0][1]/f; oM.m[0][2] = m[0][2]/f;
423
oM.m[1][0] = m[1][0]/f; oM.m[1][1] = m[1][1]/f; oM.m[1][2] = m[1][2]/f;
424
oM.m[2][0] = m[2][0]/f; oM.m[2][1] = m[2][1]/f; oM.m[2][2] = m[2][2]/f;
430
/***************************************************************************************\
431
Function: Matrix3x3<T>::operator *
433
Description: Multiply a matrix by a vector.
437
Return Value: Vector4.
440
\***************************************************************************************/
441
template <typename T>
442
Vec3<T> Matrix3x3<T>::operator * (const Vec3<T>& V) const
446
oV.x = V.x*m[0][0] + V.y*m[0][1] + V.z*m[0][2];
447
oV.y = V.x*m[1][0] + V.y*m[1][1] + V.z*m[1][2];
448
oV.z = V.x*m[2][0] + V.y*m[2][1] + V.z*m[2][2];
453
/***************************************************************************************\
454
Function: Matrix3x3<T>::operator - ()
456
Description: Negate all elements of the matrix.
460
Return Value: Matrix3x3<T>.
463
\***************************************************************************************/
464
template <typename T>
465
Matrix3x3<T> Matrix3x3<T>::operator- ()
469
oM.m[0][0] = -m[0][0];
470
oM.m[0][1] = -m[0][1];
471
oM.m[0][2] = -m[0][2];
472
oM.m[1][0] = -m[1][0];
473
oM.m[1][1] = -m[1][1];
474
oM.m[1][2] = -m[1][2];
475
oM.m[2][0] = -m[2][0];
476
oM.m[2][1] = -m[2][1];
477
oM.m[2][2] = -m[2][2];
482
template <typename T>
483
T& Matrix3x3<T>::operator ()(unsigned int i, unsigned int j)
488
template <typename T>
489
T Matrix3x3<T>::operator ()(unsigned int i, unsigned int j) const
494
/***************************************************************************************\
495
Function: Matrix3x3<T>::zero
497
Description: Set the matrix to zero.
504
\***************************************************************************************/
505
template <typename T>
506
void Matrix3x3<T>::Zero()
508
m[0][0] = 0.0; m[0][1] = 0.0; m[0][2] = 0.0;
509
m[1][0] = 0.0; m[1][1] = 0.0; m[1][2] = 0.0;
510
m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 0.0;
512
//memset(m, 0, sizeof(m));
515
/***************************************************************************************\
516
Function: Matrix3x3<T>::identity
518
Description: Set the matrix to identity.
525
\***************************************************************************************/
526
template <typename T>
527
void Matrix3x3<T>::Identity()
529
m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0;
530
m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0;
531
m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0;
534
template <typename T>
535
T Matrix3x3<T>::Determinant() const
538
det = m[0][0] * m[1][1] * m[2][2] +
539
m[0][1] * m[1][2] * m[2][0] +
540
m[0][2] * m[2][0] * m[2][1] -
541
m[0][0] * m[1][2] * m[2][1] -
542
m[0][1] * m[1][0] * m[2][2] -
543
m[0][2] * m[1][1] * m[2][0];
548
template <typename T>
549
void Matrix3x3<T>::Inverse()
551
T det = Determinant();
554
// Determinant is null. Matrix cannot be inverted.
562
Temp.m[0][0] = m[1][1]*m[2][2] - m[1][2]*m[2][1];
563
Temp.m[0][1] = m[0][2]*m[2][1] - m[0][1]*m[2][2];
564
Temp.m[0][2] = m[0][1]*m[1][2] - m[0][2]*m[1][1];
566
Temp.m[1][0] = m[1][2]*m[2][0] - m[1][0]*m[2][2];
567
Temp.m[1][1] = m[0][0]*m[2][2] - m[0][2]*m[2][0];
568
Temp.m[1][2] = m[0][2]*m[1][0] - m[0][0]*m[1][2];
570
Temp.m[2][0] = m[1][0]*m[2][1] - m[1][1]*m[2][0];
571
Temp.m[2][1] = m[0][1]*m[2][0] - m[0][0]*m[2][1];
572
Temp.m[2][2] = m[0][0]*m[1][1] - m[0][1]*m[1][0];
574
*this = (T(1) / det) * Temp;
577
template <typename T>
578
Matrix3x3<T> Matrix3x3<T>::GetInverse() const
580
Matrix3x3<T> Temp = *this;
585
// template <typename T>
586
// Matrix2x2<T> Matrix3x3<T>::GetUpper2x2() const
588
// Matrix2x2<T> Temp;
589
// Temp.m[0][0] = m[0][0];
590
// Temp.m[0][1] = m[0][1];
592
// Temp.m[1][0] = m[1][0];
593
// Temp.m[1][1] = m[1][1];
598
template <typename T>
599
Matrix3x3<T> Matrix3x3<T>::IDENTITY()
606
template <typename T>
607
Matrix3x3<T> Matrix3x3<T>::ZERO()
614
/***************************************************************************************\
615
Function: Matrix3x3<T>::operator *
617
Description: Multiply matrix rhs by constant lhs.
618
Allow "f * matrix" operation..
622
Return Value: Matrix3x3<T>.
625
\***************************************************************************************/
626
template <typename T>
627
Matrix3x3<T> operator * (const T& lhs, const Matrix3x3<T>& rhs)
631
oM.m[0][0] = rhs.m[0][0]/lhs; oM.m[0][1] = rhs.m[0][1]/lhs; oM.m[0][2] = rhs.m[0][2]/lhs;
632
oM.m[1][0] = rhs.m[1][0]/lhs; oM.m[1][1] = rhs.m[1][1]/lhs; oM.m[1][2] = rhs.m[1][2]/lhs;
633
oM.m[2][0] = rhs.m[2][0]/lhs; oM.m[2][1] = rhs.m[2][1]/lhs; oM.m[2][2] = rhs.m[2][2]/lhs;
638
typedef Matrix3x3<float> Matrix3;