Blob Blame Raw
#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 );
}