Fix issue in Quaternion::Quaternion(Matrix3x3& matrix) constructor and add corresponding unit test

This commit is contained in:
Daniel Chappuis 2020-07-19 01:02:02 +02:00
parent 8e06b3f495
commit 3b2f973ffd
2 changed files with 16 additions and 1 deletions

View File

@ -106,7 +106,7 @@ Quaternion::Quaternion(const Matrix3x3& matrix) {
// Compute the quaternion
x = decimal(0.5) * r;
y = (matrix[0][1] + matrix[1][0]) * s;
z = (matrix[2][0] - matrix[0][2]) * s;
z = (matrix[2][0] + matrix[0][2]) * s;
w = (matrix[2][1] - matrix[1][2]) * s;
}
}

View File

@ -90,6 +90,21 @@ class TestQuaternion : public Test {
rp3d_test(approxEqual(quaternion4.z, mQuaternion1.z));
rp3d_test(approxEqual(quaternion4.w, mQuaternion1.w));
Matrix3x3 original(0.001743,-0.968608,0.248589,-0.614229,-0.197205,-0.764090,0.789126,-0.151359,-0.595290);
Matrix3x3 converted = Quaternion(original).getMatrix();
rp3d_test(approxEqual(original[0][0], converted[0][0], 0.0001));
rp3d_test(approxEqual(original[0][1], converted[0][1], 0.0001));
rp3d_test(approxEqual(original[0][2], converted[0][2], 0.0001));
rp3d_test(approxEqual(original[1][0], converted[1][0], 0.0001));
rp3d_test(approxEqual(original[1][1], converted[1][1], 0.0001));
rp3d_test(approxEqual(original[1][2], converted[1][2], 0.0001));
rp3d_test(approxEqual(original[2][0], converted[2][0], 0.0001));
rp3d_test(approxEqual(original[2][1], converted[2][1], 0.0001));
rp3d_test(approxEqual(original[2][2], converted[2][2], 0.0001));
std::cout << original.to_string() << std::endl;
std::cout << converted.to_string() << std::endl;
// Test conversion from Euler angles to quaternion
const decimal PI_OVER_2 = PI * decimal(0.5);