/*
* JaamSim Discrete Event Simulation
* Copyright (C) 2012 Ausenco Engineering Canada Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jaamsim.math;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class TestVec4d extends TestVec {
@Test
public void testConstructors() {
Vec4d vec4 = new Vec4d();
vec4.w = 0;
assertEqual(vec4, zero);
vec4 = new Vec4d(seq);
assertEqual(vec4, seq);
vec4 = new Vec4d(1.0d, 2.0d, 3.0d, 4.0d);
assertEqual(vec4, seq);
}
@Test
public void testString() {
Vec4d vec = new Vec4d();
vec.set4(seq);
assertTrue("(1.0, 2.0, 3.0, 4.0)".equals(vec.toString()));
vec.set4(nseq);
assertTrue("(-1.0, -2.0, -3.0, -4.0)".equals(vec.toString()));
vec.set4(allNaN);
assertTrue("(NaN, NaN, NaN, NaN)".equals(vec.toString()));
vec.set4(Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY);
assertTrue("(Infinity, -Infinity, Infinity, -Infinity)".equals(vec.toString()));
}
@Test
public void testEquals() {
Vec4d vec = new Vec4d(seq);
assertTrue(vec.equals2(seq));
assertFalse(vec.equals2(one));
assertTrue(vec.equals3(seq));
assertFalse(vec.equals3(one));
assertTrue(vec.equals4(seq));
assertFalse(vec.equals4(one));
// Test -0.0 and 0.0 compare as equal
vec.set4(-0.0d, -0.0d, -0.0d, -0.0d);
assertTrue(vec.equals2(zero));
assertTrue(vec.equals3(zero));
assertTrue(vec.equals4(zero));
// any vec containing NaN will compare as not equal, even itself
vec.set4(allNaN);
assertFalse(vec.equals2(allNaN));
assertFalse(vec.equals3(allNaN));
assertFalse(vec.equals4(allNaN));
assertFalse(allNaN.equals4(allNaN));
}
@Test
public void testSet() {
Vec4d vec;
// Test set from another vec
vec = new Vec4d(seq);
vec.set2(zero);
assertEqual(vec, zseq2);
vec = new Vec4d(seq);
vec.set3(zero);
assertEqual(vec, zseq3);
vec = new Vec4d(seq);
vec.set4(zero);
assertEqual(vec, zseq4);
// Test set from doubles
vec = new Vec4d(seq);
vec.set2(0.0d, 0.0d);
assertEqual(vec, zseq2);
vec = new Vec4d(seq);
vec.set3(0.0d, 0.0d, 0.0d);
assertEqual(vec, zseq3);
vec = new Vec4d(seq);
vec.set4(0.0d, 0.0d, 0.0d, 0.0d);
assertEqual(vec, zseq4);
}
@Test
public void testAdd() {
Vec4d vec;
// Test add into vec
vec = new Vec4d(seq);
vec.add2(seq);
assertEqual(vec, seqadd2);
vec = new Vec4d(seq);
vec.add3(seq);
assertEqual(vec, seqadd3);
vec = new Vec4d(seq);
vec.add4(seq);
assertEqual(vec, seqadd4);
// Test set vec to sum
vec = new Vec4d(seq);
vec.add2(seq, seq);
assertEqual(vec, seqadd2);
vec = new Vec4d(seq);
vec.add3(seq, seq);
assertEqual(vec, seqadd3);
vec = new Vec4d(seq);
vec.add4(seq, seq);
assertEqual(vec, seqadd4);
}
@Test
public void testSub() {
Vec4d vec;
// Test sub into vec
vec = new Vec4d(seq);
vec.sub2(one);
assertEqual(vec, seqsub2);
vec = new Vec4d(seq);
vec.sub3(one);
assertEqual(vec, seqsub3);
vec = new Vec4d(seq);
vec.sub4(one);
assertEqual(vec, seqsub4);
// Test set vec to sub
vec = new Vec4d(seq);
vec.sub2(seq, one);
assertEqual(vec, seqsub2);
vec = new Vec4d(seq);
vec.sub3(seq, one);
assertEqual(vec, seqsub3);
vec = new Vec4d(seq);
vec.sub4(seq, one);
assertEqual(vec, seqsub4);
}
@Test
public void testScale() {
Vec4d vec;
vec = new Vec4d(seq);
vec.scale2(2.0d);
assertEqual(vec, scaleseq2);
vec = new Vec4d(seq);
vec.scale3(2.0d);
assertEqual(vec, scaleseq3);
vec = new Vec4d(seq);
vec.scale4(2.0d);
assertEqual(vec, scaleseq4);
vec = new Vec4d(seq);
vec.scale2(2.0d, seq);
assertEqual(vec, scaleseq2);
vec = new Vec4d(seq);
vec.scale3(2.0d, seq);
assertEqual(vec, scaleseq3);
vec = new Vec4d(seq);
vec.scale4(2.0d, seq);
assertEqual(vec, scaleseq4);
}
@Test
public void testInterpolation() {
Vec4d vec;
// Test add into vec
vec = new Vec4d(seq);
vec.interpolate2(seq, scaleseq4, 0.0d);
assertEqual(vec, seq);
vec.interpolate2(seq, scaleseq4, 1.0d);
assertEqual(vec, scaleseq2);
vec.interpolate2(seq, scaleseq4, 0.5d);
assertEqual(vec, interpseq2);
vec.interpolate3(seq, scaleseq4, 0.0d);
assertEqual(vec, seq);
vec.interpolate3(seq, scaleseq4, 1.0d);
assertEqual(vec, scaleseq3);
vec.interpolate3(seq, scaleseq4, 0.5d);
assertEqual(vec, interpseq3);
vec.interpolate4(seq, scaleseq4, 0.0d);
assertEqual(vec, seq);
vec.interpolate4(seq, scaleseq4, 1.0d);
assertEqual(vec, scaleseq4);
vec.interpolate4(seq, scaleseq4, 0.5d);
assertEqual(vec, interpseq4);
}
@Test
public void testMul() {
Vec4d vec;
// Test mul into vec
vec = new Vec4d(seq);
vec.mul2(seq);
assertEqual(vec, seqmul2);
vec = new Vec4d(seq);
vec.mul3(seq);
assertEqual(vec, seqmul3);
vec = new Vec4d(seq);
vec.mul4(seq);
assertEqual(vec, seqmul4);
// Test set vec to mul
vec = new Vec4d(seq);
vec.mul2(seq, seq);
assertEqual(vec, seqmul2);
vec = new Vec4d(seq);
vec.mul3(seq, seq);
assertEqual(vec, seqmul3);
vec = new Vec4d(seq);
vec.mul4(seq, seq);
assertEqual(vec, seqmul4);
}
@Test
public void testMin() {
Vec4d vec;
// Test mul into vec
vec = new Vec4d(seq);
vec.min2(nseq);
assertEqual(vec, seqmin2);
vec = new Vec4d(seq);
vec.min3(nseq);
assertEqual(vec, seqmin3);
vec = new Vec4d(seq);
vec.min4(nseq);
assertEqual(vec, seqmin4);
// Test set vec to mul
vec = new Vec4d(seq);
vec.min2(seq, nseq);
assertEqual(vec, seqmin2);
vec = new Vec4d(seq);
vec.min3(seq, nseq);
assertEqual(vec, seqmin3);
vec = new Vec4d(seq);
vec.min4(seq, nseq);
assertEqual(vec, seqmin4);
}
@Test
public void testMax() {
Vec4d vec;
// Test mul into vec
vec = new Vec4d(nseq);
vec.max2(seq);
assertEqual(vec, seqmax2);
vec = new Vec4d(nseq);
vec.max3(seq);
assertEqual(vec, seqmax3);
vec = new Vec4d(nseq);
vec.max4(seq);
assertEqual(vec, seqmax4);
// Test set vec to mul
vec = new Vec4d(nseq);
vec.max2(seq, nseq);
assertEqual(vec, seqmax2);
vec = new Vec4d(nseq);
vec.max3(seq, nseq);
assertEqual(vec, seqmax3);
vec = new Vec4d(nseq);
vec.max4(seq, nseq);
assertEqual(vec, seqmax4);
}
@Test
public void testDot() {
Vec4d vec = new Vec4d(3.0d, 4.0d, 5.0d, 6.0d);
assertTrue(vec.dot2(one) == 7.0d);
assertTrue(vec.dot2(seq) == 11.0d);
assertTrue(vec.dot3(one) == 12.0d);
assertTrue(vec.dot3(seq) == 26.0d);
assertTrue(vec.dot4(one) == 18.0d);
assertTrue(vec.dot4(seq) == 50.0d);
assertTrue(vec.mag2() == 5.0d);
assertTrue(vec.mag3() == Math.sqrt(50.0d));
assertTrue(vec.mag4() == Math.sqrt(86.0d));
assertTrue(vec.magSquare2() == 25.0d);
assertTrue(vec.magSquare3() == 50.0d);
assertTrue(vec.magSquare4() == 86.0d);
}
@Test
public void testCross3() {
Vec4d vec;
vec = new Vec4d(xaxis);
vec.w = 0;
vec.cross3(yaxis);
assertEqual(vec, zaxis);
vec = new Vec4d(yaxis);
vec.w = 0;
vec.cross3(xaxis);
assertEqual(vec, negzaxis);
vec = new Vec4d();
vec.w = 0;
vec.cross3(xaxis, yaxis);
assertEqual(vec, zaxis);
vec = new Vec4d();
vec.w = 0;
vec.cross3(yaxis, xaxis);
assertEqual(vec, negzaxis);
}
@Test
public void testNormalize() {
Vec4d vec;
vec = new Vec4d(one);
vec.normalize2();
assertNear(vec.magSquare2(), 1.0d);
assertNear(vec.mag2(), 1.0d);
vec = new Vec4d(one);
vec.normalize3();
assertNear(vec.magSquare3(), 1.0d);
assertNear(vec.mag3(), 1.0d);
vec = new Vec4d(one);
vec.normalize4();
assertNear(vec.magSquare4(), 1.0d);
assertNear(vec.mag4(), 1.0d);
vec.normalize2(one);
assertNear(vec.magSquare2(), 1.0d);
assertNear(vec.mag2(), 1.0d);
vec.normalize3(one);
assertNear(vec.magSquare3(), 1.0d);
assertNear(vec.mag3(), 1.0d);
vec.normalize4(one);
assertNear(vec.magSquare4(), 1.0d);
assertNear(vec.mag4(), 1.0d);
}
@Test
public void testMult() {
Vec4d vec = new Vec4d();
vec.w = 0;
vec.mult2(TestMat4d.seqOne, one);
assertEqual(vec, mult2);
vec.mult2(one, TestMat4d.seqOne);
assertEqual(vec, mult2tpose);
vec.mult3(TestMat4d.seqOne, one);
assertEqual(vec, mult3);
vec.mult3(one, TestMat4d.seqOne);
assertEqual(vec, mult3tpose);
vec.mult4(TestMat4d.seqOne, one);
assertEqual(vec, mult4);
vec.mult4(one, TestMat4d.seqOne);
assertEqual(vec, mult4tpose);
}
@Test
public void testNormDegen() {
Vec4d vec;
vec = new Vec4d(zero);
vec.normalize2();
assertEqual(vec, yaxis);
vec = new Vec4d(posInf);
vec.normalize2();
assertEqual(vec, deg2posInf);
vec = new Vec4d(negInf);
vec.normalize2();
assertEqual(vec, deg2negInf);
vec = new Vec4d(mixInf);
vec.normalize2();
assertEqual(vec, deg2mixInf);
vec = new Vec4d(mixInfNaN);
vec.normalize2();
assertEqualNaN(vec, deg2mixInfNaN);
vec = new Vec4d(oneNaN);
vec.normalize2();
assertEqual(vec, yaxis);
vec = new Vec4d(zero);
vec.normalize3();
assertEqual(vec, zaxis);
vec = new Vec4d(posInf);
vec.normalize3();
assertEqual(vec, deg3posInf);
vec = new Vec4d(negInf);
vec.normalize3();
assertEqual(vec, deg3negInf);
vec = new Vec4d(mixInf);
vec.normalize3();
assertEqual(vec, deg3mixInf);
vec = new Vec4d(mixInfNaN);
vec.normalize3();
assertEqual(vec, deg3mixInfNaN);
vec = new Vec4d(oneNaN);
vec.normalize3();
assertEqual(vec, zaxis);
vec = new Vec4d(zero);
vec.normalize4();
assertEqual(vec, waxis);
vec = new Vec4d(posInf);
vec.normalize4();
assertEqual(vec, waxis);
vec = new Vec4d(negInf);
vec.normalize4();
assertEqual(vec, waxis);
vec = new Vec4d(mixInf);
vec.normalize4();
assertEqual(vec, waxis);
vec = new Vec4d(mixInfNaN);
vec.normalize4();
assertEqual(vec, waxis);
vec = new Vec4d(oneNaN);
vec.normalize4();
assertEqual(vec, waxis);
// Test one-arg version
vec = new Vec4d();
vec.w = 0;
vec.normalize2(zero);
assertEqual(vec, yaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize2(posInf);
assertEqual(vec, yaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize2(negInf);
assertEqual(vec, yaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize2(mixInf);
assertEqual(vec, yaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize2(mixInfNaN);
assertEqual(vec, yaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize2(oneNaN);
assertEqual(vec, yaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize3(zero);
assertEqual(vec, zaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize3(posInf);
assertEqual(vec, zaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize3(negInf);
assertEqual(vec, zaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize3(mixInf);
assertEqual(vec, zaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize3(mixInfNaN);
assertEqual(vec, zaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize3(oneNaN);
assertEqual(vec, zaxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize4(zero);
assertEqual(vec, waxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize4(posInf);
assertEqual(vec, waxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize4(negInf);
assertEqual(vec, waxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize4(mixInf);
assertEqual(vec, waxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize4(mixInfNaN);
assertEqual(vec, waxis);
vec = new Vec4d();
vec.w = 0;
vec.normalize4(oneNaN);
assertEqual(vec, waxis);
}
}