a2de::Matrix3x3 Matrix3x3::Inverse(const Matrix3x3& mat) { //Minors, Cofactors, Adjugates method. //See http://www.mathsisfun.com/algebra/matrix-inverse-minors-cofactors-adjugate.html //[00 01 02] [0 1 2] //[10 11 12] [3 4 5] //[20 21 22] [6 7 8] //Calculate minors double m00 = Matrix2x2::CalculateDeterminant(Matrix2x2(mat._indicies[4], mat._indicies[5], mat._indicies[7], mat._indicies[8])); double m01 = Matrix2x2::CalculateDeterminant(Matrix2x2(mat._indicies[3], mat._indicies[5], mat._indicies[6], mat._indicies[7])); double m02 = Matrix2x2::CalculateDeterminant(Matrix2x2(mat._indicies[3], mat._indicies[4], mat._indicies[6], mat._indicies[7])); double m10 = Matrix2x2::CalculateDeterminant(Matrix2x2(mat._indicies[1], mat._indicies[2], mat._indicies[7], mat._indicies[8])); double m11 = Matrix2x2::CalculateDeterminant(Matrix2x2(mat._indicies[0], mat._indicies[2], mat._indicies[6], mat._indicies[7])); double m12 = Matrix2x2::CalculateDeterminant(Matrix2x2(mat._indicies[0], mat._indicies[1], mat._indicies[6], mat._indicies[7])); double m20 = Matrix2x2::CalculateDeterminant(Matrix2x2(mat._indicies[1], mat._indicies[2], mat._indicies[4], mat._indicies[5])); double m21 = Matrix2x2::CalculateDeterminant(Matrix2x2(mat._indicies[0], mat._indicies[2], mat._indicies[3], mat._indicies[5])); double m22 = Matrix2x2::CalculateDeterminant(Matrix2x2(mat._indicies[0], mat._indicies[1], mat._indicies[3], mat._indicies[4])); Matrix3x3 cofactors(m00, -m01, m02, -m10, m11, -m12, m20, -m21, m22); Matrix3x3 adjugate(Matrix3x3::Transpose(cofactors)); double det_mat = mat.CalculateDeterminant(); double inv_det = 1.0 / det_mat; return inv_det * adjugate; }