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__ inline_ Point operator*(const Point &v) const
Operator for Point Mul = Matrix3x3 * Point;.
#define IR(x)
Integer representation of a floating-point value.
inline_ void Mac(const Matrix3x3 &a, float s)
Mac.
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*(float s) const
Operator for Matrix3x3 Mul = Matrix3x3 * float;.
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_ float Trace() const
Computes the trace. The trace is the sum of the 3 diagonal components.
inline_ Point & operator[](int row)
inline_ void GetCol(const udword c, Point &p) const
Returns a column.
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_ BOOL IsValid() const
Checks matrix validity.
inline_ friend Matrix3x3 operator*(float s, const Matrix3x3 &mat)
Operator for Matrix3x3 Mul = float * Matrix3x3;.
inline_ Matrix3x3 & operator/=(float s)
Operator for Matrix3x3 /= float.
inline_ Matrix3x3 operator-(const Matrix3x3 &mat) const
Operator for Matrix3x3 Minus = Matrix3x3 - Matrix3x3;.
int BOOL
Another boolean type.
unsigned int udword
sizeof(udword) must be 4
inline_ void GetRow(const udword r, Point &p) const
Returns a row.
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_ const Point & GetRow(const udword r) const
Returns a row.
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)
def j(str, encoding="cp932")
inline_ void MultABt(const Matrix3x3 &a, const Matrix3x3 &b)
this = a * transpose(b)
inline_ Matrix3x3 operator+(const Matrix3x3 &mat) const
Operator for Matrix3x3 Plus = Matrix3x3 + Matrix3x3;.
inline_ bool IsValidFloat(float value)
inline_ void SetRow(const udword r, const Point &p)
Sets a row.
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.
float Determinant() const
Compute the determinant of the matrix. We use the rule of Sarrus.
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_ Matrix3x3 & operator-=(const Matrix3x3 &mat)
Operator for Matrix3x3 -= Matrix3x3.
#define IEEE_1_0
integer representation of 1.0
inline_ bool IsIdentity() const
Checks for identity.
inline_ void ZeroMemory(void *addr, udword size)
inline_ Matrix3x3 operator/(float s) const
Operator for Matrix3x3 Div = Matrix3x3 / float;.
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_ const Point & operator[](int row) const
inline_ Matrix3x3 operator*(const Matrix3x3 &mat) const
Operator for Matrix3x3 Mul = Matrix3x3 * Matrix3x3;.
inline_ void Zero()
Clears the matrix.
inline_ void Scale(float sx, float sy, float sz)
Scales from floats. Each row is multiplied by a value.