#include "matrix.h"
Real
Matrix3::det() const {
return m00*(m11*m22 - m12*m21)
+ m01*(m12*m20 - m10*m22)
+ m02*(m10*m21 - m11*m20);
}
Matrix3
Matrix3::inverted(bool *success) const {
const Real rm00 = m11*m22 - m12*m21;
const Real rm10 = m12*m20 - m10*m22;
const Real rm20 = m10*m21 - m11*m20;
const Real d = m00*rm00 + m01*rm10 + m02*rm20;
Real k;
if (fabs(d) > real_precision) {
k = 1/d;
if (success) *success = true;
} else {
k = 0;
if (success) *success = false;
}
return Matrix3(
Vector3( m11*m22 - m12*m21,
m02*m21 - m01*m22,
m01*m12 - m02*m11 )*k,
Vector3( m12*m20 - m10*m22,
m00*m22 - m02*m20,
m02*m10 - m00*m12 )*k,
Vector3( m10*m21 - m11*m20,
m01*m20 - m00*m21,
m00*m11 - m01*m10 )*k );
}