Browse Source

Math: translation dual complex number.

pull/278/head
Vladimír Vondruš 13 years ago
parent
commit
bdc02ddd19
  1. 26
      src/Math/DualComplex.h
  2. 5
      src/Math/DualQuaternion.h
  3. 5
      src/Math/Matrix3.h
  4. 10
      src/Math/Test/DualComplexTest.cpp

26
src/Math/DualComplex.h

@ -49,6 +49,20 @@ template<class T> class DualComplex: public Dual<Complex<T>> {
return {Complex<T>::rotation(angle), {{}, {}}}; return {Complex<T>::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<T> translation(const Vector2<T>& vector) {
return {{}, {vector.x(), vector.y()}};
}
/** /**
* @brief Default constructor * @brief Default constructor
* *
@ -84,6 +98,18 @@ template<class T> class DualComplex: public Dual<Complex<T>> {
return this->real().rotationAngle(); 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<T> translation() const {
return Vector2<T>(this->dual()*this->real().conjugated());
}
/** /**
* @brief Complex-conjugated dual complex number * @brief Complex-conjugated dual complex number
* *

5
src/Math/DualQuaternion.h

@ -59,8 +59,9 @@ template<class T> class DualQuaternion: public Dual<Quaternion<T>> {
* @f[ * @f[
* \hat q = [\boldsymbol 0, 1] + \epsilon [\frac{\boldsymbol v}{2}, 0] * \hat q = [\boldsymbol 0, 1] + \epsilon [\frac{\boldsymbol v}{2}, 0]
* @f] * @f]
* @see translation() const, Matrix3::translation(const Vector2&), * @see translation() const, Matrix4::translation(const Vector3&),
* Vector3::xAxis(), Vector3::yAxis(), Vector3::zAxis() * DualComplex::translation(), Vector3::xAxis(), Vector3::yAxis(),
* Vector3::zAxis()
*/ */
inline static DualQuaternion<T> translation(const Vector3<T>& vector) { inline static DualQuaternion<T> translation(const Vector3<T>& vector) {
return {{}, {vector/T(2), T(0)}}; return {{}, {vector/T(2), T(0)}};

5
src/Math/Matrix3.h

@ -38,8 +38,9 @@ template<class T> class Matrix3: public Matrix<3, T> {
* @brief 2D translation matrix * @brief 2D translation matrix
* @param vector Translation vector * @param vector Translation vector
* *
* @see translation(), Matrix4::translation(const Vector3&), * @see translation(), DualComplex::translation(),
* Vector2::xAxis(), Vector2::yAxis() * Matrix4::translation(const Vector3&), Vector2::xAxis(),
* Vector2::yAxis()
*/ */
inline constexpr static Matrix3<T> translation(const Vector2<T>& vector) { inline constexpr static Matrix3<T> translation(const Vector2<T>& vector) {
return {{ T(1), T(0), T(0)}, return {{ T(1), T(0), T(0)},

10
src/Math/Test/DualComplexTest.cpp

@ -40,6 +40,7 @@ class DualComplexTest: public Corrade::TestSuite::Tester {
void invertedNormalized(); void invertedNormalized();
void rotation(); void rotation();
void translation();
void debug(); void debug();
}; };
@ -49,6 +50,7 @@ typedef Math::Rad<float> Rad;
typedef Math::Complex<float> Complex; typedef Math::Complex<float> Complex;
typedef Math::Dual<float> Dual; typedef Math::Dual<float> Dual;
typedef Math::DualComplex<float> DualComplex; typedef Math::DualComplex<float> DualComplex;
typedef Math::Vector2<float> Vector2;
DualComplexTest::DualComplexTest() { DualComplexTest::DualComplexTest() {
addTests(&DualComplexTest::construct, addTests(&DualComplexTest::construct,
@ -67,6 +69,7 @@ DualComplexTest::DualComplexTest() {
&DualComplexTest::invertedNormalized, &DualComplexTest::invertedNormalized,
&DualComplexTest::rotation, &DualComplexTest::rotation,
&DualComplexTest::translation,
&DualComplexTest::debug); &DualComplexTest::debug);
} }
@ -161,6 +164,13 @@ void DualComplexTest::rotation() {
CORRADE_COMPARE_AS(a.rotationAngle(), Deg(120.0f), Rad); 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() { void DualComplexTest::debug() {
std::ostringstream o; std::ostringstream o;

Loading…
Cancel
Save