diff --git a/src/Math/DualComplex.h b/src/Math/DualComplex.h index 483011ee7..d03186a80 100644 --- a/src/Math/DualComplex.h +++ b/src/Math/DualComplex.h @@ -49,6 +49,20 @@ template class DualComplex: public Dual> { return {Complex::rotation(angle), {{}, {}}}; } + /** + * @brief Translation dual complex number + * @param vector Translation vector + * + * @f[ + * \hat c = (0 + i1) + \epsilon (v_x + iv_y) + * @f] + * @see translation() const, Matrix3::translation(const Vector2&), + * DualQuaternion::translation(), Vector2::xAxis(), Vector2::yAxis() + */ + inline static DualComplex translation(const Vector2& vector) { + return {{}, {vector.x(), vector.y()}}; + } + /** * @brief Default constructor * @@ -84,6 +98,18 @@ template class DualComplex: public Dual> { return this->real().rotationAngle(); } + /** + * @brief Translation part of dual complex number + * + * @f[ + * \boldsymbol a = (c_\epsilon c_0^*) + * @f] + * @see translation(const Vector2&) + */ + inline Vector2 translation() const { + return Vector2(this->dual()*this->real().conjugated()); + } + /** * @brief Complex-conjugated dual complex number * diff --git a/src/Math/DualQuaternion.h b/src/Math/DualQuaternion.h index 3f58a20bd..b9a9f67ad 100644 --- a/src/Math/DualQuaternion.h +++ b/src/Math/DualQuaternion.h @@ -59,8 +59,9 @@ template class DualQuaternion: public Dual> { * @f[ * \hat q = [\boldsymbol 0, 1] + \epsilon [\frac{\boldsymbol v}{2}, 0] * @f] - * @see translation() const, Matrix3::translation(const Vector2&), - * Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis() + * @see translation() const, Matrix4::translation(const Vector3&), + * DualComplex::translation(), Vector3::xAxis(), Vector3::yAxis(), + * Vector3::zAxis() */ inline static DualQuaternion translation(const Vector3& vector) { return {{}, {vector/T(2), T(0)}}; diff --git a/src/Math/Matrix3.h b/src/Math/Matrix3.h index 8f9ae7002..e36b9a7ef 100644 --- a/src/Math/Matrix3.h +++ b/src/Math/Matrix3.h @@ -38,8 +38,9 @@ template class Matrix3: public Matrix<3, T> { * @brief 2D translation matrix * @param vector Translation vector * - * @see translation(), Matrix4::translation(const Vector3&), - * Vector2::xAxis(), Vector2::yAxis() + * @see translation(), DualComplex::translation(), + * Matrix4::translation(const Vector3&), Vector2::xAxis(), + * Vector2::yAxis() */ inline constexpr static Matrix3 translation(const Vector2& vector) { return {{ T(1), T(0), T(0)}, diff --git a/src/Math/Test/DualComplexTest.cpp b/src/Math/Test/DualComplexTest.cpp index 38cc9e38b..dd3ab5968 100644 --- a/src/Math/Test/DualComplexTest.cpp +++ b/src/Math/Test/DualComplexTest.cpp @@ -40,6 +40,7 @@ class DualComplexTest: public Corrade::TestSuite::Tester { void invertedNormalized(); void rotation(); + void translation(); void debug(); }; @@ -49,6 +50,7 @@ typedef Math::Rad Rad; typedef Math::Complex Complex; typedef Math::Dual Dual; typedef Math::DualComplex DualComplex; +typedef Math::Vector2 Vector2; DualComplexTest::DualComplexTest() { addTests(&DualComplexTest::construct, @@ -67,6 +69,7 @@ DualComplexTest::DualComplexTest() { &DualComplexTest::invertedNormalized, &DualComplexTest::rotation, + &DualComplexTest::translation, &DualComplexTest::debug); } @@ -161,6 +164,13 @@ void DualComplexTest::rotation() { CORRADE_COMPARE_AS(a.rotationAngle(), Deg(120.0f), Rad); } +void DualComplexTest::translation() { + Vector2 vec(1.5f, -3.5f); + DualComplex a = DualComplex::translation(vec); + CORRADE_COMPARE(a, DualComplex({}, {1.5f, -3.5f})); + CORRADE_COMPARE(a.translation(), vec); +} + void DualComplexTest::debug() { std::ostringstream o;