/*
* 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.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
public class TestTransform {
@Test
public void testIdentity() {
Transform t = new Transform();
Vec4d in = new Vec4d(1, 2, 3, 1.0d);
Vec4d expected = new Vec4d(in);
Vec4d res = new Vec4d(0.0d, 0.0d, 0.0d, 1.0d);
t.apply(in, res);
assertTrue(res.equals4(expected));
}
@Test
public void testTranslation() {
Transform t = new Transform();
Vec4d trans = new Vec4d(3, 4, 5, 1.0d);
t.setTrans(trans);
Vec4d in = new Vec4d(1, 2, 3, 1.0d);
Vec4d expected = new Vec4d(4, 6, 8, 1.0d);
Vec4d res = new Vec4d(0.0d, 0.0d, 0.0d, 1.0d);
t.apply(in, res);
assertTrue(res.equals4(expected));
}
@Test
public void testRotation() {
Transform t = new Transform();
Quaternion rot = new Quaternion();
rot.setRotXAxis(Math.PI/2);
t.setRot(rot);
Vec4d in = new Vec4d(1, 2, 3, 1.0d);
Vec4d expected = new Vec4d(1, -3, 2, 1.0d);
Vec4d res = new Vec4d(0.0d, 0.0d, 0.0d, 1.0d);
t.apply(in, res);
assertTrue(res.near4(expected));
}
@Test
public void testScale() {
Transform t = new Transform();
t.setScale(3);
Vec4d in = new Vec4d(1, 2, 3, 1.0d);
Vec4d expected = new Vec4d(3, 6, 9, 1.0d);
Vec4d res = new Vec4d(0.0d, 0.0d, 0.0d, 1.0d);
t.apply(in, res);
assertTrue(res.near4(expected));
}
@Test
public void testInverse()
{
Vec4d trans = new Vec4d(1, 2, 3, 1.0d);
Quaternion rot = new Quaternion();
rot.setRotZAxis(Math.PI/4);
Transform t = new Transform(trans, rot, 3);
Transform invT = new Transform();
t.inverse(invT);
Transform ident = new Transform();
Transform test = new Transform();
test.merge(t, invT);
assertTrue(test.near(ident));
Mat4d mat = new Mat4d();
Mat4d matInv = new Mat4d();
t.getMat4d(mat);
invT.getMat4d(matInv);
Mat4d identMat = new Mat4d();
Mat4d resMat = new Mat4d();
resMat.mult4(mat, matInv);
assertNear(resMat, identMat);
// Test inverse both ways
resMat.mult4(matInv, mat);
assertNear(resMat, identMat);
}
private static final double EPS = 1e-12d;
public static void assertNear(Mat4d m1, Mat4d m2) {
assertEquals(m1.d00, m2.d00, EPS);
assertEquals(m1.d01, m2.d01, EPS);
assertEquals(m1.d02, m2.d02, EPS);
assertEquals(m1.d03, m2.d03, EPS);
assertEquals(m1.d10, m2.d10, EPS);
assertEquals(m1.d11, m2.d11, EPS);
assertEquals(m1.d12, m2.d12, EPS);
assertEquals(m1.d13, m2.d13, EPS);
assertEquals(m1.d20, m2.d20, EPS);
assertEquals(m1.d21, m2.d21, EPS);
assertEquals(m1.d22, m2.d22, EPS);
assertEquals(m1.d23, m2.d23, EPS);
assertEquals(m1.d30, m2.d30, EPS);
assertEquals(m1.d31, m2.d31, EPS);
assertEquals(m1.d32, m2.d32, EPS);
assertEquals(m1.d33, m2.d33, EPS);
}
/**
* Make sure the transforms can write to themselves cleanly
*/
@Test
public void testSelfAssignment() {
Vec4d trans1 = new Vec4d(1, 2, 3, 1.0d);
Quaternion rot1 = new Quaternion();
rot1.setRotZAxis(Math.PI/4);
Transform t1 = new Transform(trans1, rot1, 3);
Vec4d trans2 = new Vec4d(3, 2, 1, 1.0d);
Quaternion rot2 = new Quaternion();
rot2.setRotXAxis(Math.PI/3);
Transform t2 = new Transform(trans2, rot2, 6);
Transform t3 = new Transform();
t3.merge(t1, t2);
t1.merge(t1, t2);
assertTrue(t1.equals(t3));
t3.merge(t1, t2);
t2.merge(t1, t2);
assertTrue(t2.equals(t3));
Transform t4 = new Transform();
t2.inverse(t4);
t2.inverse(t2);
assertTrue(t2.equals(t4));
}
}