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)); }
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); }
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)); }