diff --git a/Eigen/src/Geometry/Rotation2D.h b/Eigen/src/Geometry/Rotation2D.h index 65aa83be5..8b0ddcfb0 100644 --- a/Eigen/src/Geometry/Rotation2D.h +++ b/Eigen/src/Geometry/Rotation2D.h @@ -64,6 +64,16 @@ public: /** Default constructor wihtout initialization. The represented rotation is undefined. */ Rotation2D() {} + /** Construct a 2D rotation from a 2x2 rotation matrix \a mat. + * + * \sa fromRotationMatrix() + */ + template + explicit Rotation2D(const MatrixBase& m) + { + fromRotationMatrix(m.derived()); + } + /** \returns the rotation angle */ inline Scalar angle() const { return m_angle; } @@ -103,6 +113,17 @@ public: Rotation2D& fromRotationMatrix(const MatrixBase& m); Matrix2 toRotationMatrix() const; + /** Set \c *this from a 2x2 rotation matrix \a mat. + * In other words, this function extract the rotation angle from the rotation matrix. + * + * This method is an alias for fromRotationMatrix() + * + * \sa fromRotationMatrix() + */ + template + Rotation2D& operator=(const MatrixBase& m) + { return fromRotationMatrix(m.derived()); } + /** \returns the spherical interpolation between \c *this and \a other using * parameter \a t. It is in fact equivalent to a linear interpolation. */ diff --git a/test/geo_transformations.cpp b/test/geo_transformations.cpp index 94ed155ef..51f90036d 100644 --- a/test/geo_transformations.cpp +++ b/test/geo_transformations.cpp @@ -430,6 +430,10 @@ template void transformations() VERIFY( rot2.smallestAngle() >= -Scalar(EIGEN_PI) ); VERIFY( rot2.smallestAngle() <= Scalar(EIGEN_PI) ); VERIFY_IS_APPROX( angleToVec(rot2.smallestAngle()), angleToVec(rot2.angle()) ); + + Matrix rot2_as_mat(rot2); + Rotation2D rot3(rot2_as_mat); + VERIFY_IS_APPROX( angleToVec(rot2.smallestAngle()), angleToVec(rot3.angle()) ); } s0 = internal::random(-100,100);