00001 #include "sysdep.h" 00002 #include "math3d.h" 00003 00004 const Vector3D Vector3D::Zero(0.0f,0.0f,0.0f); 00005 const Matrix3D Matrix3D::Identity(1.0f,0.0f,0.0f,0.0f, 00006 0.0f,1.0f,0.0f,0.0f, 00007 0.0f,0.0f,1.0f,0.0f, 00008 0.0f,0.0f,0.0f,1.0f); 00009 00010 00011 inline float 00012 MINOR(const Matrix3D& m, const int r0, const int r1, const int r2, const int c0, const int c1, const int c2) 00013 { 00014 return m(r0,c0) * (m(r1,c1) * m(r2,c2) - m(r2,c1) * m(r1,c2)) - 00015 m(r0,c1) * (m(r1,c0) * m(r2,c2) - m(r2,c0) * m(r1,c2)) + 00016 m(r0,c2) * (m(r1,c0) * m(r2,c1) - m(r2,c0) * m(r1,c1)); 00017 } 00018 00019 00020 Matrix3D 00021 Matrix3D::Adjoint() const 00022 { 00023 return Matrix3D( MINOR(*this, 1, 2, 3, 1, 2, 3), 00024 -MINOR(*this, 0, 2, 3, 1, 2, 3), 00025 MINOR(*this, 0, 1, 3, 1, 2, 3), 00026 -MINOR(*this, 0, 1, 2, 1, 2, 3), 00027 00028 -MINOR(*this, 1, 2, 3, 0, 2, 3), 00029 MINOR(*this, 0, 2, 3, 0, 2, 3), 00030 -MINOR(*this, 0, 1, 3, 0, 2, 3), 00031 MINOR(*this, 0, 1, 2, 0, 2, 3), 00032 00033 MINOR(*this, 1, 2, 3, 0, 1, 3), 00034 -MINOR(*this, 0, 2, 3, 0, 1, 3), 00035 MINOR(*this, 0, 1, 3, 0, 1, 3), 00036 -MINOR(*this, 0, 1, 2, 0, 1, 3), 00037 00038 -MINOR(*this, 1, 2, 3, 0, 1, 2), 00039 MINOR(*this, 0, 2, 3, 0, 1, 2), 00040 -MINOR(*this, 0, 1, 3, 0, 1, 2), 00041 MINOR(*this, 0, 1, 2, 0, 1, 2)); 00042 } 00043 00044 00045 float 00046 Matrix3D::Determinant() const 00047 { 00048 return m[0][0] * MINOR(*this, 1, 2, 3, 1, 2, 3) - 00049 m[0][1] * MINOR(*this, 1, 2, 3, 0, 2, 3) + 00050 m[0][2] * MINOR(*this, 1, 2, 3, 0, 1, 3) - 00051 m[0][3] * MINOR(*this, 1, 2, 3, 0, 1, 2); 00052 } 00053 00054 Matrix3D 00055 Matrix3D::Inverse() const 00056 { 00057 return (1.0f / Determinant()) * Adjoint(); 00058 } 00059