/*
* Copyright (C) 2012 Google 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 org.ros.rosjava_geometry;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
/**
* @author damonkohler@google.com (Damon Kohler)
*/
public class QuaternionTest {
@Test
public void testAxisAngleToQuaternion() {
Quaternion quaternion;
quaternion = Quaternion.fromAxisAngle(Vector3.zAxis(), 0);
assertEquals(0, quaternion.getX(), 1e-9);
assertEquals(0, quaternion.getY(), 1e-9);
assertEquals(0, quaternion.getZ(), 1e-9);
assertEquals(1, quaternion.getW(), 1e-9);
quaternion = Quaternion.fromAxisAngle(Vector3.zAxis(), Math.PI);
assertEquals(0, quaternion.getX(), 1e-9);
assertEquals(0, quaternion.getY(), 1e-9);
assertEquals(1, quaternion.getZ(), 1e-9);
assertEquals(0, quaternion.getW(), 1e-9);
quaternion = Quaternion.fromAxisAngle(Vector3.zAxis(), Math.PI / 2);
assertEquals(0, quaternion.getX(), 1e-9);
assertEquals(0, quaternion.getY(), 1e-9);
assertEquals(0.7071067811865475, quaternion.getZ(), 1e-9);
assertEquals(0.7071067811865475, quaternion.getW(), 1e-9);
quaternion = Quaternion.fromAxisAngle(Vector3.zAxis(), -Math.PI / 2);
assertEquals(0, quaternion.getX(), 1e-9);
assertEquals(0, quaternion.getY(), 1e-9);
assertEquals(-0.7071067811865475, quaternion.getZ(), 1e-9);
assertEquals(0.7071067811865475, quaternion.getW(), 1e-9);
quaternion = Quaternion.fromAxisAngle(Vector3.zAxis(), 0.75 * Math.PI);
assertEquals(0, quaternion.getX(), 1e-9);
assertEquals(0, quaternion.getY(), 1e-9);
assertEquals(0.9238795325112867, quaternion.getZ(), 1e-9);
assertEquals(0.38268343236508984, quaternion.getW(), 1e-9);
quaternion = Quaternion.fromAxisAngle(Vector3.zAxis(), -0.75 * Math.PI);
assertEquals(0, quaternion.getX(), 1e-9);
assertEquals(0, quaternion.getY(), 1e-9);
assertEquals(-0.9238795325112867, quaternion.getZ(), 1e-9);
assertEquals(0.38268343236508984, quaternion.getW(), 1e-9);
quaternion = Quaternion.fromAxisAngle(Vector3.zAxis(), 1.5 * Math.PI);
assertEquals(0, quaternion.getX(), 1e-9);
assertEquals(0, quaternion.getY(), 1e-9);
assertEquals(0.7071067811865475, quaternion.getZ(), 1e-9);
assertEquals(-0.7071067811865475, quaternion.getW(), 1e-9);
}
@Test
public void testInvert() {
Quaternion inverse = Quaternion.fromAxisAngle(Vector3.zAxis(), Math.PI / 2).invert();
assertEquals(0, inverse.getX(), 1e-9);
assertEquals(0, inverse.getY(), 1e-9);
assertEquals(-0.7071067811865475, inverse.getZ(), 1e-9);
assertEquals(0.7071067811865475, inverse.getW(), 1e-9);
}
@Test
public void testMultiply() {
Quaternion quaternion = Quaternion.fromAxisAngle(Vector3.zAxis(), Math.PI / 2);
Quaternion inverse = quaternion.invert();
Quaternion rotated = quaternion.multiply(inverse);
assertEquals(1, rotated.getW(), 1e-9);
}
@Test
public void testRotateVector() {
Quaternion quaternion = Quaternion.fromAxisAngle(Vector3.zAxis(), Math.PI / 2);
Vector3 vector = new Vector3(1, 0, 0);
Vector3 rotated = quaternion.rotateAndScaleVector(vector);
assertEquals(0, rotated.getX(), 1e-9);
assertEquals(1, rotated.getY(), 1e-9);
assertEquals(0, rotated.getZ(), 1e-9);
}
}