diff --git a/src/main/java/pythagoras/d/IMatrix4.java b/src/main/java/pythagoras/d/IMatrix4.java index e284858..34b7f73 100644 --- a/src/main/java/pythagoras/d/IMatrix4.java +++ b/src/main/java/pythagoras/d/IMatrix4.java @@ -247,6 +247,21 @@ public interface IMatrix4 */ Vector3 transformVector (IVector3 vector, Vector3 result); + /** + * Transforms {@code vector} by this matrix (M * V). + * + * @return a new vector containing the result. + */ + Vector4 transform (IVector4 vector); + + /** + * Transforms {@code vector} by this matrix (M * V) and stores the result in the object + * provided. + * + * @return a reference to the result vector, for chaining. + */ + Vector4 transform (IVector4 vector, Vector4 result); + /** * Extracts the rotation component of the matrix. * diff --git a/src/main/java/pythagoras/d/IVector4.java b/src/main/java/pythagoras/d/IVector4.java index 3f77eb3..521383f 100644 --- a/src/main/java/pythagoras/d/IVector4.java +++ b/src/main/java/pythagoras/d/IVector4.java @@ -34,4 +34,18 @@ public interface IVector4 * Compares this vector to another with the provided epsilon. */ boolean epsilonEquals (IVector4 other, double epsilon); + + /** + * Multiplies this vector by a matrix (V * M). + * + * @return a new vector containing the result. + */ + IVector4 mult (IMatrix4 matrix); + + /** + * Multiplies this vector by a matrix (V * M) and stores the result in the object provided. + * + * @return a reference to the result vector, for chaining. + */ + IVector4 mult (IMatrix4 matrix, Vector4 result); } diff --git a/src/main/java/pythagoras/d/Matrix4.java b/src/main/java/pythagoras/d/Matrix4.java index 8d53d0d..9bf73cc 100644 --- a/src/main/java/pythagoras/d/Matrix4.java +++ b/src/main/java/pythagoras/d/Matrix4.java @@ -916,6 +916,20 @@ public final class Matrix4 implements IMatrix4, Serializable m02*vx + m12*vy + m22*vz); } + @Override // from IMatrix4 + public Vector4 transform (IVector4 vector) { + return transform(vector, new Vector4()); + } + + @Override // from IMatrix4 + public Vector4 transform (IVector4 vector, Vector4 result) { + double vx = vector.x(), vy = vector.y(), vz = vector.z(), vw = vector.w(); + return result.set(m00*vx + m10*vy + m20*vz + m30*vw, + m01*vx + m11*vy + m21*vz + m31*vw, + m02*vx + m12*vy + m22*vz + m32*vw, + m03*vx + m13*vy + m23*vz + m33*vw); + } + @Override // from IMatrix4 public Quaternion extractRotation () { return extractRotation(new Quaternion()); diff --git a/src/main/java/pythagoras/d/Vector4.java b/src/main/java/pythagoras/d/Vector4.java index 646edec..90fa042 100644 --- a/src/main/java/pythagoras/d/Vector4.java +++ b/src/main/java/pythagoras/d/Vector4.java @@ -92,6 +92,15 @@ public class Vector4 implements IVector4, Serializable return this; } + /** + * Multiplies this vector by a matrix (V * M) and stores the result back in this vector. + * + * @return a reference to this vector, for chaining. + */ + public IVector4 multLocal (IMatrix4 matrix) { + return mult(matrix, this); + } + @Override // from IVector4 public double x () { return x; @@ -125,6 +134,24 @@ public class Vector4 implements IVector4, Serializable Math.abs(w - other.w()) < epsilon); } + @Override // from IVector4 + public IVector4 mult (IMatrix4 matrix) { + return mult(matrix, new Vector4()); + } + + @Override // from IVector4 + public IVector4 mult (IMatrix4 matrix, Vector4 result) { + double m00 = matrix.m00(), m10 = matrix.m10(), m20 = matrix.m20(), m30 = matrix.m30(); + double m01 = matrix.m01(), m11 = matrix.m11(), m21 = matrix.m21(), m31 = matrix.m31(); + double m02 = matrix.m02(), m12 = matrix.m12(), m22 = matrix.m22(), m32 = matrix.m32(); + double m03 = matrix.m03(), m13 = matrix.m13(), m23 = matrix.m23(), m33 = matrix.m33(); + double vx = x, vy = y, vz = z, vw = w; + return result.set(m00*vx + m01*vy + m02*vz + m03*vw, + m10*vx + m11*vy + m12*vz + m13*vw, + m20*vx + m21*vy + m22*vz + m23*vw, + m30*vx + m31*vy + m32*vz + m33*vw); + } + @Override public String toString () { return "[" + x + ", " + y + ", " + z + ", " + w + "]"; diff --git a/src/main/java/pythagoras/f/IMatrix4.java b/src/main/java/pythagoras/f/IMatrix4.java index 4373509..7df310c 100644 --- a/src/main/java/pythagoras/f/IMatrix4.java +++ b/src/main/java/pythagoras/f/IMatrix4.java @@ -247,6 +247,21 @@ public interface IMatrix4 */ Vector3 transformVector (IVector3 vector, Vector3 result); + /** + * Transforms {@code vector} by this matrix (M * V). + * + * @return a new vector containing the result. + */ + Vector4 transform (IVector4 vector); + + /** + * Transforms {@code vector} by this matrix (M * V) and stores the result in the object + * provided. + * + * @return a reference to the result vector, for chaining. + */ + Vector4 transform (IVector4 vector, Vector4 result); + /** * Extracts the rotation component of the matrix. * diff --git a/src/main/java/pythagoras/f/IVector4.java b/src/main/java/pythagoras/f/IVector4.java index f6344ec..ea91fa4 100644 --- a/src/main/java/pythagoras/f/IVector4.java +++ b/src/main/java/pythagoras/f/IVector4.java @@ -34,4 +34,18 @@ public interface IVector4 * Compares this vector to another with the provided epsilon. */ boolean epsilonEquals (IVector4 other, float epsilon); + + /** + * Multiplies this vector by a matrix (V * M). + * + * @return a new vector containing the result. + */ + IVector4 mult (IMatrix4 matrix); + + /** + * Multiplies this vector by a matrix (V * M) and stores the result in the object provided. + * + * @return a reference to the result vector, for chaining. + */ + IVector4 mult (IMatrix4 matrix, Vector4 result); } diff --git a/src/main/java/pythagoras/f/Matrix4.java b/src/main/java/pythagoras/f/Matrix4.java index 2dff095..5a0f8f2 100644 --- a/src/main/java/pythagoras/f/Matrix4.java +++ b/src/main/java/pythagoras/f/Matrix4.java @@ -916,6 +916,20 @@ public final class Matrix4 implements IMatrix4, Serializable m02*vx + m12*vy + m22*vz); } + @Override // from IMatrix4 + public Vector4 transform (IVector4 vector) { + return transform(vector, new Vector4()); + } + + @Override // from IMatrix4 + public Vector4 transform (IVector4 vector, Vector4 result) { + float vx = vector.x(), vy = vector.y(), vz = vector.z(), vw = vector.w(); + return result.set(m00*vx + m10*vy + m20*vz + m30*vw, + m01*vx + m11*vy + m21*vz + m31*vw, + m02*vx + m12*vy + m22*vz + m32*vw, + m03*vx + m13*vy + m23*vz + m33*vw); + } + @Override // from IMatrix4 public Quaternion extractRotation () { return extractRotation(new Quaternion()); diff --git a/src/main/java/pythagoras/f/Vector4.java b/src/main/java/pythagoras/f/Vector4.java index 81ca86e..d8c53f5 100644 --- a/src/main/java/pythagoras/f/Vector4.java +++ b/src/main/java/pythagoras/f/Vector4.java @@ -92,6 +92,15 @@ public class Vector4 implements IVector4, Serializable return this; } + /** + * Multiplies this vector by a matrix (V * M) and stores the result back in this vector. + * + * @return a reference to this vector, for chaining. + */ + public IVector4 multLocal (IMatrix4 matrix) { + return mult(matrix, this); + } + @Override // from IVector4 public float x () { return x; @@ -125,6 +134,24 @@ public class Vector4 implements IVector4, Serializable Math.abs(w - other.w()) < epsilon); } + @Override // from IVector4 + public IVector4 mult (IMatrix4 matrix) { + return mult(matrix, new Vector4()); + } + + @Override // from IVector4 + public IVector4 mult (IMatrix4 matrix, Vector4 result) { + float m00 = matrix.m00(), m10 = matrix.m10(), m20 = matrix.m20(), m30 = matrix.m30(); + float m01 = matrix.m01(), m11 = matrix.m11(), m21 = matrix.m21(), m31 = matrix.m31(); + float m02 = matrix.m02(), m12 = matrix.m12(), m22 = matrix.m22(), m32 = matrix.m32(); + float m03 = matrix.m03(), m13 = matrix.m13(), m23 = matrix.m23(), m33 = matrix.m33(); + float vx = x, vy = y, vz = z, vw = w; + return result.set(m00*vx + m01*vy + m02*vz + m03*vw, + m10*vx + m11*vy + m12*vz + m13*vw, + m20*vx + m21*vy + m22*vz + m23*vw, + m30*vx + m31*vy + m32*vz + m33*vw); + } + @Override public String toString () { return "[" + x + ", " + y + ", " + z + ", " + w + "]";