Browse Source

Math: ability to construct DualQuaternion from dual vector and scalar.

As opposed to real and dual quaternion.
pull/118/head
Vladimír Vondruš 11 years ago
parent
commit
0f14be471e
  1. 13
      src/Magnum/Math/DualQuaternion.h
  2. 13
      src/Magnum/Math/Test/DualQuaternionTest.cpp

13
src/Magnum/Math/DualQuaternion.h

@ -201,6 +201,19 @@ template<class T> class DualQuaternion: public Dual<Quaternion<T>> {
*/ */
constexpr /*implicit*/ DualQuaternion(const Quaternion<T>& real, const Quaternion<T>& dual = Quaternion<T>({}, T(0))): Dual<Quaternion<T>>(real, dual) {} constexpr /*implicit*/ DualQuaternion(const Quaternion<T>& real, const Quaternion<T>& dual = Quaternion<T>({}, T(0))): Dual<Quaternion<T>>(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<Vector3<T>>& vector, const Dual<T>& scalar)
#ifndef DOXYGEN_GENERATING_OUTPUT
: Dual<Quaternion<T>>{{vector.real(), scalar.real()}, {vector.dual(), scalar.dual()}}
#endif
{}
/** /**
* @brief Construct dual quaternion from vector * @brief Construct dual quaternion from vector
* *

13
src/Magnum/Math/Test/DualQuaternionTest.cpp

@ -60,6 +60,7 @@ struct DualQuaternionTest: Corrade::TestSuite::Tester {
explicit DualQuaternionTest(); explicit DualQuaternionTest();
void construct(); void construct();
void constructVectorScalar();
void constructIdentity(); void constructIdentity();
void constructZero(); void constructZero();
void constructNoInit(); void constructNoInit();
@ -102,6 +103,7 @@ typedef Math::Vector3<Float> Vector3;
DualQuaternionTest::DualQuaternionTest() { DualQuaternionTest::DualQuaternionTest() {
addTests({&DualQuaternionTest::construct, addTests({&DualQuaternionTest::construct,
&DualQuaternionTest::constructVectorScalar,
&DualQuaternionTest::constructIdentity, &DualQuaternionTest::constructIdentity,
&DualQuaternionTest::constructZero, &DualQuaternionTest::constructZero,
&DualQuaternionTest::constructNoInit, &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})); 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() { void DualQuaternionTest::constructIdentity() {
constexpr DualQuaternion a; constexpr DualQuaternion a;
constexpr DualQuaternion b{IdentityInit}; constexpr DualQuaternion b{IdentityInit};

Loading…
Cancel
Save