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;
138 "Cannot construct a quaternion vector from a %d-dimension col vector", q.
size()));
140 const unsigned int val_4 = 4;
141 for (
unsigned int i = 0; i < val_4; ++i) {
155 "Cannot construct a quaternion vector from a %d-dimension std::vector", q.size()));
158 const unsigned int val_4 = 4;
159 for (
unsigned int i = 0; i < val_4; ++i) {
180 double sinTheta_2 = sin(theta);
181 const unsigned int index_0 = 0;
182 const unsigned int index_1 = 1;
183 const unsigned int index_2 = 2;
184 set(u[index_0] * sinTheta_2, u[index_1] * sinTheta_2, u[index_2] * sinTheta_2, cos(theta));
227 ((
w() * rq.
y()) + (
y() * rq.
w()) + (
z() * rq.
x())) - (
x() * rq.
z()),
228 ((
w() * rq.
z()) + (
z() * rq.
w()) + (
x() * rq.
y())) - (
y() * rq.
x()),
229 ((
w() * rq.
w()) - (
x() * rq.
x()) - (
y() * rq.
y())) - (
z() * rq.
z()));
235 if (
vpMath::nul(l, std::numeric_limits<double>::epsilon())) {
273 const unsigned int val_4 = 4;
274 for (
unsigned int i = 0; i < val_4; ++i) {
299 double mag_square = (
w() *
w()) + (
x() *
x()) + (
y() *
y()) + (
z() *
z());
300 if (!
vpMath::nul(mag_square, std::numeric_limits<double>::epsilon())) {
304 std::cerr <<
"The current quaternion is null ! The inverse cannot be computed !" << std::endl;
323 if (!
vpMath::nul(mag, std::numeric_limits<double>::epsilon())) {
324 set(
x() / mag,
y() / mag,
z() / mag,
w() / mag);
338 return (q0.
x() * q1.
x()) + (q0.
y() * q1.
y()) + (q0.
z() * q1.
z()) + (q0.
w() * q1.
w());
359 #if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
383 if (list.size() >
size()) {
386 "Cannot set quaternion vector out of bounds. It has only %d values while you try to initialize with %d values",
387 size(), list.size()));
389 std::copy(list.begin(), list.end(),
data);
410 assert(
t >= 0 &&
t <= 1);
412 double cosHalfTheta =
dot(q0, q1);
414 if (cosHalfTheta < 0) {
415 cosHalfTheta = -cosHalfTheta;
420 qLerp.
x() = q0.
x() - (
t * (q0.
x() - q1.
x()));
421 qLerp.
y() = q0.
y() - (
t * (q0.
y() - q1.
y()));
422 qLerp.
z() = q0.
z() - (
t * (q0.
z() - q1.
z()));
423 qLerp.
w() = q0.
w() - (
t * (q0.
w() - q1.
w()));
444 assert(
t >= 0 &&
t <= 1);
468 assert(
t >= 0 &&
t <= 1);
478 double cosHalfTheta =
dot(q0, q1);
480 if (cosHalfTheta < 0) {
481 cosHalfTheta = -cosHalfTheta;
485 double scale0 = 1 -
t;
488 if ((1 - cosHalfTheta) > 0.1) {
489 double theta = std::acos(cosHalfTheta);
490 double invSinTheta = 1 / std::sin(theta);
492 scale0 = std::sin((1 -
t) * theta) * invSinTheta;
493 scale1 = std::sin(
t * theta) * invSinTheta;
497 qSlerp.
x() = (scale0 * q0.
x()) + (scale1 * q1_.
x());
498 qSlerp.
y() = (scale0 * q0.
y()) + (scale1 * q1_.
y());
499 qSlerp.
z() = (scale0 * q0.
z()) + (scale1 * q1_.
z());
500 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