12 #ifndef __ICEMATRIX3X3_H__ 13 #define __ICEMATRIX3X3_H__ 18 #define MATRIX3X3_EPSILON (1.0e-7f) 26 inline_ Matrix3x3(
float m00,
float m01,
float m02,
float m10,
float m11,
float m12,
float m20,
float m21,
float m22)
28 m[0][0] = m00; m[0][1] = m01; m[0][2] = m02;
29 m[1][0] = m10; m[1][1] = m11; m[1][2] = m12;
30 m[2][0] = m20; m[2][1] = m21; m[2][2] = m22;
38 inline_ void Set(
float m00,
float m01,
float m02,
float m10,
float m11,
float m12,
float m20,
float m21,
float m22)
40 m[0][0] = m00; m[0][1] = m01; m[0][2] = m02;
41 m[1][0] = m10; m[1][1] = m11; m[1][2] = m12;
42 m[2][0] = m20; m[2][1] = m21; m[2][2] = m22;
49 inline_ void SetScale(
float sx,
float sy,
float sz) { m[0][0] = sx; m[1][1] = sy; m[2][2] = sz; }
54 m[0][0] *= p.
x; m[0][1] *= p.
x; m[0][2] *= p.
x;
55 m[1][0] *= p.
y; m[1][1] *= p.
y; m[1][2] *= p.
y;
56 m[2][0] *= p.
z; m[2][1] *= p.
z; m[2][2] *= p.
z;
62 m[0][0] *= sx; m[0][1] *= sx; m[0][2] *= sx;
63 m[1][0] *= sy; m[1][1] *= sy; m[1][2] *= sy;
64 m[2][0] *= sz; m[2][1] *= sz; m[2][2] *= sz;
85 inline_ float Trace()
const {
return m[0][0] + m[1][1] + m[2][2]; }
94 if(
IR(m[0][1])!=0)
return false;
95 if(
IR(m[0][2])!=0)
return false;
97 if(
IR(m[1][0])!=0)
return false;
99 if(
IR(m[1][2])!=0)
return false;
101 if(
IR(m[2][0])!=0)
return false;
102 if(
IR(m[2][1])!=0)
return false;
145 m[0][0] = -m[0][0]; m[0][1] = -m[0][1]; m[0][2] = -m[0][2];
146 m[1][0] = -m[1][0]; m[1][1] = -m[1][1]; m[1][2] = -m[1][2];
147 m[2][0] = -m[2][0]; m[2][1] = -m[2][1]; m[2][2] = -m[2][2];
153 m[0][0] = -mat.
m[0][0]; m[0][1] = -mat.
m[0][1]; m[0][2] = -mat.
m[0][2];
154 m[1][0] = -mat.
m[1][0]; m[1][1] = -mat.
m[1][1]; m[1][2] = -mat.
m[1][2];
155 m[2][0] = -mat.
m[2][0]; m[2][1] = -mat.
m[2][1]; m[2][2] = -mat.
m[2][2];
161 m[0][0] += mat.
m[0][0]; m[0][1] += mat.
m[0][1]; m[0][2] += mat.
m[0][2];
162 m[1][0] += mat.
m[1][0]; m[1][1] += mat.
m[1][1]; m[1][2] += mat.
m[1][2];
163 m[2][0] += mat.
m[2][0]; m[2][1] += mat.
m[2][1]; m[2][2] += mat.
m[2][2];
169 m[0][0] -= mat.
m[0][0]; m[0][1] -= mat.
m[0][1]; m[0][2] -= mat.
m[0][2];
170 m[1][0] -= mat.
m[1][0]; m[1][1] -= mat.
m[1][1]; m[1][2] -= mat.
m[1][2];
171 m[2][0] -= mat.
m[2][0]; m[2][1] -= mat.
m[2][1]; m[2][2] -= mat.
m[2][2];
176 m[0][0] = a.
m[0][0] + b.
m[0][0] * s;
177 m[0][1] = a.
m[0][1] + b.
m[0][1] * s;
178 m[0][2] = a.
m[0][2] + b.
m[0][2] * s;
180 m[1][0] = a.
m[1][0] + b.
m[1][0] * s;
181 m[1][1] = a.
m[1][1] + b.
m[1][1] * s;
182 m[1][2] = a.
m[1][2] + b.
m[1][2] * s;
184 m[2][0] = a.
m[2][0] + b.
m[2][0] * s;
185 m[2][1] = a.
m[2][1] + b.
m[2][1] * s;
186 m[2][2] = a.
m[2][2] + b.
m[2][2] * s;
191 m[0][0] += a.
m[0][0] * s; m[0][1] += a.
m[0][1] * s; m[0][2] += a.
m[0][2] * s;
192 m[1][0] += a.
m[1][0] * s; m[1][1] += a.
m[1][1] * s; m[1][2] += a.
m[1][2] * s;
193 m[2][0] += a.
m[2][0] * s; m[2][1] += a.
m[2][1] * s; m[2][2] += a.
m[2][2] * s;
199 m[0][0] = a.
m[0][0] * s; m[0][1] = a.
m[0][1] * s; m[0][2] = a.
m[0][2] * s;
200 m[1][0] = a.
m[1][0] * s; m[1][1] = a.
m[1][1] * s; m[1][2] = a.
m[1][2] * s;
201 m[2][0] = a.
m[2][0] * s; m[2][1] = a.
m[2][1] * s; m[2][2] = a.
m[2][2] * s;
206 m[0][0] = a.
m[0][0] + b.
m[0][0]; m[0][1] = a.
m[0][1] + b.
m[0][1]; m[0][2] = a.
m[0][2] + b.
m[0][2];
207 m[1][0] = a.
m[1][0] + b.
m[1][0]; m[1][1] = a.
m[1][1] + b.
m[1][1]; m[1][2] = a.
m[1][2] + b.
m[1][2];
208 m[2][0] = a.
m[2][0] + b.
m[2][0]; m[2][1] = a.
m[2][1] + b.
m[2][1]; m[2][2] = a.
m[2][2] + b.
m[2][2];
213 m[0][0] = a.
m[0][0] - b.
m[0][0]; m[0][1] = a.
m[0][1] - b.
m[0][1]; m[0][2] = a.
m[0][2] - b.
m[0][2];
214 m[1][0] = a.
m[1][0] - b.
m[1][0]; m[1][1] = a.
m[1][1] - b.
m[1][1]; m[1][2] = a.
m[1][2] - b.
m[1][2];
215 m[2][0] = a.
m[2][0] - b.
m[2][0]; m[2][1] = a.
m[2][1] - b.
m[2][1]; m[2][2] = a.
m[2][2] - b.
m[2][2];
221 m[0][0] = a.
m[0][0] * b.
m[0][0] + a.
m[0][1] * b.
m[1][0] + a.
m[0][2] * b.
m[2][0];
222 m[0][1] = a.
m[0][0] * b.
m[0][1] + a.
m[0][1] * b.
m[1][1] + a.
m[0][2] * b.
m[2][1];
223 m[0][2] = a.
m[0][0] * b.
m[0][2] + a.
m[0][1] * b.
m[1][2] + a.
m[0][2] * b.
m[2][2];
224 m[1][0] = a.
m[1][0] * b.
m[0][0] + a.
m[1][1] * b.
m[1][0] + a.
m[1][2] * b.
m[2][0];
225 m[1][1] = a.
m[1][0] * b.
m[0][1] + a.
m[1][1] * b.
m[1][1] + a.
m[1][2] * b.
m[2][1];
226 m[1][2] = a.
m[1][0] * b.
m[0][2] + a.
m[1][1] * b.
m[1][2] + a.
m[1][2] * b.
m[2][2];
227 m[2][0] = a.
m[2][0] * b.
m[0][0] + a.
m[2][1] * b.
m[1][0] + a.
m[2][2] * b.
m[2][0];
228 m[2][1] = a.
m[2][0] * b.
m[0][1] + a.
m[2][1] * b.
m[1][1] + a.
m[2][2] * b.
m[2][1];
229 m[2][2] = a.
m[2][0] * b.
m[0][2] + a.
m[2][1] * b.
m[1][2] + a.
m[2][2] * b.
m[2][2];
235 m[0][0] = a.
m[0][0] * b.
m[0][0] + a.
m[1][0] * b.
m[1][0] + a.
m[2][0] * b.
m[2][0];
236 m[0][1] = a.
m[0][0] * b.
m[0][1] + a.
m[1][0] * b.
m[1][1] + a.
m[2][0] * b.
m[2][1];
237 m[0][2] = a.
m[0][0] * b.
m[0][2] + a.
m[1][0] * b.
m[1][2] + a.
m[2][0] * b.
m[2][2];
238 m[1][0] = a.
m[0][1] * b.
m[0][0] + a.
m[1][1] * b.
m[1][0] + a.
m[2][1] * b.
m[2][0];
239 m[1][1] = a.
m[0][1] * b.
m[0][1] + a.
m[1][1] * b.
m[1][1] + a.
m[2][1] * b.
m[2][1];
240 m[1][2] = a.
m[0][1] * b.
m[0][2] + a.
m[1][1] * b.
m[1][2] + a.
m[2][1] * b.
m[2][2];
241 m[2][0] = a.
m[0][2] * b.
m[0][0] + a.
m[1][2] * b.
m[1][0] + a.
m[2][2] * b.
m[2][0];
242 m[2][1] = a.
m[0][2] * b.
m[0][1] + a.
m[1][2] * b.
m[1][1] + a.
m[2][2] * b.
m[2][1];
243 m[2][2] = a.
m[0][2] * b.
m[0][2] + a.
m[1][2] * b.
m[1][2] + a.
m[2][2] * b.
m[2][2];
249 m[0][0] = a.
m[0][0] * b.
m[0][0] + a.
m[0][1] * b.
m[0][1] + a.
m[0][2] * b.
m[0][2];
250 m[0][1] = a.
m[0][0] * b.
m[1][0] + a.
m[0][1] * b.
m[1][1] + a.
m[0][2] * b.
m[1][2];
251 m[0][2] = a.
m[0][0] * b.
m[2][0] + a.
m[0][1] * b.
m[2][1] + a.
m[0][2] * b.
m[2][2];
252 m[1][0] = a.
m[1][0] * b.
m[0][0] + a.
m[1][1] * b.
m[0][1] + a.
m[1][2] * b.
m[0][2];
253 m[1][1] = a.
m[1][0] * b.
m[1][0] + a.
m[1][1] * b.
m[1][1] + a.
m[1][2] * b.
m[1][2];
254 m[1][2] = a.
m[1][0] * b.
m[2][0] + a.
m[1][1] * b.
m[2][1] + a.
m[1][2] * b.
m[2][2];
255 m[2][0] = a.
m[2][0] * b.
m[0][0] + a.
m[2][1] * b.
m[0][1] + a.
m[2][2] * b.
m[0][2];
256 m[2][1] = a.
m[2][0] * b.
m[1][0] + a.
m[2][1] * b.
m[1][1] + a.
m[2][2] * b.
m[1][2];
257 m[2][2] = a.
m[2][0] * b.
m[2][0] + a.
m[2][1] * b.
m[2][1] + a.
m[2][2] * b.
m[2][2];
267 void RotX(
float angle);
272 void RotY(
float angle);
277 void RotZ(
float angle);
281 void RotYX(
float y,
float x);
289 IR(m[1][0]) ^=
IR(m[0][1]);
IR(m[0][1]) ^=
IR(m[1][0]);
IR(m[1][0]) ^=
IR(m[0][1]);
290 IR(m[2][0]) ^=
IR(m[0][2]);
IR(m[0][2]) ^=
IR(m[2][0]);
IR(m[2][0]) ^=
IR(m[0][2]);
291 IR(m[2][1]) ^=
IR(m[1][2]);
IR(m[1][2]) ^=
IR(m[2][1]);
IR(m[2][1]) ^=
IR(m[1][2]);
297 m[0][0] = a.
m[0][0]; m[0][1] = a.
m[1][0]; m[0][2] = a.
m[2][0];
298 m[1][0] = a.
m[0][1]; m[1][1] = a.
m[1][1]; m[1][2] = a.
m[2][1];
299 m[2][0] = a.
m[0][2]; m[2][1] = a.
m[1][2]; m[2][2] = a.
m[2][2];
305 return (m[0][0]*m[1][1]*m[2][2] + m[0][1]*m[1][2]*m[2][0] + m[0][2]*m[1][0]*m[2][1])
306 - (m[2][0]*m[1][1]*m[0][2] + m[2][1]*m[1][2]*m[0][0] + m[2][2]*m[1][0]*m[0][1]);
319 float Det = Determinant();
320 float OneOverDet = 1.0f / Det;
323 Temp.
m[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDet;
324 Temp.
m[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDet;
325 Temp.
m[2][0] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDet;
326 Temp.
m[0][1] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDet;
327 Temp.
m[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDet;
328 Temp.
m[2][1] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDet;
329 Temp.
m[0][2] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDet;
330 Temp.
m[1][2] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDet;
331 Temp.
m[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDet;
343 void FromQuat(
const Quat &q);
344 void FromQuatL2(
const Quat &q,
float l2);
351 m[0][0] + mat.
m[0][0], m[0][1] + mat.
m[0][1], m[0][2] + mat.
m[0][2],
352 m[1][0] + mat.
m[1][0], m[1][1] + mat.
m[1][1], m[1][2] + mat.
m[1][2],
353 m[2][0] + mat.
m[2][0], m[2][1] + mat.
m[2][1], m[2][2] + mat.
m[2][2]);
360 m[0][0] - mat.
m[0][0], m[0][1] - mat.
m[0][1], m[0][2] - mat.
m[0][2],
361 m[1][0] - mat.
m[1][0], m[1][1] - mat.
m[1][1], m[1][2] - mat.
m[1][2],
362 m[2][0] - mat.
m[2][0], m[2][1] - mat.
m[2][1], m[2][2] - mat.
m[2][2]);
369 m[0][0]*mat.
m[0][0] + m[0][1]*mat.
m[1][0] + m[0][2]*mat.
m[2][0],
370 m[0][0]*mat.
m[0][1] + m[0][1]*mat.
m[1][1] + m[0][2]*mat.
m[2][1],
371 m[0][0]*mat.
m[0][2] + m[0][1]*mat.
m[1][2] + m[0][2]*mat.
m[2][2],
373 m[1][0]*mat.
m[0][0] + m[1][1]*mat.
m[1][0] + m[1][2]*mat.
m[2][0],
374 m[1][0]*mat.
m[0][1] + m[1][1]*mat.
m[1][1] + m[1][2]*mat.
m[2][1],
375 m[1][0]*mat.
m[0][2] + m[1][1]*mat.
m[1][2] + m[1][2]*mat.
m[2][2],
377 m[2][0]*mat.
m[0][0] + m[2][1]*mat.
m[1][0] + m[2][2]*mat.
m[2][0],
378 m[2][0]*mat.
m[0][1] + m[2][1]*mat.
m[1][1] + m[2][2]*mat.
m[2][1],
379 m[2][0]*mat.
m[0][2] + m[2][1]*mat.
m[1][2] + m[2][2]*mat.
m[2][2]);
389 m[0][0]*s, m[0][1]*s, m[0][2]*s,
390 m[1][0]*s, m[1][1]*s, m[1][2]*s,
391 m[2][0]*s, m[2][1]*s, m[2][2]*s);
398 s*mat.
m[0][0], s*mat.
m[0][1], s*mat.
m[0][2],
399 s*mat.
m[1][0], s*mat.
m[1][1], s*mat.
m[1][2],
400 s*mat.
m[2][0], s*mat.
m[2][1], s*mat.
m[2][2]);
408 m[0][0]*s, m[0][1]*s, m[0][2]*s,
409 m[1][0]*s, m[1][1]*s, m[1][2]*s,
410 m[2][0]*s, m[2][1]*s, m[2][2]*s);
417 s/mat.
m[0][0], s/mat.
m[0][1], s/mat.
m[0][2],
418 s/mat.
m[1][0], s/mat.
m[1][1], s/mat.
m[1][2],
419 s/mat.
m[2][0], s/mat.
m[2][1], s/mat.
m[2][2]);
425 m[0][0] += mat.
m[0][0]; m[0][1] += mat.
m[0][1]; m[0][2] += mat.
m[0][2];
426 m[1][0] += mat.
m[1][0]; m[1][1] += mat.
m[1][1]; m[1][2] += mat.
m[1][2];
427 m[2][0] += mat.
m[2][0]; m[2][1] += mat.
m[2][1]; m[2][2] += mat.
m[2][2];
434 m[0][0] -= mat.
m[0][0]; m[0][1] -= mat.
m[0][1]; m[0][2] -= mat.
m[0][2];
435 m[1][0] -= mat.
m[1][0]; m[1][1] -= mat.
m[1][1]; m[1][2] -= mat.
m[1][2];
436 m[2][0] -= mat.
m[2][0]; m[2][1] -= mat.
m[2][1]; m[2][2] -= mat.
m[2][2];
446 m[0][0] = TempRow.
x*mat.
m[0][0] + TempRow.
y*mat.
m[1][0] + TempRow.
z*mat.
m[2][0];
447 m[0][1] = TempRow.
x*mat.
m[0][1] + TempRow.
y*mat.
m[1][1] + TempRow.
z*mat.
m[2][1];
448 m[0][2] = TempRow.
x*mat.
m[0][2] + TempRow.
y*mat.
m[1][2] + TempRow.
z*mat.
m[2][2];
451 m[1][0] = TempRow.
x*mat.
m[0][0] + TempRow.
y*mat.
m[1][0] + TempRow.
z*mat.
m[2][0];
452 m[1][1] = TempRow.
x*mat.
m[0][1] + TempRow.
y*mat.
m[1][1] + TempRow.
z*mat.
m[2][1];
453 m[1][2] = TempRow.
x*mat.
m[0][2] + TempRow.
y*mat.
m[1][2] + TempRow.
z*mat.
m[2][2];
456 m[2][0] = TempRow.
x*mat.
m[0][0] + TempRow.
y*mat.
m[1][0] + TempRow.
z*mat.
m[2][0];
457 m[2][1] = TempRow.
x*mat.
m[0][1] + TempRow.
y*mat.
m[1][1] + TempRow.
z*mat.
m[2][1];
458 m[2][2] = TempRow.
x*mat.
m[0][2] + TempRow.
y*mat.
m[1][2] + TempRow.
z*mat.
m[2][2];
465 m[0][0] *= s; m[0][1] *= s; m[0][2] *= s;
466 m[1][0] *= s; m[1][1] *= s; m[1][2] *= s;
467 m[2][0] *= s; m[2][1] *= s; m[2][2] *= s;
475 m[0][0] *= s; m[0][1] *= s; m[0][2] *= s;
476 m[1][0] *= s; m[1][1] *= s; m[1][2] *= s;
477 m[2][0] *= s; m[2][1] *= s; m[2][2] *= s;
485 operator Quat()
const;
495 #endif // __ICEMATRIX3X3_H__
#define IR(x)
Integer representation of a floating-point value.
inline_ void Mac(const Matrix3x3 &a, float s)
Mac.
inline_ const Point & operator[](int row) const
inline_ friend Matrix3x3 operator/(float s, const Matrix3x3 &mat)
Operator for Matrix3x3 Div = float / Matrix3x3;.
inline_ void Sub(const Matrix3x3 &a, const Matrix3x3 &b)
inline_ Matrix3x3 & operator*=(const Matrix3x3 &mat)
Operator for Matrix3x3 *= Matrix3x3.
inline_ Matrix3x3 & operator+=(const Matrix3x3 &mat)
Operator for Matrix3x3 += Matrix3x3.
inline_ void Sub(const Matrix3x3 &mat)
Sub another matrix.
inline_ Matrix3x3()
Empty constructor.
inline_ void Identity()
Sets the identity matrix.
inline_ void SetScale(const Point &p)
Sets the scale from a Point. The point is put on the diagonal.
inline_ Matrix3x3 & operator*=(float s)
Operator for Matrix3x3 *= float.
inline_ Point & operator[](int row)
inline_ const Point & GetRow(const udword r) const
Returns a row.
float Determinant() const
Compute the determinant of the matrix. We use the rule of Sarrus.
inline_ void Scale(const Point &p)
Scales from a Point. Each row is multiplied by a component.
inline_ void Neg()
Negates the matrix.
inline_ void Copy(const Matrix3x3 &source)
Copy from a Matrix3x3.
inline_ void SkewSymmetric(const Point &a)
inline_ friend Matrix3x3 operator*(float s, const Matrix3x3 &mat)
Operator for Matrix3x3 Mul = float * Matrix3x3;.
inline_ Matrix3x3 operator+(const Matrix3x3 &mat) const
Operator for Matrix3x3 Plus = Matrix3x3 + Matrix3x3;.
inline_ Matrix3x3 & operator/=(float s)
Operator for Matrix3x3 /= float.
int BOOL
Another boolean type.
unsigned int udword
sizeof(udword) must be 4
inline_ ~Matrix3x3()
Destructor.
inline_ Point & GetRow(const udword r)
Returns a row.
Matrix3x3 & Invert()
Invert the matrix. Determinant must be different from zero, else matrix can't be inverted.
inline_ void Add(const Matrix3x3 &mat)
Add another matrix.
inline_ void SetCol(const udword c, const Point &p)
Sets a column.
inline_ void Add(const Matrix3x3 &a, const Matrix3x3 &b)
inline_ Matrix3x3 operator*(float s) const
Operator for Matrix3x3 Mul = Matrix3x3 * float;.
inline_ void MultABt(const Matrix3x3 &a, const Matrix3x3 &b)
this = a * transpose(b)
inline_ bool IsIdentity() const
Checks for identity.
inline_ Matrix3x3 operator-(const Matrix3x3 &mat) const
Operator for Matrix3x3 Minus = Matrix3x3 - Matrix3x3;.
inline_ bool IsValidFloat(float value)
inline_ void SetRow(const udword r, const Point &p)
Sets a row.
inline_ float Trace() const
Computes the trace. The trace is the sum of the 3 diagonal components.
inline_ void Mac(const Matrix3x3 &a, const Matrix3x3 &b, float s)
Mac.
inline_ Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
Constructor from 9 values.
inline_ void SetScale(float sx, float sy, float sz)
Sets the scale from floats. Values are put on the diagonal.
inline_ Matrix3x3(const Matrix3x3 &mat)
Copy constructor.
inline_ void Mult(const Matrix3x3 &a, const Matrix3x3 &b)
this = a * b
inline_ void MultAtB(const Matrix3x3 &a, const Matrix3x3 &b)
this = transpose(a) * b
inline_ void CopyMemory(void *dest, const void *src, udword size)
inline_ void GetRow(const udword r, Point &p) const
Returns a row.
inline_ Matrix3x3 operator/(float s) const
Operator for Matrix3x3 Div = Matrix3x3 / float;.
inline_ void GetCol(const udword c, Point &p) const
Returns a column.
inline_ Matrix3x3 & operator-=(const Matrix3x3 &mat)
Operator for Matrix3x3 -= Matrix3x3.
#define IEEE_1_0
integer representation of 1.0
inline_ void ZeroMemory(void *addr, udword size)
inline_ BOOL IsValid() const
Checks matrix validity.
inline_ void Set(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22)
Assign values.
inline_ void Neg(const Matrix3x3 &mat)
Neg from another matrix.
void Transpose(const Matrix3x3 &a)
this = Transpose(a)
void Transpose()
Transpose the matrix.
inline_ void Mult(const Matrix3x3 &a, float s)
this = A * s
inline_ Matrix3x3 operator*(const Matrix3x3 &mat) const
Operator for Matrix3x3 Mul = Matrix3x3 * Matrix3x3;.
inline_ void Zero()
Clears the matrix.
inline_ Point operator*(const Point &v) const
Operator for Point Mul = Matrix3x3 * Point;.
inline_ void Scale(float sx, float sy, float sz)
Scales from floats. Each row is multiplied by a value.