diff options
author | Gael Guennebaud <g.gael@free.fr> | 2016-09-29 23:23:35 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2016-09-29 23:23:35 +0200 |
commit | 3860a0bc8f6af25d9115a66db1bdd3d7cad9b99a (patch) | |
tree | 258c6439b1cb38afda000419158cf47ff7eca793 /Eigen/src/Geometry/AngleAxis.h | |
parent | 33500050c369bd5ecb4167870a8205619642e0c9 (diff) |
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.
Diffstat (limited to 'Eigen/src/Geometry/AngleAxis.h')
-rw-r--r-- | Eigen/src/Geometry/AngleAxis.h | 11 |
1 files 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<float> AngleAxisf; typedef AngleAxis<double> 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<typename QuatDerived> AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const QuaternionBase<QuatDerived>& q) { using std::atan2; + using std::abs; Scalar n = q.vec().norm(); if(n<NumTraits<Scalar>::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 |