From 3860a0bc8f6af25d9115a66db1bdd3d7cad9b99a Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Thu, 29 Sep 2016 23:23:35 +0200 Subject: [PATCH] bug #1312: Quaternion to AxisAngle conversion now ensures the angle will be in the range [-pi,pi]. This also increases accuracy when q.w is negative. --- Eigen/src/Geometry/AngleAxis.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Eigen/src/Geometry/AngleAxis.h b/Eigen/src/Geometry/AngleAxis.h index 7fdb8ae83..99f3c3a66 100644 --- a/Eigen/src/Geometry/AngleAxis.h +++ b/Eigen/src/Geometry/AngleAxis.h @@ -158,7 +158,8 @@ typedef AngleAxis AngleAxisf; typedef AngleAxis AngleAxisd; /** Set \c *this from a \b unit quaternion. - * The resulting axis is normalized. + * + * The resulting axis is normalized, and the the computed angle is in the [-pi,pi] range. * * This function implicitly normalizes the quaternion \a q. */ @@ -167,12 +168,16 @@ template AngleAxis& AngleAxis::operator=(const QuaternionBase& q) { using std::atan2; + using std::abs; Scalar n = q.vec().norm(); if(n::epsilon()) n = q.vec().stableNorm(); - if (n > Scalar(0)) + + if (n != Scalar(0)) { - m_angle = Scalar(2)*atan2(n, q.w()); + m_angle = Scalar(2)*atan2(n, std::abs(q.w())); + if(q.w() < 0) + n = -n; m_axis = q.vec() / n; } else