#ifndef Magnum_Math_DualComplex_h #define Magnum_Math_DualComplex_h /* Copyright © 2010, 2011, 2012 Vladimír Vondruš This file is part of Magnum. Magnum is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3 only, as published by the Free Software Foundation. Magnum is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License version 3 for more details. */ /** @file * @brief Class Magnum::Math::DualComplex */ #include "Math/Dual.h" #include "Math/Complex.h" namespace Magnum { namespace Math { /** @brief %Dual complex number @tparam T Underlying data type Represents 2D rotation and translation. @see Dual, Complex, Matrix3 */ template class DualComplex: public Dual> { public: typedef T Type; /**< @brief Underlying data type */ /** * @brief Default constructor * * Creates unit dual complex number. @f[ * \hat c = (0 + i1) + \epsilon (0 + i0) * @f] * @todoc Remove workaround when Doxygen is predictable */ #ifdef DOXYGEN_GENERATING_OUTPUT inline constexpr /*implicit*/ DualComplex(); #else inline constexpr /*implicit*/ DualComplex(): Dual>({}, {T(0), T(0)}) {} #endif /** * @brief Construct dual complex number from real and dual part * * @f[ * \hat c = c_0 + \epsilon c_\epsilon * @f] */ inline constexpr /*implicit*/ DualComplex(const Complex& real, const Complex& dual): Dual>(real, dual) {} /** * @brief Complex-conjugated dual complex number * * @f[ * \hat c^* = c^*_0 + c^*_\epsilon * @f] * @see dualConjugated(), conjugated(), Complex::conjugated() */ inline DualComplex complexConjugated() const { return {this->real().conjugated(), this->dual().conjugated()}; } /** * @brief Dual-conjugated dual complex number * * @f[ * \overline{\hat c} = c_0 - \epsilon c_\epsilon * @f] * @see complexConjugated(), conjugated(), Dual::conjugated() */ inline DualComplex dualConjugated() const { return Dual>::conjugated(); } /** * @brief Conjugated dual complex number * * Both complex and dual conjugation. @f[ * \overline{\hat c^*} = c^*_0 - \epsilon c^*_\epsilon = c^*_0 + \epsilon(-a_\epsilon + ib_\epsilon) * @f] * @see complexConjugated(), dualConjugated(), Complex::conjugated(), * Dual::conjugated() */ inline DualComplex conjugated() const { return {this->real().conjugated(), {-this->dual().real(), this->dual().imaginary()}}; } MAGNUM_DUAL_SUBCLASS_IMPLEMENTATION(DualComplex, Complex) private: /* Used by Dual operators and dualConjugated() */ inline constexpr DualComplex(const Dual>& other): Dual>(other) {} }; /** @debugoperator{Magnum::Math::DualQuaternion} */ template Corrade::Utility::Debug operator<<(Corrade::Utility::Debug debug, const DualComplex& value) { debug << "DualComplex({"; debug.setFlag(Corrade::Utility::Debug::SpaceAfterEachValue, false); debug << value.real().real() << ", " << value.real().imaginary() << "}, {" << value.dual().real() << ", " << value.dual().imaginary() << "})"; debug.setFlag(Corrade::Utility::Debug::SpaceAfterEachValue, true); return debug; } /* Explicit instantiation for commonly used types */ #ifndef DOXYGEN_GENERATING_OUTPUT extern template Corrade::Utility::Debug MAGNUM_EXPORT operator<<(Corrade::Utility::Debug, const DualComplex&); #ifndef MAGNUM_TARGET_GLES extern template Corrade::Utility::Debug MAGNUM_EXPORT operator<<(Corrade::Utility::Debug, const DualComplex&); #endif #endif }} #endif