Пример #1
0
        public static Vector4D operator *(Matrix4D matrix, Vector4D vector)
        {
            if (Matrix4D.ReferenceEquals(matrix, null))
            {
                throw new ArgumentNullException("matrix");
            }

            double[] values = matrix.ReadOnlyColumnMajorValues;

            double x =
                values[0] * vector.X +
                values[4] * vector.Y +
                values[8] * vector.Z +
                values[12] * vector.W;
            double y =
                values[1] * vector.X +
                values[5] * vector.Y +
                values[9] * vector.Z +
                values[13] * vector.W;
            double z =
                values[2] * vector.X +
                values[6] * vector.Y +
                values[10] * vector.Z +
                values[14] * vector.W;
            double w =
                values[3] * vector.X +
                values[7] * vector.Y +
                values[11] * vector.Z +
                values[15] * vector.W;

            return(new Vector4D(x, y, z, w));
        }
Пример #2
0
        public bool Equals(Matrix4D other)
        {
            if (Matrix4D.ReferenceEquals(other, null))
            {
                return(false);
            }

            for (int i = 0; i < _values.Length; ++i)
            {
                if (!_values[i].Equals(other._values[i]))
                {
                    return(false);
                }
            }

            return(true);
        }
Пример #3
0
        public static Matrix4D operator *(Matrix4D left, Matrix4D right)
        {
            if (Matrix4D.ReferenceEquals(left, null))
            {
                throw new ArgumentNullException("left");
            }

            if (Matrix4D.ReferenceEquals(right, null))
            {
                throw new ArgumentNullException("right");
            }

            double[] leftValues  = left.ReadOnlyColumnMajorValues;
            double[] rightValues = right.ReadOnlyColumnMajorValues;

            double col0row0 =
                leftValues[0] * rightValues[0] +
                leftValues[4] * rightValues[1] +
                leftValues[8] * rightValues[2] +
                leftValues[12] * rightValues[3];
            double col0row1 =
                leftValues[1] * rightValues[0] +
                leftValues[5] * rightValues[1] +
                leftValues[9] * rightValues[2] +
                leftValues[13] * rightValues[3];
            double col0row2 =
                leftValues[2] * rightValues[0] +
                leftValues[6] * rightValues[1] +
                leftValues[10] * rightValues[2] +
                leftValues[14] * rightValues[3];
            double col0row3 =
                leftValues[3] * rightValues[0] +
                leftValues[7] * rightValues[1] +
                leftValues[11] * rightValues[2] +
                leftValues[15] * rightValues[3];

            double col1row0 =
                leftValues[0] * rightValues[4] +
                leftValues[4] * rightValues[5] +
                leftValues[8] * rightValues[6] +
                leftValues[12] * rightValues[7];
            double col1row1 =
                leftValues[1] * rightValues[4] +
                leftValues[5] * rightValues[5] +
                leftValues[9] * rightValues[6] +
                leftValues[13] * rightValues[7];
            double col1row2 =
                leftValues[2] * rightValues[4] +
                leftValues[6] * rightValues[5] +
                leftValues[10] * rightValues[6] +
                leftValues[14] * rightValues[7];
            double col1row3 =
                leftValues[3] * rightValues[4] +
                leftValues[7] * rightValues[5] +
                leftValues[11] * rightValues[6] +
                leftValues[15] * rightValues[7];

            double col2row0 =
                leftValues[0] * rightValues[8] +
                leftValues[4] * rightValues[9] +
                leftValues[8] * rightValues[10] +
                leftValues[12] * rightValues[11];
            double col2row1 =
                leftValues[1] * rightValues[8] +
                leftValues[5] * rightValues[9] +
                leftValues[9] * rightValues[10] +
                leftValues[13] * rightValues[11];
            double col2row2 =
                leftValues[2] * rightValues[8] +
                leftValues[6] * rightValues[9] +
                leftValues[10] * rightValues[10] +
                leftValues[14] * rightValues[11];
            double col2row3 =
                leftValues[3] * rightValues[8] +
                leftValues[7] * rightValues[9] +
                leftValues[11] * rightValues[10] +
                leftValues[15] * rightValues[11];

            double col3row0 =
                leftValues[0] * rightValues[12] +
                leftValues[4] * rightValues[13] +
                leftValues[8] * rightValues[14] +
                leftValues[12] * rightValues[15];
            double col3row1 =
                leftValues[1] * rightValues[12] +
                leftValues[5] * rightValues[13] +
                leftValues[9] * rightValues[14] +
                leftValues[13] * rightValues[15];
            double col3row2 =
                leftValues[2] * rightValues[12] +
                leftValues[6] * rightValues[13] +
                leftValues[10] * rightValues[14] +
                leftValues[14] * rightValues[15];
            double col3row3 =
                leftValues[3] * rightValues[12] +
                leftValues[7] * rightValues[13] +
                leftValues[11] * rightValues[14] +
                leftValues[15] * rightValues[15];

            return(new Matrix4D(
                       col0row0, col1row0, col2row0, col3row0,
                       col0row1, col1row1, col2row1, col3row1,
                       col0row2, col1row2, col2row2, col3row2,
                       col0row3, col1row3, col2row3, col3row3));
        }