From 7e0d8d119f5441c234ff1d82ab65f11eb88f2ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 17 Feb 2013 13:47:42 +0100 Subject: [PATCH] Math: ability to normalize DualQuaternion. Also hope that this is proper implementation. --- src/Math/DualQuaternion.h | 5 +++++ src/Math/Test/DualQuaternionTest.cpp | 9 +++++++++ 2 files changed, 14 insertions(+) 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});