diff --git a/src/Math/DualQuaternion.h b/src/Math/DualQuaternion.h index 10a75cc25..3076acd42 100644 --- a/src/Math/DualQuaternion.h +++ b/src/Math/DualQuaternion.h @@ -208,6 +208,11 @@ template class DualQuaternion: public Dual> { return Math::sqrt(lengthSquared()); } + /** @brief Normalized quaternion (of length 1) */ + inline DualQuaternion normalized() const { + return (*this)/length(); + } + /** * @brief Inverted dual quaternion * diff --git a/src/Math/Test/DualQuaternionTest.cpp b/src/Math/Test/DualQuaternionTest.cpp index e18862dc5..bed18d4f4 100644 --- a/src/Math/Test/DualQuaternionTest.cpp +++ b/src/Math/Test/DualQuaternionTest.cpp @@ -31,6 +31,7 @@ class DualQuaternionTest: public Corrade::TestSuite::Tester { void lengthSquared(); void length(); + void normalized(); void quaternionConjugated(); void dualConjugated(); @@ -60,6 +61,7 @@ DualQuaternionTest::DualQuaternionTest() { &DualQuaternionTest::lengthSquared, &DualQuaternionTest::length, + &DualQuaternionTest::normalized, &DualQuaternionTest::quaternionConjugated, &DualQuaternionTest::dualConjugated, @@ -103,6 +105,13 @@ void DualQuaternionTest::length() { CORRADE_COMPARE(a.length(), Dual(5.477226f, -0.821584f)); } +void DualQuaternionTest::normalized() { + DualQuaternion a({{1.0f, 2.0f, 3.0f}, -4.0f}, {{0.5f, -3.0f, 3.0f}, 2.0f}); + DualQuaternion b({{0.182574f, 0.365148f, 0.547723f}, -0.730297f}, {{0.118673f, -0.49295f, 0.629881f}, 0.255604f}); + CORRADE_COMPARE(a.normalized().length(), 1.0f); + CORRADE_COMPARE(a.normalized(), b); +} + void DualQuaternionTest::quaternionConjugated() { DualQuaternion a({{ 1.0f, 2.0f, 3.0f}, -4.0f}, {{ 0.5f, -3.1f, 3.3f}, 2.0f}); DualQuaternion b({{-1.0f, -2.0f, -3.0f}, -4.0f}, {{-0.5f, 3.1f, -3.3f}, 2.0f});