38 #include <visp3/core/vpMath.h>
39 #include <visp3/core/vpQuaternionVector.h>
43 const double vpQuaternionVector::minimum = 0.0001;
44 const unsigned int vpQuaternionVector::constr_val_4 = 4;
93 const unsigned int index_0 = 0;
94 const unsigned int index_1 = 1;
95 const unsigned int index_2 = 2;
96 const unsigned int index_3 = 3;
137 const unsigned int val_4 = 4;
138 if (q.
size() != val_4) {
140 "Cannot construct a quaternion vector from a %d-dimension col vector", q.
size()));
142 for (
unsigned int i = 0; i < val_4; ++i) {
154 const unsigned int val_4 = 4;
155 if (q.size() != val_4) {
157 "Cannot construct a quaternion vector from a %d-dimension std::vector", q.size()));
160 for (
unsigned int i = 0; i < val_4; ++i) {
181 double sinTheta_2 = sin(theta);
182 const unsigned int index_0 = 0;
183 const unsigned int index_1 = 1;
184 const unsigned int index_2 = 2;
185 set(u[index_0] * sinTheta_2, u[index_1] * sinTheta_2, u[index_2] * sinTheta_2, cos(theta));
228 ((
w() * rq.
y()) + (
y() * rq.
w()) + (
z() * rq.
x())) - (
x() * rq.
z()),
229 ((
w() * rq.
z()) + (
z() * rq.
w()) + (
x() * rq.
y())) - (
y() * rq.
x()),
230 ((
w() * rq.
w()) - (
x() * rq.
x()) - (
y() * rq.
y())) - (
z() * rq.
z()));
236 if (
vpMath::nul(l, std::numeric_limits<double>::epsilon())) {
270 const unsigned int val_4 = 4;
271 if (q.
size() != val_4) {
275 for (
unsigned int i = 0; i < val_4; ++i) {
300 double mag_square = (
w() *
w()) + (
x() *
x()) + (
y() *
y()) + (
z() *
z());
301 if (!
vpMath::nul(mag_square, std::numeric_limits<double>::epsilon())) {
305 std::cerr <<
"The current quaternion is null ! The inverse cannot be computed !" << std::endl;
324 if (!
vpMath::nul(mag, std::numeric_limits<double>::epsilon())) {
325 set(
x() / mag,
y() / mag,
z() / mag,
w() / mag);
339 return (q0.
x() * q1.
x()) + (q0.
y() * q1.
y()) + (q0.
z() * q1.
z()) + (q0.
w() * q1.
w());
360 #if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
384 if (list.size() >
size()) {
387 "Cannot set quaternion vector out of bounds. It has only %d values while you try to initialize with %d values",
388 size(), list.size()));
390 std::copy(list.begin(), list.end(),
data);
411 assert(
t >= 0 &&
t <= 1);
413 double cosHalfTheta =
dot(q0, q1);
415 if (cosHalfTheta < 0) {
416 cosHalfTheta = -cosHalfTheta;
421 qLerp.
x() = q0.
x() - (
t * (q0.
x() - q1.
x()));
422 qLerp.
y() = q0.
y() - (
t * (q0.
y() - q1.
y()));
423 qLerp.
z() = q0.
z() - (
t * (q0.
z() - q1.
z()));
424 qLerp.
w() = q0.
w() - (
t * (q0.
w() - q1.
w()));
445 assert(
t >= 0 &&
t <= 1);
469 assert(
t >= 0 &&
t <= 1);
479 double cosHalfTheta =
dot(q0, q1);
481 if (cosHalfTheta < 0) {
482 cosHalfTheta = -cosHalfTheta;
486 double scale0 = 1 -
t;
489 if ((1 - cosHalfTheta) > 0.1) {
490 double theta = std::acos(cosHalfTheta);
491 double invSinTheta = 1 / std::sin(theta);
493 scale0 = std::sin((1 -
t) * theta) * invSinTheta;
494 scale1 = std::sin(
t * theta) * invSinTheta;
498 qSlerp.
x() = (scale0 * q0.
x()) + (scale1 * q1_.
x());
499 qSlerp.
y() = (scale0 * q0.
y()) + (scale1 * q1_.
y());
500 qSlerp.
z() = (scale0 * q0.
z()) + (scale1 * q1_.
z());
501 qSlerp.
w() = (scale0 * q0.
w()) + (scale1 * q1_.
w());
double * data
Address of the first element of the data array.
unsigned int size() const
Return the number of elements of the 2D array.
Implementation of column vector and the associated operations.
error that can be emitted by ViSP classes.
@ dimensionError
Bad dimension.
static bool nul(double x, double threshold=0.001)
Implementation of a rotation vector as quaternion angle minimal representation.
vpQuaternionVector operator*(double l) const
Multiplication by scalar. Returns a quaternion defined by (lx,ly,lz,lw).
const double & z() const
Returns the z-component of the quaternion.
vpQuaternionVector conjugate() const
vpQuaternionVector inverse() const
vpQuaternionVector & operator=(const vpColVector &q)
void set(double x, double y, double z, double w)
static vpQuaternionVector slerp(const vpQuaternionVector &q0, const vpQuaternionVector &q1, double t)
vpQuaternionVector & buildFrom(const double &qx, const double &qy, const double &qz, const double &qw)
static vpQuaternionVector nlerp(const vpQuaternionVector &q0, const vpQuaternionVector &q1, double t)
vpQuaternionVector operator-() const
Negate operator. Returns a quaternion defined by (-x,-y,-z-,-w).
const double & x() const
Returns the x-component of the quaternion.
static double dot(const vpQuaternionVector &q0, const vpQuaternionVector &q1)
const double & y() const
Returns the y-component of the quaternion.
const double & w() const
Returns the w-component of the quaternion.
vpQuaternionVector operator+(const vpQuaternionVector &q) const
static vpQuaternionVector lerp(const vpQuaternionVector &q0, const vpQuaternionVector &q1, double t)
vpQuaternionVector operator/(double l) const
Division by scalar. Returns a quaternion defined by (x/l,y/l,z/l,w/l).
Implementation of a rotation matrix and operations on such kind of matrices.
Implementation of a generic rotation vector.
Implementation of a rotation vector as axis-angle minimal representation.
void extract(double &theta, vpColVector &u) const