| | #include <gtest/gtest.h> |
| | #include <Base/DualQuaternion.h> |
| | #include <Base/Tools.h> |
| |
|
| | TEST(DualQuaternion, TestDefault) |
| | { |
| | Base::DualQuat qq; |
| | EXPECT_EQ(qq.x.re, 0.0); |
| | EXPECT_EQ(qq.x.du, 0.0); |
| | EXPECT_EQ(qq.y.re, 0.0); |
| | EXPECT_EQ(qq.y.du, 0.0); |
| | EXPECT_EQ(qq.z.re, 0.0); |
| | EXPECT_EQ(qq.z.du, 0.0); |
| | EXPECT_EQ(qq.w.re, 0.0); |
| | EXPECT_EQ(qq.w.du, 0.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestFromDouble) |
| | { |
| | Base::DualQuat qq(1.0, 2.0, 3.0, 4.0); |
| | EXPECT_EQ(qq.x.re, 1.0); |
| | EXPECT_EQ(qq.x.du, 0.0); |
| | EXPECT_EQ(qq.y.re, 2.0); |
| | EXPECT_EQ(qq.y.du, 0.0); |
| | EXPECT_EQ(qq.z.re, 3.0); |
| | EXPECT_EQ(qq.z.du, 0.0); |
| | EXPECT_EQ(qq.w.re, 4.0); |
| | EXPECT_EQ(qq.w.du, 0.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestFromDoubles) |
| | { |
| | Base::DualQuat qq(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); |
| | EXPECT_EQ(qq.x.re, 1.0); |
| | EXPECT_EQ(qq.x.du, 5.0); |
| | EXPECT_EQ(qq.y.re, 2.0); |
| | EXPECT_EQ(qq.y.du, 6.0); |
| | EXPECT_EQ(qq.z.re, 3.0); |
| | EXPECT_EQ(qq.z.du, 7.0); |
| | EXPECT_EQ(qq.w.re, 4.0); |
| | EXPECT_EQ(qq.w.du, 8.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestFromDual) |
| | { |
| | Base::DualNumber dn(1.0, 2.0); |
| | Base::DualQuat qq(dn, dn, dn, dn); |
| | EXPECT_EQ(qq.x.re, 1.0); |
| | EXPECT_EQ(qq.x.du, 2.0); |
| | EXPECT_EQ(qq.y.re, 1.0); |
| | EXPECT_EQ(qq.y.du, 2.0); |
| | EXPECT_EQ(qq.z.re, 1.0); |
| | EXPECT_EQ(qq.z.du, 2.0); |
| | EXPECT_EQ(qq.w.re, 1.0); |
| | EXPECT_EQ(qq.w.du, 2.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestIdentity) |
| | { |
| | Base::DualQuat qq = Base::DualQuat::identity(); |
| | EXPECT_EQ(qq.x.re, 0.0); |
| | EXPECT_EQ(qq.x.du, 0.0); |
| | EXPECT_EQ(qq.y.re, 0.0); |
| | EXPECT_EQ(qq.y.du, 0.0); |
| | EXPECT_EQ(qq.z.re, 0.0); |
| | EXPECT_EQ(qq.z.du, 0.0); |
| | EXPECT_EQ(qq.w.re, 1.0); |
| | EXPECT_EQ(qq.w.du, 0.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestReal) |
| | { |
| | Base::DualQuat qq = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0).real(); |
| | EXPECT_EQ(qq.x.re, 1.0); |
| | EXPECT_EQ(qq.x.du, 0.0); |
| | EXPECT_EQ(qq.y.re, 2.0); |
| | EXPECT_EQ(qq.y.du, 0.0); |
| | EXPECT_EQ(qq.z.re, 3.0); |
| | EXPECT_EQ(qq.z.du, 0.0); |
| | EXPECT_EQ(qq.w.re, 4.0); |
| | EXPECT_EQ(qq.w.du, 0.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestDual) |
| | { |
| | Base::DualQuat qq = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0).dual(); |
| | EXPECT_EQ(qq.x.re, 5.0); |
| | EXPECT_EQ(qq.x.du, 0.0); |
| | EXPECT_EQ(qq.y.re, 6.0); |
| | EXPECT_EQ(qq.y.du, 0.0); |
| | EXPECT_EQ(qq.z.re, 7.0); |
| | EXPECT_EQ(qq.z.du, 0.0); |
| | EXPECT_EQ(qq.w.re, 8.0); |
| | EXPECT_EQ(qq.w.du, 0.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestConjugate) |
| | { |
| | Base::DualQuat qq = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0).conj(); |
| | EXPECT_EQ(qq.x.re, -1.0); |
| | EXPECT_EQ(qq.x.du, -5.0); |
| | EXPECT_EQ(qq.y.re, -2.0); |
| | EXPECT_EQ(qq.y.du, -6.0); |
| | EXPECT_EQ(qq.z.re, -3.0); |
| | EXPECT_EQ(qq.z.du, -7.0); |
| | EXPECT_EQ(qq.w.re, 4.0); |
| | EXPECT_EQ(qq.w.du, 8.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestVec) |
| | { |
| | Base::DualQuat qq = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0).vec(); |
| | EXPECT_EQ(qq.x.re, 1.0); |
| | EXPECT_EQ(qq.x.du, 5.0); |
| | EXPECT_EQ(qq.y.re, 2.0); |
| | EXPECT_EQ(qq.y.du, 6.0); |
| | EXPECT_EQ(qq.z.re, 3.0); |
| | EXPECT_EQ(qq.z.du, 7.0); |
| | EXPECT_EQ(qq.w.re, 0.0); |
| | EXPECT_EQ(qq.w.du, 0.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestLength) |
| | { |
| | Base::DualQuat qq = Base::DualQuat(0.0, 0.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); |
| | EXPECT_DOUBLE_EQ(qq.length(), 5.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestTheta) |
| | { |
| | Base::DualQuat qq = Base::DualQuat(0.0, 0.0, 3.0, 3.0, 5.0, 6.0, 7.0, 8.0); |
| | EXPECT_DOUBLE_EQ(qq.theta(), Base::toRadians(90.0)); |
| | } |
| |
|
| | TEST(DualQuaternion, TestDot) |
| | { |
| | Base::DualQuat qq1 = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); |
| | Base::DualQuat qq2 = Base::DualQuat(1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0); |
| | double dot = Base::DualQuat::dot(qq1, qq2); |
| | EXPECT_DOUBLE_EQ(dot, 10.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestNegate) |
| | { |
| | Base::DualQuat qq = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); |
| | Base::DualQuat dn(-qq); |
| | EXPECT_EQ(dn.x.re, -1.0); |
| | EXPECT_EQ(dn.x.du, -5.0); |
| | EXPECT_EQ(dn.y.re, -2.0); |
| | EXPECT_EQ(dn.y.du, -6.0); |
| | EXPECT_EQ(dn.z.re, -3.0); |
| | EXPECT_EQ(dn.z.du, -7.0); |
| | EXPECT_EQ(dn.w.re, -4.0); |
| | EXPECT_EQ(dn.w.du, -8.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestPlus) |
| | { |
| | Base::DualQuat qq1 = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); |
| | Base::DualQuat qq2 = Base::DualQuat(1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0); |
| | Base::DualQuat qq3 = qq1 + qq2; |
| | EXPECT_EQ(qq3.x.re, 2.0); |
| | EXPECT_EQ(qq3.x.du, 7.0); |
| | EXPECT_EQ(qq3.y.re, 3.0); |
| | EXPECT_EQ(qq3.y.du, 8.0); |
| | EXPECT_EQ(qq3.z.re, 4.0); |
| | EXPECT_EQ(qq3.z.du, 9.0); |
| | EXPECT_EQ(qq3.w.re, 5.0); |
| | EXPECT_EQ(qq3.w.du, 10.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestMinus) |
| | { |
| | Base::DualQuat qq1 = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); |
| | Base::DualQuat qq2 = Base::DualQuat(1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0); |
| | Base::DualQuat qq3 = qq1 - qq2; |
| | EXPECT_EQ(qq3.x.re, 0.0); |
| | EXPECT_EQ(qq3.x.du, 3.0); |
| | EXPECT_EQ(qq3.y.re, 1.0); |
| | EXPECT_EQ(qq3.y.du, 4.0); |
| | EXPECT_EQ(qq3.z.re, 2.0); |
| | EXPECT_EQ(qq3.z.du, 5.0); |
| | EXPECT_EQ(qq3.w.re, 3.0); |
| | EXPECT_EQ(qq3.w.du, 6.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestMultiplyQuat) |
| | { |
| | Base::DualQuat qq1 = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); |
| | Base::DualQuat qq2 = Base::DualQuat(1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0); |
| | Base::DualQuat qq3 = qq1 * qq2; |
| | EXPECT_EQ(qq3.x.re, 4.0); |
| | EXPECT_EQ(qq3.x.du, 20.0); |
| | EXPECT_EQ(qq3.y.re, 8.0); |
| | EXPECT_EQ(qq3.y.du, 32.0); |
| | EXPECT_EQ(qq3.z.re, 6.0); |
| | EXPECT_EQ(qq3.z.du, 26.0); |
| | EXPECT_EQ(qq3.w.re, -2.0); |
| | EXPECT_EQ(qq3.w.du, -14.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestMultiplyNumber) |
| | { |
| | Base::DualQuat qq1 = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); |
| | Base::DualNumber dn1(1.0, 2.0); |
| |
|
| | Base::DualQuat qq4 = qq1 * dn1; |
| | EXPECT_EQ(qq4.x.re, 1.0); |
| | EXPECT_EQ(qq4.x.du, 7.0); |
| | EXPECT_EQ(qq4.y.re, 2.0); |
| | EXPECT_EQ(qq4.y.du, 10.0); |
| | EXPECT_EQ(qq4.z.re, 3.0); |
| | EXPECT_EQ(qq4.z.du, 13.0); |
| | EXPECT_EQ(qq4.w.re, 4.0); |
| | EXPECT_EQ(qq4.w.du, 16.0); |
| |
|
| | Base::DualQuat qq5 = dn1 * qq1; |
| | EXPECT_EQ(qq5.x.re, 1.0); |
| | EXPECT_EQ(qq5.x.du, 7.0); |
| | EXPECT_EQ(qq5.y.re, 2.0); |
| | EXPECT_EQ(qq5.y.du, 10.0); |
| | EXPECT_EQ(qq5.z.re, 3.0); |
| | EXPECT_EQ(qq5.z.du, 13.0); |
| | EXPECT_EQ(qq5.w.re, 4.0); |
| | EXPECT_EQ(qq5.w.du, 16.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestMultiplyScalar) |
| | { |
| | Base::DualQuat qq1 = Base::DualQuat(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); |
| |
|
| | Base::DualQuat qq4 = qq1 * 2.0; |
| | EXPECT_EQ(qq4.x.re, 2.0); |
| | EXPECT_EQ(qq4.x.du, 10.0); |
| | EXPECT_EQ(qq4.y.re, 4.0); |
| | EXPECT_EQ(qq4.y.du, 12.0); |
| | EXPECT_EQ(qq4.z.re, 6.0); |
| | EXPECT_EQ(qq4.z.du, 14.0); |
| | EXPECT_EQ(qq4.w.re, 8.0); |
| | EXPECT_EQ(qq4.w.du, 16.0); |
| |
|
| | Base::DualQuat qq5 = 2.0 * qq1; |
| | EXPECT_EQ(qq5.x.re, 2.0); |
| | EXPECT_EQ(qq5.x.du, 10.0); |
| | EXPECT_EQ(qq5.y.re, 4.0); |
| | EXPECT_EQ(qq5.y.du, 12.0); |
| | EXPECT_EQ(qq5.z.re, 6.0); |
| | EXPECT_EQ(qq5.z.du, 14.0); |
| | EXPECT_EQ(qq5.w.re, 8.0); |
| | EXPECT_EQ(qq5.w.du, 16.0); |
| | } |
| |
|
| | TEST(DualQuaternion, TestPow) |
| | { |
| | const double epsilon = 1e-12; |
| | Base::DualQuat qq1 = Base::DualQuat(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0); |
| | Base::DualQuat qq2 = qq1.pow(2.0); |
| | EXPECT_NEAR(qq2.x.re, 0.0, epsilon); |
| | EXPECT_NEAR(qq2.x.du, 0.0, epsilon); |
| | EXPECT_NEAR(qq2.y.re, 0.0, epsilon); |
| | EXPECT_NEAR(qq2.y.du, 0.0, epsilon); |
| | EXPECT_NEAR(qq2.z.re, 0.0, epsilon); |
| | EXPECT_NEAR(qq2.z.du, 0.0, epsilon); |
| | EXPECT_NEAR(qq2.w.re, -1.0, epsilon); |
| | EXPECT_NEAR(qq2.w.du, 0.0, epsilon); |
| | } |
| |
|