コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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;
        }