예제 #1
0
        public unsafe static void Invert(Matrix3x3 *m, Matrix3x3 *inverse)
        {
            var mScalar       = (M *)m;
            var inverseScalar = (M *)inverse;

            var m11 = mScalar->M22 * mScalar->M33 - mScalar->M32 * mScalar->M23;
            var m21 = mScalar->M23 * mScalar->M31 - mScalar->M33 * mScalar->M21;
            var m31 = mScalar->M21 * mScalar->M32 - mScalar->M31 * mScalar->M22;
            var determinantInverse = 1f / (m11 * mScalar->M11 + m21 * mScalar->M12 + m31 * mScalar->M13);

            var m12 = mScalar->M32 * mScalar->M13 - mScalar->M12 * mScalar->M33;
            var m22 = mScalar->M33 * mScalar->M11 - mScalar->M13 * mScalar->M31;
            var m32 = mScalar->M31 * mScalar->M12 - mScalar->M11 * mScalar->M32;

            var m13 = mScalar->M12 * mScalar->M23 - mScalar->M22 * mScalar->M13;
            var m23 = mScalar->M13 * mScalar->M21 - mScalar->M23 * mScalar->M11;
            var m33 = mScalar->M11 * mScalar->M22 - mScalar->M21 * mScalar->M12;

            inverseScalar->M11 = m11 * determinantInverse;
            inverseScalar->M21 = m21 * determinantInverse;
            inverseScalar->M31 = m31 * determinantInverse;

            inverseScalar->M12 = m12 * determinantInverse;
            inverseScalar->M22 = m22 * determinantInverse;
            inverseScalar->M32 = m32 * determinantInverse;

            inverseScalar->M13 = m13 * determinantInverse;
            inverseScalar->M23 = m23 * determinantInverse;
            inverseScalar->M33 = m33 * determinantInverse;
        }
예제 #2
0
        public unsafe void Matrix3x3FieldOffsetTest()
        {
            Matrix3x3 mat = new Matrix3x3();

            float *    basePtr = &mat.M11; // Take address of first element
            Matrix3x3 *matPtr  = &mat;     // Take address of whole matrix

            Assert.AreEqual(new IntPtr(basePtr), new IntPtr(matPtr));

            Assert.AreEqual(new IntPtr(basePtr + 0), new IntPtr(&mat.M11));
            Assert.AreEqual(new IntPtr(basePtr + 1), new IntPtr(&mat.M12));
            Assert.AreEqual(new IntPtr(basePtr + 2), new IntPtr(&mat.M13));

            Assert.AreEqual(new IntPtr(basePtr + 3), new IntPtr(&mat.M21));
            Assert.AreEqual(new IntPtr(basePtr + 4), new IntPtr(&mat.M22));
            Assert.AreEqual(new IntPtr(basePtr + 5), new IntPtr(&mat.M23));

            Assert.AreEqual(new IntPtr(basePtr + 6), new IntPtr(&mat.M31));
            Assert.AreEqual(new IntPtr(basePtr + 7), new IntPtr(&mat.M32));
            Assert.AreEqual(new IntPtr(basePtr + 8), new IntPtr(&mat.M33));
        }
예제 #3
0
 public unsafe static void Transpose(Matrix3x3 *m, Matrix3x3 *transposed)
 {
     Transpose((M *)m, (M *)transposed);
 }