invert method
Implementation
MatrixD invert() {
MatrixD result = .zero();
final a00 = m0, a01 = m1, a02 = m2, a03 = m3;
final a10 = m4, a11 = m5, a12 = m6, a13 = m7;
final a20 = m8, a21 = m9, a22 = m10, a23 = m11;
final a30 = m12, a31 = m13, a32 = m14, a33 = m15;
final b00 = a00*a11 - a01*a10;
final b01 = a00*a12 - a02*a10;
final b02 = a00*a13 - a03*a10;
final b03 = a01*a12 - a02*a11;
final b04 = a01*a13 - a03*a11;
final b05 = a02*a13 - a03*a12;
final b06 = a20*a31 - a21*a30;
final b07 = a20*a32 - a22*a30;
final b08 = a20*a33 - a23*a30;
final b09 = a21*a32 - a22*a31;
final b10 = a21*a33 - a23*a31;
final b11 = a22*a33 - a23*a32;
final invDet = 1.0/(b00*b11 - b01*b10 + b02*b09 + b03*b08 - b04*b07 + b05*b06);
result.m0 = (a11*b11 - a12*b10 + a13*b09)*invDet;
result.m1 = (-a01*b11 + a02*b10 - a03*b09)*invDet;
result.m2 = (a31*b05 - a32*b04 + a33*b03)*invDet;
result.m3 = (-a21*b05 + a22*b04 - a23*b03)*invDet;
result.m4 = (-a10*b11 + a12*b08 - a13*b07)*invDet;
result.m5 = (a00*b11 - a02*b08 + a03*b07)*invDet;
result.m6 = (-a30*b05 + a32*b02 - a33*b01)*invDet;
result.m7 = (a20*b05 - a22*b02 + a23*b01)*invDet;
result.m8 = (a10*b10 - a11*b08 + a13*b06)*invDet;
result.m9 = (-a00*b10 + a01*b08 - a03*b06)*invDet;
result.m10 = (a30*b04 - a31*b02 + a33*b00)*invDet;
result.m11 = (-a20*b04 + a21*b02 - a23*b00)*invDet;
result.m12 = (-a10*b09 + a11*b07 - a12*b06)*invDet;
result.m13 = (a00*b09 - a01*b07 + a02*b06)*invDet;
result.m14 = (-a30*b03 + a31*b01 - a32*b00)*invDet;
result.m15 = (a20*b03 - a21*b01 + a22*b00)*invDet;
return result;
}