From 0f14be471e5a11824aaad35a72c5d3b4403832ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Oct 2015 01:02:40 +0200 Subject: [PATCH] Math: ability to construct DualQuaternion from dual vector and scalar. As opposed to real and dual quaternion. --- src/Magnum/Math/DualQuaternion.h | 13 +++++++++++++ src/Magnum/Math/Test/DualQuaternionTest.cpp | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/Magnum/Math/DualQuaternion.h b/src/Magnum/Math/DualQuaternion.h index 37c05514b..0ff09de7b 100644 --- a/src/Magnum/Math/DualQuaternion.h +++ b/src/Magnum/Math/DualQuaternion.h @@ -201,6 +201,19 @@ template class DualQuaternion: public Dual> { */ constexpr /*implicit*/ DualQuaternion(const Quaternion& real, const Quaternion& dual = Quaternion({}, T(0))): Dual>(real, dual) {} + /** + * @brief Construct dual quaternion from dual vector and scalar parts + * + * @f[ + * \hat q = [\hat{\boldsymbol v}, \hat s] = [\boldsymbol v_0, s_0] + \epsilon [\boldsymbol v_\epsilon, s_\epsilon] + * @f] + */ + constexpr /*implicit*/ DualQuaternion(const Dual>& vector, const Dual& scalar) + #ifndef DOXYGEN_GENERATING_OUTPUT + : Dual>{{vector.real(), scalar.real()}, {vector.dual(), scalar.dual()}} + #endif + {} + /** * @brief Construct dual quaternion from vector * diff --git a/src/Magnum/Math/Test/DualQuaternionTest.cpp b/src/Magnum/Math/Test/DualQuaternionTest.cpp index e1e149c62..cc1cfc7f7 100644 --- a/src/Magnum/Math/Test/DualQuaternionTest.cpp +++ b/src/Magnum/Math/Test/DualQuaternionTest.cpp @@ -60,6 +60,7 @@ struct DualQuaternionTest: Corrade::TestSuite::Tester { explicit DualQuaternionTest(); void construct(); + void constructVectorScalar(); void constructIdentity(); void constructZero(); void constructNoInit(); @@ -102,6 +103,7 @@ typedef Math::Vector3 Vector3; DualQuaternionTest::DualQuaternionTest() { addTests({&DualQuaternionTest::construct, + &DualQuaternionTest::constructVectorScalar, &DualQuaternionTest::constructIdentity, &DualQuaternionTest::constructZero, &DualQuaternionTest::constructNoInit, @@ -148,6 +150,17 @@ void DualQuaternionTest::construct() { CORRADE_COMPARE(d, DualQuaternion({{1.0f, 2.0f, 3.0f}, -4.0f}, {{0.0f, 0.0f, 0.0f}, 0.0f})); } +void DualQuaternionTest::constructVectorScalar() { + constexpr DualQuaternion a = {{{1.0f, 2.0f, 3.0f}, {0.5f, -3.1f, 3.3f}}, {-4.0f, 2.0f}}; + CORRADE_COMPARE(a, DualQuaternion({{1.0f, 2.0f, 3.0f}, -4.0f}, {{0.5f, -3.1f, 3.3f}, 2.0f})); + + constexpr Quaternion b = a.real(); + CORRADE_COMPARE(b, Quaternion({1.0f, 2.0f, 3.0f}, -4.0f)); + + constexpr Quaternion c = a.dual(); + CORRADE_COMPARE(c, Quaternion({0.5f, -3.1f, 3.3f}, 2.0f)); +} + void DualQuaternionTest::constructIdentity() { constexpr DualQuaternion a; constexpr DualQuaternion b{IdentityInit};