package mikera.vectorz;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import mikera.indexz.Index;
import org.junit.Test;
public class TestVectorMath {
@Test public void testBasicAddCopy() {
assertEquals(Vector.of(3.0),Vector1.of(1.0).addCopy(Vector1.of(2.0)));
}
@Test public void testIndexedDotProduct() {
Vector v1=Vector.of(0,1,2,3,4,5,6,7,8,9);
Vector v2=Vector.of(1,2,3);
Index ix=Index.of (2,7,4);
assertEquals((1*2)+(2*7)+(3*4),v1.dotProduct(v2,ix),0.0);
}
@Test public void testSubVectorMultiply() {
Vector v1=Vector.of(1,2,3,4,5);
Vector v2=Vector.of(2,3,4,5,6);
AVector a=v1.subVector(2, 2);
AVector b=v2.subVector(3, 2);
a.multiply(b);
assertEquals(15.0,v1.get(2),0.0);
assertEquals(24.0,v1.get(3),0.0);
assertEquals(Vector.of(5,6),b);
v1=Vector.of(1,2,3,4,5);
v1.multiply(v2);
assertEquals(Vector.of(2,6,12,20,30),v1);
assertEquals(Vector.of(2,3,4,5,6),v2);
}
@Test public void testSubVectorMultiply2() {
Vector v1=Vector.of(1,2,3);
AVector v2=Vector.of(1,2,3,4,5).subVector(1, 3);
v1.multiply(v2);
assertEquals(Vector.of(2,6,12),v1);
assertEquals(Vector.of(2,3,4),v2);
}
@Test public void testDotProduct() {
assertEquals(10.0,new Vector3(1,2,3).dotProduct(new Vector3(3,2,1)),0.000001);
}
@Test public void testProjection() {
Vector3 v=Vector3.of(1,2,3);
v.projectToPlane(Vector3.of(1,0,0), 10);
assertTrue(Vector3.of(10,2,3).epsilonEquals(v));
}
@Test public void testMagnitude() {
assertEquals(14.0,new Vector3(1,-2,3).magnitudeSquared(),0.000001);
assertEquals(5.0,new Vector2(3,4).magnitude(),0.000001);
}
public void doMultiplyTests(AVector v) {
v=v.exactClone();
if (!v.isFullyMutable()) return;
double m=v.magnitude();
v.multiply(2.0);
assertEquals(m*2.0, v.magnitude(),0.0001);
AVector vv=v.exactClone();
vv.set(0.5);
v.multiply(vv);
assertEquals(m, v.magnitude(),0.0001);
}
public void doNormaliseTests(AVector v) {
v=v.clone();
v.normalise();
if (v.magnitude()>0.0) {
assertEquals(1.0,v.magnitude(),0.0001);
}
}
public void doFillTests(AVector v) {
v=v.clone();
v.fill(13.0);
int len=v.length();
for (int i=0; i<len; i++) {
assertEquals(13.0,v.get(i),0.0);
}
}
public void doAdditionTests(AVector v) {
v=v.clone();
AVector ones=v.clone();
ones.fill(1.0);
AVector av=v.clone();
av.add(ones);
av.addMultiple(ones,1.5);
int len=v.length();
for (int i=0; i<len; i++) {
assertEquals(v.get(i)+2.5,av.get(i),0.0001);
}
}
public void doWeightedTests(AVector v) {
v=v.clone();
AVector a=v.clone();
Vectorz.fillRandom(a);
AVector b=a.clone();
b.addWeighted(v,0.0);
assertTrue(b.epsilonEquals(a));
b.addWeighted(v,1.0);
assertTrue(b.epsilonEquals(v));
}
public void doSubtractionTests(AVector v) {
v=v.clone();
AVector ones=v.clone();
ones.fill(1.0);
AVector av=v.clone();
av.add(ones);
av.sub(ones);
assertEquals(v,av);
av.addMultiple(ones,4);
av.subMultiple(ones,1.5);
int len=v.length();
for (int i=0; i<len; i++) {
assertEquals(v.get(i)+2.5,av.get(i),0.0001);
}
}
private void doMagnitudeTests(AVector v) {
assertEquals(v.magnitude(),Vectorz.create(v).magnitude(),0.000001);
}
public void doGenericMaths(AVector v) {
doFillTests(v);
doMultiplyTests(v);
doAdditionTests(v);
doWeightedTests(v);
doSubtractionTests(v);
doNormaliseTests(v);
doMagnitudeTests(v);
}
@Test public void testGenericMaths() {
doGenericMaths(new Vector3(1.0,2.0,3.0));
doGenericMaths(Vectorz.create(1,2,3,4,5,6,7));
doGenericMaths(Vectorz.join(new Vector2(1.0,2.0),Vectorz.create(1,2,3,4,5,6,7)));
doGenericMaths(Vectorz.create(1,2,3,4,5,6,7).subVector(2,3));
for (int dim=0; dim<10; dim++) {
AVector v=Vectorz.newVector(dim);
doGenericMaths(v);
}
}
@Test public void test3DMath() {
Vector3 v=Vector3.of(1,2,3);
Vector3 v2=v.clone();
v2.add(v);
v2.multiply(0.5);
assertTrue(v.epsilonEquals(v2));
}
@Test public void testAngle() {
Vector3 v=Vector3.of(1,2,3);
assertEquals(0.0, v.angle(v),0.0001);
Vector3 v2=v.clone();
v2.negate();
assertEquals(Math.PI, v.angle(v2),0.0001);
}
}