blob: 20db139b5a4c37676f3c31a419e42ab1448a5ebc [file] [log] [blame]
class QuaternionTest extends BaseTest {
void TestConjugate(List<quat> input, List<quat> expectedOutput) {
assert(input.length == expectedOutput.length);
print('Testing quaternion conjugate');
for (int i = 0; i < input.length; i++) {
quat output = input[i].conjugate();
RelativeTest(output, expectedOutput[i]);
}
}
void TestQuatMatrixRoundTrip(List<quat> input) {
print('Testing quaternion <-> matrix conversion');
for (int i = 0; i < input.length; i++) {
mat3x3 R = input[i].asRotationMatrix();
quat output = new quat(R);
RelativeTest(output, input[i]);
}
}
void TestQuatMultiply(List<quat> inputA, List<quat> inputB, List<quat> expectedOutput) {
assert((inputA.length == inputB.length) && (inputB.length == expectedOutput.length));
print('Testing quaternion multiply');
for (int i = 0; i < inputA.length; i++) {
quat output = inputA[i] * inputB[i];
RelativeTest(output, expectedOutput[i]);
}
}
void TestQuatVectorRotate(List<quat> inputA, List<vec3> inputB, List<vec3> expectedOutput) {
assert((inputA.length == inputB.length) && (inputB.length == expectedOutput.length));
print('Testing quaternion vector rotation');
for (int i = 0; i < inputA.length; i++) {
vec3 output = inputA[i].rotate(inputB[i]);
RelativeTest(output, expectedOutput[i]);
}
}
void Test() {
{
List<quat> input = new List<quat>();
input.add(new quat());
input.add(new quat(0.18260, 0.54770, 0.73030, 0.36510));
input.add(new quat(0.9889, 0.0, 0.0, 0.14834));
List<quat> expectedOutput = new List<quat>();
expectedOutput.add(new quat(-0.0, -0.0, -0.0, 1.0));
expectedOutput.add(new quat(-0.18260, -0.54770, -0.73030, 0.36510));
expectedOutput.add(new quat(-0.9889, -0.0, -0.0, 0.1483));
TestConjugate(input, expectedOutput);
}
{
List<quat> input = new List<quat>();
input.add(new quat().normalize());
input.add(new quat(0.18260, 0.54770, 0.73030, 0.36510).normalize());
input.add(new quat(0.9889, 0.0, 0.0, 0.14834).normalize());
input.add(new quat(0.388127, 0.803418, -0.433317, -0.126429).normalize());
input.add(new quat(1.0, 0.0, 0.0, 1.0).normalize());
input.add(new quat(0.0, 1.0, 0.0, 1.0).normalize());
input.add(new quat(0.0, 0.0, 1.0, 1.0).normalize());
TestQuatMatrixRoundTrip(input);
}
{
List<quat> inputA = new List<quat>();
inputA.add(new quat(0.18260, 0.54770, 0.73030, 0.36510));
inputA.add(new quat(0.9889, 0.0, 0.0, 0.14834));
List<quat> inputB = new List<quat>();
inputB.add(new quat(0.9889, 0.0, 0.0, 0.14834));
inputB.add(new quat(0.18260, 0.54770, 0.73030, 0.36510));
List<quat> expectedOutput = new List<quat>();
expectedOutput.add(new quat(0.388127, 0.803418, -0.433317, -0.126429));
expectedOutput.add(new quat(0.388127, -0.64097, 0.649924, -0.126429));
TestQuatMultiply(inputA, inputB, expectedOutput);
}
{
List<quat> inputA = new List<quat>();
List<vec3> inputB = new List<vec3>();
List<vec3> expectedOutput = new List<vec3>();
inputA.add(new quat(0.0, 1.0, 0.0, 1.0).normalize());
inputB.add(new vec3(1.0, 1.0, 1.0));
expectedOutput.add(new vec3(-1.0, 1.0, 1.0));
inputA.add(new quat().normalize());
inputB.add(new vec3(1.0, 2.0, 3.0));
expectedOutput.add(new vec3(1.0, 2.0, 3.0));
inputA.add(new quat(0.18260, 0.54770, 0.73030, 0.36510).normalize());
inputB.add(new vec3(1.0, 0.0, 0.0));
expectedOutput.add(new vec3(-0.6667,-0.3333,0.6667));
{
inputA.add(new quat(1.0, 0.0, 0.0, 1.0).normalize());
inputB.add(new vec3(1.0, 0.0, 0.0));
expectedOutput.add(new vec3(1.0, 0.0, 0.0));
inputA.add(new quat(1.0, 0.0, 0.0, 1.0).normalize());
inputB.add(new vec3(0.0, 1.0, 0.0));
expectedOutput.add(new vec3(0.0, 0.0, -1.0));
inputA.add(new quat(1.0, 0.0, 0.0, 1.0).normalize());
inputB.add(new vec3(0.0, 0.0, 1.0));
expectedOutput.add(new vec3(0.0, 1.0, 0.0));
}
{
inputA.add(new quat(0.0, 1.0, 0.0, 1.0).normalize());
inputB.add(new vec3(1.0, 0.0, 0.0));
expectedOutput.add(new vec3(0.0, 0.0, 1.0));
inputA.add(new quat(0.0, 1.0, 0.0, 1.0).normalize());
inputB.add(new vec3(0.0, 1.0, 0.0));
expectedOutput.add(new vec3(0.0, 1.0, 0.0));
inputA.add(new quat(0.0, 1.0, 0.0, 1.0).normalize());
inputB.add(new vec3(0.0, 0.0, 1.0));
expectedOutput.add(new vec3(-1.0, 0.0, 0.0));
}
{
inputA.add(new quat(0.0, 0.0, 1.0, 1.0).normalize());
inputB.add(new vec3(1.0, 0.0, 0.0));
expectedOutput.add(new vec3(0.0, -1.0, 0.0));
inputA.add(new quat(0.0, 0.0, 1.0, 1.0).normalize());
inputB.add(new vec3(0.0, 1.0, 0.0));
expectedOutput.add(new vec3(1.0, 0.0, 0.0));
inputA.add(new quat(0.0, 0.0, 1.0, 1.0).normalize());
inputB.add(new vec3(0.0, 0.0, 1.0));
expectedOutput.add(new vec3(0.0, 0.0, 1.0));
}
TestQuatVectorRotate(inputA, inputB, expectedOutput);
}
print('Quaterion testing finished.');
}
}