From c293630c7ce9bfd9df692d3ed2132404fe691e40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 20 Feb 2013 21:09:49 +0100 Subject: [PATCH] Math: using Rad for Quaternion and DualQuaternion functions. --- src/Math/DualQuaternion.h | 6 ++-- src/Math/Quaternion.h | 20 ++++++------ src/Math/Test/DualQuaternionTest.cpp | 39 +++++++++++----------- src/Math/Test/QuaternionTest.cpp | 48 +++++++++++++++------------- 4 files changed, 58 insertions(+), 55 deletions(-) diff --git a/src/Math/DualQuaternion.h b/src/Math/DualQuaternion.h index 5302ab46f..3230272c8 100644 --- a/src/Math/DualQuaternion.h +++ b/src/Math/DualQuaternion.h @@ -46,9 +46,9 @@ template class DualQuaternion: public Dual> { * @f] * @see rotationAngle(), rotationAxis(), Quaternion::rotation(), * Matrix4::rotation(), Vector3::xAxis(), Vector3::yAxis(), - * Vector3::zAxis(), deg(), rad() + * Vector3::zAxis() */ - inline static DualQuaternion rotation(T angle, const Vector3& normalizedAxis) { + inline static DualQuaternion rotation(Rad angle, const Vector3& normalizedAxis) { return {Quaternion::rotation(angle, normalizedAxis), {{}, T(0)}}; } @@ -112,7 +112,7 @@ template class DualQuaternion: public Dual> { * @f] * @see rotationAxis(), rotation(), Quaternion::rotationAngle() */ - inline T rotationAngle() const { + inline Math::Rad rotationAngle() const { return this->real().rotationAngle(); } diff --git a/src/Math/Quaternion.h b/src/Math/Quaternion.h index 8f9a451be..ef87aa2ff 100644 --- a/src/Math/Quaternion.h +++ b/src/Math/Quaternion.h @@ -55,16 +55,16 @@ template class Quaternion { } /** - * @brief Angle between normalized quaternions (in radians) + * @brief Angle between normalized quaternions * * Expects that both quaternions are normalized. @f[ * \theta = acos \left( \frac{p \cdot q}{|p| \cdot |q|} \right) * @f] */ - inline static T angle(const Quaternion& normalizedA, const Quaternion& normalizedB) { + inline static Rad angle(const Quaternion& normalizedA, const Quaternion& normalizedB) { CORRADE_ASSERT(MathTypeTraits::equals(normalizedA.dot(), T(1)) && MathTypeTraits::equals(normalizedB.dot(), T(1)), - "Math::Quaternion::angle(): quaternions must be normalized", std::numeric_limits::quiet_NaN()); - return angleInternal(normalizedA, normalizedB); + "Math::Quaternion::angle(): quaternions must be normalized", Rad(std::numeric_limits::quiet_NaN())); + return Rad(angleInternal(normalizedA, normalizedB)); } /** @@ -116,13 +116,13 @@ template class Quaternion { * @f] * @see rotationAngle(), rotationAxis(), DualQuaternion::rotation(), * Matrix4::rotation(), Vector3::xAxis(), Vector3::yAxis(), - * Vector3::zAxis(), deg(), rad() + * Vector3::zAxis() */ - inline static Quaternion rotation(T angle, const Vector3& normalizedAxis) { + inline static Quaternion rotation(Rad angle, const Vector3& normalizedAxis) { CORRADE_ASSERT(MathTypeTraits::equals(normalizedAxis.dot(), T(1)), "Math::Quaternion::rotation(): axis must be normalized", {}); - return {normalizedAxis*std::sin(angle/2), std::cos(angle/2)}; + return {normalizedAxis*std::sin(T(angle)/2), std::cos(T(angle)/2)}; } /** @@ -177,11 +177,11 @@ template class Quaternion { * @f] * @see rotationAxis(), rotation() */ - inline T rotationAngle() const { + inline Rad rotationAngle() const { CORRADE_ASSERT(MathTypeTraits::equals(dot(), T(1)), "Math::Quaternion::rotationAngle(): quaternion must be normalized", - std::numeric_limits::quiet_NaN()); - return T(2)*std::acos(_scalar); + Rad(std::numeric_limits::quiet_NaN())); + return Rad(T(2)*std::acos(_scalar)); } /** diff --git a/src/Math/Test/DualQuaternionTest.cpp b/src/Math/Test/DualQuaternionTest.cpp index 88481305e..ae44c49cd 100644 --- a/src/Math/Test/DualQuaternionTest.cpp +++ b/src/Math/Test/DualQuaternionTest.cpp @@ -50,6 +50,8 @@ class DualQuaternionTest: public Corrade::TestSuite::Tester { void debug(); }; +typedef Math::Deg Deg; +typedef Math::Rad Rad; typedef Math::Dual Dual; typedef Math::Matrix4 Matrix4; typedef Math::DualQuaternion DualQuaternion; @@ -169,15 +171,14 @@ void DualQuaternionTest::rotation() { std::ostringstream o; Error::setOutput(&o); - float angle = deg(120.0f); Vector3 axis(1.0f/Constants::sqrt3()); - CORRADE_COMPARE(DualQuaternion::rotation(angle, axis*2.0f), DualQuaternion()); + CORRADE_COMPARE(DualQuaternion::rotation(Deg(120.0f), axis*2.0f), DualQuaternion()); CORRADE_COMPARE(o.str(), "Math::Quaternion::rotation(): axis must be normalized\n"); - DualQuaternion q = DualQuaternion::rotation(angle, axis); + DualQuaternion q = DualQuaternion::rotation(Deg(120.0f), axis); CORRADE_COMPARE(q, DualQuaternion({Vector3(0.5f, 0.5f, 0.5f), 0.5f}, {{}, 0.0f})); - CORRADE_COMPARE(q.rotationAngle(), angle); + CORRADE_COMPARE_AS(q.rotationAngle(), Deg(120.0f), Deg); CORRADE_COMPARE(q.rotationAxis(), axis); } @@ -190,21 +191,21 @@ void DualQuaternionTest::translation() { void DualQuaternionTest::combinedTransformParts() { Vector3 translation = Vector3(-1.0f, 2.0f, 3.0f); - DualQuaternion a = DualQuaternion::translation(translation)*DualQuaternion::rotation(deg(23.0f), Vector3::xAxis()); - DualQuaternion b = DualQuaternion::rotation(deg(23.0f), Vector3::xAxis())*DualQuaternion::translation(translation); + DualQuaternion a = DualQuaternion::translation(translation)*DualQuaternion::rotation(Deg(23.0f), Vector3::xAxis()); + DualQuaternion b = DualQuaternion::rotation(Deg(23.0f), Vector3::xAxis())*DualQuaternion::translation(translation); CORRADE_COMPARE(a.rotationAxis(), Vector3::xAxis()); CORRADE_COMPARE(b.rotationAxis(), Vector3::xAxis()); - CORRADE_COMPARE(a.rotationAngle(), deg(23.0f)); - CORRADE_COMPARE(b.rotationAngle(), deg(23.0f)); + CORRADE_COMPARE_AS(a.rotationAngle(), Deg(23.0f), Rad); + CORRADE_COMPARE_AS(b.rotationAngle(), Deg(23.0f), Rad); CORRADE_COMPARE(a.translation(), translation); - CORRADE_COMPARE(b.translation(), Quaternion::rotation(deg(23.0f), Vector3::xAxis()).rotateVectorNormalized(translation)); + CORRADE_COMPARE(b.translation(), Quaternion::rotation(Deg(23.0f), Vector3::xAxis()).rotateVectorNormalized(translation)); } void DualQuaternionTest::matrix() { - DualQuaternion q = DualQuaternion::rotation(deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({-1.0f, 2.0f, 3.0f}); - Matrix4 m = Matrix4::rotationX(deg(23.0f))*Matrix4::translation({-1.0f, 2.0f, 3.0f}); + DualQuaternion q = DualQuaternion::rotation(Deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({-1.0f, 2.0f, 3.0f}); + Matrix4 m = Matrix4::rotationX(Deg(23.0f))*Matrix4::translation({-1.0f, 2.0f, 3.0f}); /* Verify that negated dual quaternion gives the same transformation */ CORRADE_COMPARE(q.matrix(), m); @@ -212,10 +213,10 @@ void DualQuaternionTest::matrix() { } void DualQuaternionTest::transformPoint() { - DualQuaternion a = DualQuaternion::translation({-1.0f, 2.0f, 3.0f})*DualQuaternion::rotation(deg(23.0f), Vector3::xAxis()); - DualQuaternion b = DualQuaternion::rotation(deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({-1.0f, 2.0f, 3.0f}); - Matrix4 m = Matrix4::translation({-1.0f, 2.0f, 3.0f})*Matrix4::rotationX(deg(23.0f)); - Matrix4 n = Matrix4::rotationX(deg(23.0f))*Matrix4::translation({-1.0f, 2.0f, 3.0f}); + DualQuaternion a = DualQuaternion::translation({-1.0f, 2.0f, 3.0f})*DualQuaternion::rotation(Deg(23.0f), Vector3::xAxis()); + DualQuaternion b = DualQuaternion::rotation(Deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({-1.0f, 2.0f, 3.0f}); + Matrix4 m = Matrix4::translation({-1.0f, 2.0f, 3.0f})*Matrix4::rotationX(Deg(23.0f)); + Matrix4 n = Matrix4::rotationX(Deg(23.0f))*Matrix4::translation({-1.0f, 2.0f, 3.0f}); Vector3 v(0.0f, -3.6f, 0.7f); Vector3 transformedA = (a*Dual(2)).transformPoint(v); @@ -228,10 +229,10 @@ void DualQuaternionTest::transformPoint() { } void DualQuaternionTest::transformPointNormalized() { - DualQuaternion a = DualQuaternion::translation({-1.0f, 2.0f, 3.0f})*DualQuaternion::rotation(deg(23.0f), Vector3::xAxis()); - DualQuaternion b = DualQuaternion::rotation(deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({-1.0f, 2.0f, 3.0f}); - Matrix4 m = Matrix4::translation({-1.0f, 2.0f, 3.0f})*Matrix4::rotationX(deg(23.0f)); - Matrix4 n = Matrix4::rotationX(deg(23.0f))*Matrix4::translation({-1.0f, 2.0f, 3.0f}); + DualQuaternion a = DualQuaternion::translation({-1.0f, 2.0f, 3.0f})*DualQuaternion::rotation(Deg(23.0f), Vector3::xAxis()); + DualQuaternion b = DualQuaternion::rotation(Deg(23.0f), Vector3::xAxis())*DualQuaternion::translation({-1.0f, 2.0f, 3.0f}); + Matrix4 m = Matrix4::translation({-1.0f, 2.0f, 3.0f})*Matrix4::rotationX(Deg(23.0f)); + Matrix4 n = Matrix4::rotationX(Deg(23.0f))*Matrix4::translation({-1.0f, 2.0f, 3.0f}); Vector3 v(0.0f, -3.6f, 0.7f); std::ostringstream o; diff --git a/src/Math/Test/QuaternionTest.cpp b/src/Math/Test/QuaternionTest.cpp index 285a62fbf..acf98e833 100644 --- a/src/Math/Test/QuaternionTest.cpp +++ b/src/Math/Test/QuaternionTest.cpp @@ -58,6 +58,8 @@ class QuaternionTest: public Corrade::TestSuite::Tester { void debug(); }; +typedef Math::Deg Deg; +typedef Math::Rad Rad; typedef Math::Matrix<3, float> Matrix3; typedef Math::Matrix4 Matrix4; typedef Math::Quaternion Quaternion; @@ -227,48 +229,48 @@ void QuaternionTest::rotation() { std::ostringstream o; Error::setOutput(&o); - float angle = deg(120.0f); Vector3 axis(1.0f/Constants::sqrt3()); - CORRADE_COMPARE(Quaternion::rotation(deg(-74.0f), {-1.0f, 2.0f, 2.0f}), Quaternion()); + CORRADE_COMPARE(Quaternion::rotation(Deg(-74.0f), {-1.0f, 2.0f, 2.0f}), Quaternion()); CORRADE_COMPARE(o.str(), "Math::Quaternion::rotation(): axis must be normalized\n"); - Quaternion q = Quaternion::rotation(angle, axis); + Quaternion q = Quaternion::rotation(Deg(120.0f), axis); CORRADE_COMPARE(q, Quaternion(Vector3(0.5f, 0.5f, 0.5f), 0.5f)); - CORRADE_COMPARE(q.rotationAngle(), angle); + CORRADE_COMPARE_AS(q.rotationAngle(), Deg(120.0f), Deg); CORRADE_COMPARE(q.rotationAxis(), axis); CORRADE_COMPARE(q.rotationAxis().length(), 1.0f); /* Verify negative angle */ - Quaternion q2 = Quaternion::rotation(deg(-120.0f), axis); + Quaternion q2 = Quaternion::rotation(Deg(-120.0f), axis); CORRADE_COMPARE(q2, Quaternion(Vector3(-0.5f, -0.5f, -0.5f), 0.5f)); - CORRADE_COMPARE(q2.rotationAngle(), deg(120.0f)); + CORRADE_COMPARE_AS(q2.rotationAngle(), Deg(120.0f), Deg); CORRADE_COMPARE(q2.rotationAxis(), -axis); /* Default-constructed quaternion has zero angle and NaN axis */ - CORRADE_COMPARE(Quaternion().rotationAngle(), deg(0.0f)); + CORRADE_COMPARE_AS(Quaternion().rotationAngle(), Deg(0.0f), Deg); CORRADE_VERIFY(Quaternion().rotationAxis() != Quaternion().rotationAxis()); } void QuaternionTest::angle() { std::ostringstream o; Corrade::Utility::Error::setOutput(&o); - CORRADE_COMPARE(Quaternion::angle(Quaternion({1.0f, 2.0f, -3.0f}, -4.0f).normalized(), {{4.0f, -3.0f, 2.0f}, -1.0f}), - std::numeric_limits::quiet_NaN()); + auto angle = Quaternion::angle(Quaternion({1.0f, 2.0f, -3.0f}, -4.0f).normalized(), {{4.0f, -3.0f, 2.0f}, -1.0f}); + CORRADE_VERIFY(angle != angle); CORRADE_COMPARE(o.str(), "Math::Quaternion::angle(): quaternions must be normalized\n"); o.str(""); - CORRADE_COMPARE(Quaternion::angle({{1.0f, 2.0f, -3.0f}, -4.0f}, Quaternion({4.0f, -3.0f, 2.0f}, -1.0f).normalized()), - std::numeric_limits::quiet_NaN()); + angle = Quaternion::angle({{1.0f, 2.0f, -3.0f}, -4.0f}, Quaternion({4.0f, -3.0f, 2.0f}, -1.0f).normalized()); + CORRADE_VERIFY(angle != angle); CORRADE_COMPARE(o.str(), "Math::Quaternion::angle(): quaternions must be normalized\n"); - CORRADE_COMPARE(Quaternion::angle(Quaternion({1.0f, 2.0f, -3.0f}, -4.0f).normalized(), Quaternion({4.0f, -3.0f, 2.0f}, -1.0f).normalized()), - rad(1.704528f)); + CORRADE_COMPARE(Quaternion::angle(Quaternion({1.0f, 2.0f, -3.0f}, -4.0f).normalized(), + Quaternion({4.0f, -3.0f, 2.0f}, -1.0f).normalized()), + Rad(1.704528f)); } void QuaternionTest::matrix() { - Quaternion q = Quaternion::rotation(deg(37.0f), Vector3(1.0f/Constants::sqrt3())); - Matrix3 m = Matrix4::rotation(deg(37.0f), Vector3(1.0f/Constants::sqrt3())).rotationScaling(); + Quaternion q = Quaternion::rotation(Deg(37.0f), Vector3(1.0f/Constants::sqrt3())); + Matrix3 m = Matrix4::rotation(Deg(37.0f), Vector3(1.0f/Constants::sqrt3())).rotationScaling(); /* Verify that negated quaternion gives the same rotation */ CORRADE_COMPARE(q.matrix(), m); @@ -276,8 +278,8 @@ void QuaternionTest::matrix() { } void QuaternionTest::lerp() { - Quaternion a = Quaternion::rotation(deg(15.0f), Vector3(1.0f/Constants::sqrt3())); - Quaternion b = Quaternion::rotation(deg(23.0f), Vector3::xAxis()); + Quaternion a = Quaternion::rotation(Deg(15.0f), Vector3(1.0f/Constants::sqrt3())); + Quaternion b = Quaternion::rotation(Deg(23.0f), Vector3::xAxis()); std::ostringstream o; Corrade::Utility::Error::setOutput(&o); @@ -298,8 +300,8 @@ void QuaternionTest::lerp() { } void QuaternionTest::slerp() { - Quaternion a = Quaternion::rotation(deg(15.0f), Vector3(1.0f/Constants::sqrt3())); - Quaternion b = Quaternion::rotation(deg(23.0f), Vector3::xAxis()); + Quaternion a = Quaternion::rotation(Deg(15.0f), Vector3(1.0f/Constants::sqrt3())); + Quaternion b = Quaternion::rotation(Deg(23.0f), Vector3::xAxis()); std::ostringstream o; Corrade::Utility::Error::setOutput(&o); @@ -320,8 +322,8 @@ void QuaternionTest::slerp() { } void QuaternionTest::rotateVector() { - Quaternion a = Quaternion::rotation(deg(23.0f), Vector3::xAxis()); - Matrix4 m = Matrix4::rotationX(deg(23.0f)); + Quaternion a = Quaternion::rotation(Deg(23.0f), Vector3::xAxis()); + Matrix4 m = Matrix4::rotationX(Deg(23.0f)); Vector3 v(5.0f, -3.6f, 0.7f); Vector3 rotated = a.rotateVector(v); @@ -330,8 +332,8 @@ void QuaternionTest::rotateVector() { } void QuaternionTest::rotateVectorNormalized() { - Quaternion a = Quaternion::rotation(deg(23.0f), Vector3::xAxis()); - Matrix4 m = Matrix4::rotationX(deg(23.0f)); + Quaternion a = Quaternion::rotation(Deg(23.0f), Vector3::xAxis()); + Matrix4 m = Matrix4::rotationX(Deg(23.0f)); Vector3 v(5.0f, -3.6f, 0.7f); std::ostringstream o;