38 #include <visp3/core/vpMath.h>
39 #include <visp3/core/vpQuaternionVector.h>
43 const double vpQuaternionVector::minimum = 0.0001;
92 const unsigned int index_0 = 0;
93 const unsigned int index_1 = 1;
94 const unsigned int index_2 = 2;
95 const unsigned int index_3 = 3;
102 #ifdef VISP_BUILD_DEPRECATED_FUNCTIONS
115 build(qx, qy, qz, qw);
201 "Cannot construct a quaternion vector from a %d-dimension col vector", q.
size()));
203 const unsigned int val_4 = 4;
204 for (
unsigned int i = 0; i < val_4; ++i) {
218 "Cannot construct a quaternion vector from a %d-dimension std::vector", q.size()));
221 const unsigned int val_4 = 4;
222 for (
unsigned int i = 0; i < val_4; ++i) {
243 double sinTheta_2 = sin(theta);
244 const unsigned int index_0 = 0;
245 const unsigned int index_1 = 1;
246 const unsigned int index_2 = 2;
247 set(u[index_0] * sinTheta_2, u[index_1] * sinTheta_2, u[index_2] * sinTheta_2, cos(theta));
287 ((
w() * rq.
y()) + (
y() * rq.
w()) + (
z() * rq.
x())) - (
x() * rq.
z()),
288 ((
w() * rq.
z()) + (
z() * rq.
w()) + (
x() * rq.
y())) - (
y() * rq.
x()),
289 ((
w() * rq.
w()) - (
x() * rq.
x()) - (
y() * rq.
y())) - (
z() * rq.
z()));
295 if (
vpMath::nul(l, std::numeric_limits<double>::epsilon())) {
333 const unsigned int val_4 = 4;
334 for (
unsigned int i = 0; i < val_4; ++i) {
359 double mag_square = (
w() *
w()) + (
x() *
x()) + (
y() *
y()) + (
z() *
z());
360 if (!
vpMath::nul(mag_square, std::numeric_limits<double>::epsilon())) {
364 std::cerr <<
"The current quaternion is null ! The inverse cannot be computed !" << std::endl;
383 if (!
vpMath::nul(mag, std::numeric_limits<double>::epsilon())) {
384 set(
x() / mag,
y() / mag,
z() / mag,
w() / mag);
398 return (q0.
x() * q1.
x()) + (q0.
y() * q1.
y()) + (q0.
z() * q1.
z()) + (q0.
w() * q1.
w());
419 #if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
443 if (list.size() >
size()) {
446 "Cannot set quaternion vector out of bounds. It has only %d values while you try to initialize with %d values",
447 size(), list.size()));
449 std::copy(list.begin(), list.end(),
data);
470 assert(
t >= 0 &&
t <= 1);
472 double cosHalfTheta =
dot(q0, q1);
474 if (cosHalfTheta < 0) {
475 cosHalfTheta = -cosHalfTheta;
480 qLerp.
x() = q0.
x() - (
t * (q0.
x() - q1.
x()));
481 qLerp.
y() = q0.
y() - (
t * (q0.
y() - q1.
y()));
482 qLerp.
z() = q0.
z() - (
t * (q0.
z() - q1.
z()));
483 qLerp.
w() = q0.
w() - (
t * (q0.
w() - q1.
w()));
504 assert(
t >= 0 &&
t <= 1);
528 assert(
t >= 0 &&
t <= 1);
538 double cosHalfTheta =
dot(q0, q1);
540 if (cosHalfTheta < 0) {
541 cosHalfTheta = -cosHalfTheta;
545 double scale0 = 1 -
t;
548 if ((1 - cosHalfTheta) > 0.1) {
549 double theta = std::acos(cosHalfTheta);
550 double invSinTheta = 1 / std::sin(theta);
552 scale0 = std::sin((1 -
t) * theta) * invSinTheta;
553 scale1 = std::sin(
t * theta) * invSinTheta;
557 qSlerp.
x() = (scale0 * q0.
x()) + (scale1 * q1_.
x());
558 qSlerp.
y() = (scale0 * q0.
y()) + (scale1 * q1_.
y());
559 qSlerp.
z() = (scale0 * q0.
z()) + (scale1 * q1_.
z());
560 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)
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).
vpQuaternionVector & build(const double &qx, const double &qy, const double &qz, const double &qw)
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.
VP_DEPRECATED vpQuaternionVector buildFrom(const double qx, const double qy, const double qz, const double qw)
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