mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-20 08:39:37 +08:00
Fix traits of Map<Quaternion>, and respectively extend the unit tests
This commit is contained in:
parent
fb89b66229
commit
392ffce3b9
@ -305,29 +305,19 @@ typedef Quaternion<double> Quaterniond;
|
|||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
template<typename _Scalar, int _Options>
|
template<typename _Scalar, int _Options>
|
||||||
struct traits<Map<Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, _Options> >
|
struct traits<Map<Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >
|
||||||
{
|
{
|
||||||
typedef _Scalar Scalar;
|
|
||||||
typedef Map<Matrix<_Scalar,4,1>, _Options> Coefficients;
|
typedef Map<Matrix<_Scalar,4,1>, _Options> Coefficients;
|
||||||
|
|
||||||
typedef traits<Quaternion<_Scalar, _Options> > TraitsBase;
|
|
||||||
enum {
|
|
||||||
IsAligned = TraitsBase::IsAligned,
|
|
||||||
Flags = TraitsBase::Flags
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
template<typename _Scalar, int _Options>
|
template<typename _Scalar, int _Options>
|
||||||
struct traits<Map<const Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar> >
|
struct traits<Map<const Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >
|
||||||
{
|
{
|
||||||
typedef _Scalar Scalar;
|
|
||||||
typedef Map<const Matrix<_Scalar,4,1>, _Options> Coefficients;
|
typedef Map<const Matrix<_Scalar,4,1>, _Options> Coefficients;
|
||||||
|
typedef traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> > TraitsBase;
|
||||||
typedef traits<Quaternion<_Scalar, _Options> > TraitsBase;
|
|
||||||
enum {
|
enum {
|
||||||
IsAligned = TraitsBase::IsAligned,
|
|
||||||
Flags = TraitsBase::Flags & ~LvalueBit
|
Flags = TraitsBase::Flags & ~LvalueBit
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -172,23 +172,36 @@ template<typename Scalar, int Options> void quaternion(void)
|
|||||||
|
|
||||||
template<typename Scalar> void mapQuaternion(void){
|
template<typename Scalar> void mapQuaternion(void){
|
||||||
typedef Map<Quaternion<Scalar>, Aligned> MQuaternionA;
|
typedef Map<Quaternion<Scalar>, Aligned> MQuaternionA;
|
||||||
|
typedef Map<const Quaternion<Scalar>, Aligned> MCQuaternionA;
|
||||||
typedef Map<Quaternion<Scalar> > MQuaternionUA;
|
typedef Map<Quaternion<Scalar> > MQuaternionUA;
|
||||||
typedef Map<const Quaternion<Scalar> > MCQuaternionUA;
|
typedef Map<const Quaternion<Scalar> > MCQuaternionUA;
|
||||||
typedef Quaternion<Scalar> Quaternionx;
|
typedef Quaternion<Scalar> Quaternionx;
|
||||||
|
typedef Matrix<Scalar,3,1> Vector3;
|
||||||
|
typedef AngleAxis<Scalar> AngleAxisx;
|
||||||
|
|
||||||
|
Vector3 v0 = Vector3::Random(),
|
||||||
|
v1 = Vector3::Random();
|
||||||
|
Scalar a = internal::random<Scalar>(-Scalar(M_PI), Scalar(M_PI));
|
||||||
|
|
||||||
EIGEN_ALIGN16 Scalar array1[4];
|
EIGEN_ALIGN16 Scalar array1[4];
|
||||||
EIGEN_ALIGN16 Scalar array2[4];
|
EIGEN_ALIGN16 Scalar array2[4];
|
||||||
EIGEN_ALIGN16 Scalar array3[4+1];
|
EIGEN_ALIGN16 Scalar array3[4+1];
|
||||||
Scalar* array3unaligned = array3+1;
|
Scalar* array3unaligned = array3+1;
|
||||||
|
|
||||||
|
MQuaternionA mq1(array1);
|
||||||
|
MCQuaternionA mcq1(array1);
|
||||||
|
MQuaternionA mq2(array2);
|
||||||
|
MQuaternionUA mq3(array3unaligned);
|
||||||
|
MCQuaternionUA mcq3(array3unaligned);
|
||||||
|
|
||||||
// std::cerr << array1 << " " << array2 << " " << array3 << "\n";
|
// std::cerr << array1 << " " << array2 << " " << array3 << "\n";
|
||||||
MQuaternionA(array1).coeffs().setRandom();
|
mq1 = AngleAxisx(a, v0.normalized());
|
||||||
(MQuaternionA(array2)) = MQuaternionA(array1);
|
mq2 = mq1;
|
||||||
(MQuaternionUA(array3unaligned)) = MQuaternionA(array1);
|
mq3 = mq1;
|
||||||
|
|
||||||
Quaternionx q1 = MQuaternionA(array1);
|
Quaternionx q1 = mq1;
|
||||||
Quaternionx q2 = MQuaternionA(array2);
|
Quaternionx q2 = mq2;
|
||||||
Quaternionx q3 = MQuaternionUA(array3unaligned);
|
Quaternionx q3 = mq3;
|
||||||
Quaternionx q4 = MCQuaternionUA(array3unaligned);
|
Quaternionx q4 = MCQuaternionUA(array3unaligned);
|
||||||
|
|
||||||
VERIFY_IS_APPROX(q1.coeffs(), q2.coeffs());
|
VERIFY_IS_APPROX(q1.coeffs(), q2.coeffs());
|
||||||
@ -198,6 +211,23 @@ template<typename Scalar> void mapQuaternion(void){
|
|||||||
if(internal::packet_traits<Scalar>::Vectorizable)
|
if(internal::packet_traits<Scalar>::Vectorizable)
|
||||||
VERIFY_RAISES_ASSERT((MQuaternionA(array3unaligned)));
|
VERIFY_RAISES_ASSERT((MQuaternionA(array3unaligned)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(mq1 * (mq1.inverse() * v1), v1);
|
||||||
|
VERIFY_IS_APPROX(mq1 * (mq1.conjugate() * v1), v1);
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(mcq1 * (mcq1.inverse() * v1), v1);
|
||||||
|
VERIFY_IS_APPROX(mcq1 * (mcq1.conjugate() * v1), v1);
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(mq3 * (mq3.inverse() * v1), v1);
|
||||||
|
VERIFY_IS_APPROX(mq3 * (mq3.conjugate() * v1), v1);
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(mcq3 * (mcq3.inverse() * v1), v1);
|
||||||
|
VERIFY_IS_APPROX(mcq3 * (mcq3.conjugate() * v1), v1);
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(mq1*mq2, q1*q2);
|
||||||
|
VERIFY_IS_APPROX(mq3*mq2, q3*q2);
|
||||||
|
VERIFY_IS_APPROX(mcq1*mq2, q1*q2);
|
||||||
|
VERIFY_IS_APPROX(mcq3*mq2, q3*q2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Scalar> void quaternionAlignment(void){
|
template<typename Scalar> void quaternionAlignment(void){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user