#ifndef GEOMETRY_UTILS_ROTATION2_H #define GEOMETRY_UTILS_ROTATION2_H #include #include "GeometryUtilsMath.h" #include "RotationNBase.h" #include "Matrix2x2.h" namespace geometry_utils { template struct Rotation2Base : RotationNBase { Rotation2Base() : RotationNBase() {} Rotation2Base(const Rotation2Base& in) : RotationNBase(in.data) {} Rotation2Base(const boost::array& in) : RotationNBase(in) {} Rotation2Base(T (&in)[2 * 2]) : RotationNBase(in) {} Rotation2Base(const Eigen::Matrix& in) : RotationNBase(in) {} Rotation2Base(const Eigen::Rotation2D& in) : RotationNBase(in.toRotationMatrix()) {} Rotation2Base(const RotationNBase& in) : RotationNBase(in) {} Rotation2Base(const Matrix2x2Base& in) : RotationNBase(in) {} Rotation2Base(const MatrixNxMBase& in) : RotationNBase(in) {} Rotation2Base(T val) { FromAngle(val); } Rotation2Base(T R11, T R12, T R21, T R22) { this->data[0] = R11; this->data[1] = R12; this->data[2] = R21; this->data[3] = R22; } virtual inline bool Equals(const Rotation2Base& that, const T ptol = 1e-8) const { return Error(that) < ptol; } inline T Error(const Rotation2Base& r) const { return math::sin(Angle() - r.Angle()); } inline T Angle() const { return math::atan2(this->data[2], this->data[0]); } inline void FromAngle(T val) { this->data[0] = math::cos(val); this->data[1] = -math::sin(val); this->data[2] = math::sin(val); this->data[3] = math::cos(val); } inline Eigen::Rotation2D Eigen() { return Eigen::Rotation2D(Angle()); } }; inline Rotation2Base operator*(const float& lhs, const Rotation2Base& rhs) { return Rotation2Base(rhs.Scale(lhs)); } inline Rotation2Base operator*(const double& lhs, const Rotation2Base& rhs) { return Rotation2Base(rhs.Scale(lhs)); } template inline Eigen::Rotation2D Eigen(const Rotation2Base& in) { return in.Eigen(); } typedef Rotation2Base Rotation2f; typedef Rotation2Base Rot2f; typedef Rotation2Base Rotation2d; typedef Rotation2Base Rot2d; typedef Rotation2Base Rotation2; typedef Rotation2Base Rot2; } #endif