Add Quaternion constructor from real scalar and imaginary vector

This commit is contained in:
H S Helson Go 2023-06-06 21:51:22 -04:00 committed by Antonio Sánchez
parent 31cd2ad371
commit bc57b926a0
2 changed files with 13 additions and 0 deletions

View File

@ -298,6 +298,15 @@ public:
*/ */
EIGEN_DEVICE_FUNC inline Quaternion(const Scalar& w, const Scalar& x, const Scalar& y, const Scalar& z) : m_coeffs(x, y, z, w){} EIGEN_DEVICE_FUNC inline Quaternion(const Scalar& w, const Scalar& x, const Scalar& y, const Scalar& z) : m_coeffs(x, y, z, w){}
/** Constructs and initializes a quaternion from its real part as a scalar,
* and its imaginary part as a 3-vector [\c x, \c y, \c z]
*/
template <typename Derived>
EIGEN_DEVICE_FUNC inline Quaternion(const Scalar& w, const Eigen::MatrixBase<Derived>& vec)
: m_coeffs(vec.x(), vec.y(), vec.z(), w) {
EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived, 3);
}
/** Constructs and initialize a quaternion from the array data */ /** Constructs and initialize a quaternion from the array data */
EIGEN_DEVICE_FUNC explicit inline Quaternion(const Scalar* data) : m_coeffs(data) {} EIGEN_DEVICE_FUNC explicit inline Quaternion(const Scalar* data) : m_coeffs(data) {}

View File

@ -98,6 +98,10 @@ template<typename Scalar, int Options> void quaternion(void)
VERIFY_IS_MUCH_SMALLER_THAN(abs(q1.angularDistance(q2) - refangle), Scalar(1)); VERIFY_IS_MUCH_SMALLER_THAN(abs(q1.angularDistance(q2) - refangle), Scalar(1));
} }
// Action on vector by the q v q* formula
VERIFY_IS_APPROX(q1 * v2, (q1 * Quaternionx(Scalar(0), v2) * q1.inverse()).vec());
VERIFY_IS_APPROX(q1.inverse() * v2, (q1.inverse() * Quaternionx(Scalar(0), v2) * q1).vec());
// rotation matrix conversion // rotation matrix conversion
VERIFY_IS_APPROX(q1 * v2, q1.toRotationMatrix() * v2); VERIFY_IS_APPROX(q1 * v2, q1.toRotationMatrix() * v2);
VERIFY_IS_APPROX(q1 * q2 * v2, VERIFY_IS_APPROX(q1 * q2 * v2,