package mikera.vectorz;
import java.nio.DoubleBuffer;
import mikera.vectorz.impl.APrimitiveVector;
import mikera.vectorz.util.ErrorMessages;
/**
* Specialised 4D vector
*
* @author Mike
*/
public final class Vector4 extends APrimitiveVector {
private static final long serialVersionUID = -6018622211027585397L;
public double x;
public double y;
public double z;
public double t;
public Vector4() {
super();
}
public Vector4(Vector4 source) {
this.x=source.x;
this.y=source.y;
this.z=source.z;
this.t=source.t;
}
public Vector4(double x, double y, double z, double t) {
this.x=x;
this.y=y;
this.z=z;
this.t=t;
}
public Vector4(double... values) {
if (values.length!=length()) throw new IllegalArgumentException("Can't create "+length()+"D vector from values of length: "+values.length);
this.x=values[0];
this.y=values[1];
this.z=values[2];
this.t=values[3];
}
public static Vector4 of(double x, double y, double z, double t) {
return new Vector4(x,y,z,t);
}
public static Vector4 of(double... values) {
return new Vector4(values);
}
@Override
public void applyOp(Op op) {
x=op.apply(x);
y=op.apply(y);
z=op.apply(z);
t=op.apply(t);
}
public void add(double dx, double dy, double dz, double dt) {
x+=dx;
y+=dy;
z+=dz;
t+=dt;
}
@Override
public void add(AVector v) {
if (v.length()!=4) {
throw new IllegalArgumentException(ErrorMessages.incompatibleShapes(this, v));
}
x+=v.unsafeGet(0);
y+=v.unsafeGet(1);
z+=v.unsafeGet(2);
t+=v.unsafeGet(3);
}
public void add(Vector4 a) {
this.x+=a.x;
this.y+=a.y;
this.z+=a.z;
this.t+=a.t;
}
public void set(Vector4 a) {
this.x=a.x;
this.y=a.y;
this.z=a.z;
this.t=a.t;
}
@Override
public void negate() {
x=-x;
y=-y;
z=-z;
t=-t;
}
public void addMultiple(double dx, double dy, double dz, double dt, double factor) {
x+=dx*factor;
y+=dy*factor;
z+=dz*factor;
t+=dt*factor;
}
@Override
public void addMultiple(AVector v, double factor) {
if (v instanceof Vector4) {
addMultiple((Vector4)v,factor);
} else {
if (v.length()!=4) throw new IllegalArgumentException(ErrorMessages.incompatibleShapes(this,v));
x+=v.unsafeGet(0)*factor;
y+=v.unsafeGet(1)*factor;
z+=v.unsafeGet(2)*factor;
t+=v.unsafeGet(3)*factor;
}
}
public void addMultiple(Vector4 v, double factor) {
x+=v.x*factor;
y+=v.y*factor;
z+=v.z*factor;
t+=v.t*factor;
}
public void addProduct(Vector4 a, Vector4 b) {
x+=a.x*b.x;
y+=a.y*b.y;
z+=a.z*b.z;
t+=a.t*b.t;
}
public void addProduct(Vector4 a, Vector4 b, double factor) {
x+=a.x*b.x*factor;
y+=a.y*b.y*factor;
z+=a.z*b.z*factor;
t+=a.t*b.t*factor;
}
public double dotProduct(Vector4 a) {
return (x*a.x)+(y*a.y)+(z*a.z)+(t*a.t);
}
public double dotProduct(double[] as, int offset) {
return (x*as[offset])+(y*as[offset+1])+(z*as[offset+2])+(t*as[offset+3]);
}
@Override
public double dotProduct(AVector v) {
v.checkLength(4);
return x*v.unsafeGet(0)+y*v.unsafeGet(1)+z*v.unsafeGet(2)+t*v.unsafeGet(3);
}
@Override
public int length() {
return 4;
}
@Override
public double elementSum() {
return x+y+z+t;
}
@Override
public double elementProduct() {
return x*y*z*t;
}
@Override
public double get(int i) {
switch (i) {
case 0: return x;
case 1: return y;
case 2: return z;
case 3: return t;
default: throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, i));
}
}
@Override
public void set(int i, double value) {
switch (i) {
case 0: x=value; return;
case 1: y=value; return;
case 2: z=value; return;
case 3: t=value; return;
default: throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, i));
}
}
@Override
public void addAt(int i, double value) {
switch (i) {
case 0: x+=value; return;
case 1: y+=value; return;
case 2: z+=value; return;
case 3: t+=value; return;
default: throw new IndexOutOfBoundsException(ErrorMessages.invalidIndex(this, i));
}
}
public void setValues(double x, double y, double z, double t) {
this.x=x;
this.y=y;
this.z=z;
this.t=t;
}
@Override
public void getElements(double[] data, int offset) {
data[offset]=x;
data[offset+1]=y;
data[offset+2]=z;
data[offset+3]=t;
}
@Override
public void toDoubleBuffer(DoubleBuffer dest) {
dest.put(x);
dest.put(y);
dest.put(z);
dest.put(t);
}
@Override
public double[] toDoubleArray() {
return new double[] {x,y,z,t};
}
@Override
public Vector4 clone() {
return new Vector4(x,y,z,t);
}
@Override
public double getX() {
return x;
}
@Override
public double getY() {
return y;
}
@Override
public double getZ() {
return z;
}
@Override
public double getT() {
return t;
}
@Override
public Vector4 exactClone() {
return clone();
}
}