Catch quaternion canonical corner cases (#116)

This commit is contained in:
kritz
2019-12-18 14:12:47 +01:00
committed by Julian Kent
parent 4f3565da94
commit e81483a808
4 changed files with 62 additions and 14 deletions
+6 -4
View File
@@ -367,11 +367,13 @@ public:
Quaternion canonical() const
{
const Quaternion &q = *this;
if (q(0) < Type(0)) {
return Quaternion(-q(0),-q(1),-q(2),-q(3));
} else {
return Quaternion(q(0),q(1),q(2),q(3));
for (size_t i = 0; i < 4; i++) {
if (fabs(q(i)) > FLT_EPSILON) {
return q * Type(matrix::sign(q(i)));
}
}
return q;
}
/**
+6
View File
@@ -78,4 +78,10 @@ Type wrap_2pi(Type x)
return wrap(x, Type(0), Type(M_TWOPI));
}
template<typename T>
int sign(T val)
{
return (T(FLT_EPSILON) < val) - (val < T(FLT_EPSILON));
}
} // namespace matrix