/// <summary>Get the symmetric inverse of this matrix as a 3-by-3. Returns the zero matrix if singular.</summary> public void GetSymInverse33(out Matrix33 m) { var det = Vector3.Dot(Column1, Vector3.Cross(Column2, Column3)); // ReSharper disable CompareOfFloatsByEqualityOperator if (det != 0.0f) // ReSharper restore CompareOfFloatsByEqualityOperator { det = 1.0f / det; } var a11 = Column1.X; var a12 = Column2.X; var a13 = Column3.X; var a22 = Column2.Y; var a23 = Column3.Y; var a33 = Column3.Z; m.Column1.X = det * (a22 * a33 - a23 * a23); m.Column1.Y = det * (a13 * a23 - a12 * a33); m.Column1.Z = det * (a12 * a23 - a13 * a22); m.Column2.X = m.Column1.Y; m.Column2.Y = det * (a11 * a33 - a13 * a13); m.Column2.Z = det * (a13 * a12 - a11 * a23); m.Column3.X = m.Column1.Z; m.Column3.Y = m.Column2.Z; m.Column3.Z = det * (a11 * a22 - a12 * a12); }
/// <summary>Get the inverse of this matrix as a 2-by-2. Returns the zero matrix if singular.</summary> public void GetInverse22(out Matrix33 m) { var a = Column1.X; var b = Column2.X; var c = Column1.Y; var d = Column2.Y; var det = a * d - b * c; // ReSharper disable CompareOfFloatsByEqualityOperator Intentional. if (det != 0.0f) // ReSharper restore CompareOfFloatsByEqualityOperator { det = 1.0f / det; } m.Column1.X = det * d; m.Column2.X = -det * b; m.Column1.Z = 0.0f; m.Column1.Y = -det * c; m.Column2.Y = det * a; m.Column2.Z = 0.0f; m.Column3.X = 0.0f; m.Column3.Y = 0.0f; m.Column3.Z = 0.0f; }