42#if __cplusplus >= 202002L
66 if ( std::fabs( uX ) < 8.*std::numeric_limits<double>::epsilon() &&
67 std::fabs( uY ) < 8.*std::numeric_limits<double>::epsilon() &&
68 std::fabs( uZ ) < 8.*std::numeric_limits<double>::epsilon() ) {
82 const double cosdelta = (
m[
kXX] +
m[
kYY] +
m[
kZZ] - 1.0) / 2.0;
85 }
else if (cosdelta < -1.0) {
88 angle = std::acos( cosdelta );
119 double phi, theta, psi;
120 double psiPlusPhi, psiMinusPhi;
124 theta = (std::fabs(
r[
kZZ]) <= 1.0) ? std::acos(
r[
kZZ]) :
125 (
r[
kZZ] > 0.0) ? 0 : pi;
127 double cosTheta =
r[
kZZ];
128 if (cosTheta > 1) cosTheta = 1;
129 if (cosTheta < -1) cosTheta = -1;
138 }
else if (cosTheta >= 0) {
142 psiMinusPhi = atan2 ( s,
c );
143 }
else if (cosTheta > -1) {
147 psiPlusPhi = atan2 ( s,
c );
153 psi = .5 * (psiPlusPhi + psiMinusPhi);
154 phi = .5 * (psiPlusPhi - psiMinusPhi);
165 double maxw = std::fabs(w[0]);
167 for (
int i = 1; i < 4; ++i) {
168 if (std::fabs(w[i]) > maxw) {
169 maxw = std::fabs(w[i]);
185 if (w[2] > 0 && std::fabs(psi) > pi_2)
correctByPi ( psi, phi );
186 if (w[2] < 0 && std::fabs(psi) < pi_2)
correctByPi ( psi, phi );
189 if (w[3] > 0 && std::fabs(phi) > pi_2)
correctByPi ( psi, phi );
190 if (w[3] < 0 && std::fabs(phi) < pi_2)
correctByPi ( psi, phi );
214 if ( d0 >= d1 && d0 >= d2 && d0 >= d3 ) {
215 const double q0 = .5*std::sqrt(1+d0);
216 const double f = .25/q0;
223 }
else if ( d1 >= d2 && d1 >= d3 ) {
224 const double q1 = .5*std::sqrt(1+d1);
225 const double f = .25/q1;
232 }
else if ( d2 >= d3 ) {
233 const double q2 = .5*std::sqrt(1+d2);
234 const double f = .25/q2;
242 const double q3 = .5*std::sqrt(1+d3);
243 const double f = .25/q3;
268 double phi,theta,psi = 0;
271 double sinTheta =
r[
kXZ];
272 if ( sinTheta < -1.0) sinTheta = -1.0;
273 if ( sinTheta > 1.0) sinTheta = 1.0;
274 theta = std::asin( sinTheta );
283 double psiPlusPhi = 0;
284 double psiMinusPhi = 0;
287 if (sinTheta > - 1.0)
294 psi = .5 * (psiPlusPhi + psiMinusPhi);
295 phi = .5 * (psiPlusPhi - psiMinusPhi);
316 double maxw = std::fabs(w[0]);
318 for (
int i = 1; i < 4; ++i) {
319 if (std::fabs(w[i]) > maxw) {
320 maxw = std::fabs(w[i]);
337 if (w[2] > 0 && std::fabs(psi) > pi_2)
correctByPi ( psi, phi );
338 if (w[2] < 0 && std::fabs(psi) < pi_2)
correctByPi ( psi, phi );
341 if (w[3] > 0 && std::fabs(phi) > pi_2)
correctByPi ( psi, phi );
342 if (w[3] < 0 && std::fabs(phi) < pi_2)
correctByPi ( psi, phi );
357 const double sinDelta = std::sin( from.
Angle() );
358 const double cosDelta = std::cos( from.
Angle() );
359 const double oneMinusCosDelta = 1.0 - cosDelta;
362 const double uX = u.
X();
363 const double uY = u.
Y();
364 const double uZ = u.
Z();
368 m[
kXX] = oneMinusCosDelta * uX * uX + cosDelta;
369 m[
kXY] = oneMinusCosDelta * uX * uY - sinDelta * uZ;
370 m[
kXZ] = oneMinusCosDelta * uX * uZ + sinDelta * uY;
372 m[
kYX] = oneMinusCosDelta * uY * uX + sinDelta * uZ;
373 m[
kYY] = oneMinusCosDelta * uY * uY + cosDelta;
374 m[
kYZ] = oneMinusCosDelta * uY * uZ - sinDelta * uX;
376 m[
kZX] = oneMinusCosDelta * uZ * uX - sinDelta * uY;
377 m[
kZY] = oneMinusCosDelta * uZ * uY + sinDelta * uX;
378 m[
kZZ] = oneMinusCosDelta * uZ * uZ + cosDelta;
397 double s = std::sin (from.
Angle()/2);
425 const Scalar sPhi = std::sin( from.
Phi() );
426 const Scalar cPhi = std::cos( from.
Phi() );
429 const Scalar sPsi = std::sin( from.
Psi() );
430 const Scalar cPsi = std::cos( from.
Psi() );
432 ( cPsi*cPhi-sPsi*cTheta*sPhi, cPsi*sPhi+sPsi*cTheta*cPhi, sPsi*sTheta
433 , -sPsi*cPhi-cPsi*cTheta*sPhi, -sPsi*sPhi+cPsi*cTheta*cPhi, cPsi*sTheta
434 , sTheta*sPhi, -sTheta*cPhi, cTheta
454 const Scalar sPlus = std::sin( plus );
455 const Scalar cPlus = std::cos( plus );
456 const Scalar sMinus = std::sin( minus );
457 const Scalar cMinus = std::cos( minus );
461 to.
SetComponents ( cTheta*cPlus, -sTheta*cMinus, -sTheta*sMinus, -cTheta*sPlus );
482 const double q0 = from.
U();
483 const double q1 = from.
I();
484 const double q2 = from.
J();
485 const double q3 = from.
K();
486 const double q00 = q0*q0;
487 const double q01 = q0*q1;
488 const double q02 = q0*q2;
489 const double q03 = q0*q3;
490 const double q11 = q1*q1;
491 const double q12 = q1*q2;
492 const double q13 = q1*q3;
493 const double q22 = q2*q2;
494 const double q23 = q2*q3;
495 const double q33 = q3*q3;
498 q00+q11-q22-q33 , 2*(q12-q03) , 2*(q02+q13),
499 2*(q12+q03) , q00-q11+q22-q33 , 2*(q23-q01),
500 2*(q13-q02) , 2*(q23+q01) , q00-q11-q22+q33 );
511 const double angle = 2.0 * std::acos ( from.
U() );
513 axis (from.
I(), from.
J(), from.
K());
516 if ( u < -1 ) u = -1;
517 const double angle = 2.0 * std::acos ( -from.
U() );
519 axis (-from.
I(), -from.
J(), -from.
K());
549 double phi,theta,psi = 0;
552 - std::cos(theta)*std::sin(phi),
555 std::cos(psi)*std::sin(phi) + std::sin(psi)*std::sin(theta)*std::cos(phi),
556 std::cos(psi)*std::cos(phi) - std::sin(psi)*std::sin(theta)*std::sin(phi),
557 -std::sin(psi)*std::cos(theta),
559 std::sin(psi)*std::sin(phi) - std::cos(psi)*std::sin(theta)*std::cos(phi),
560 std::sin(psi)*std::cos(phi) + std::cos(psi)*std::sin(theta)*std::sin(phi),
561 std::cos(psi)*std::cos(theta)
580 double phi,theta,psi = 0;
583 double sphi2 = std::sin(phi/2);
584 double cphi2 = std::cos(phi/2);
585 double stheta2 = std::sin(theta/2);
586 double ctheta2 = std::cos(theta/2);
587 double spsi2 = std::sin(psi/2);
588 double cpsi2 = std::cos(psi/2);
589 to.
SetComponents( cphi2 * cpsi2 * ctheta2 - sphi2 * spsi2 * stheta2,
590 sphi2 * cpsi2 * stheta2 + cphi2 * spsi2 * ctheta2,
591 cphi2 * cpsi2 * stheta2 - sphi2 * spsi2 * ctheta2,
592 sphi2 * cpsi2 * ctheta2 + cphi2 * spsi2 * stheta2
AxisAngle class describing rotation represented with direction axis (3D Vector) and an angle of rotat...
void SetComponents(IT begin, IT end)
Set the axis and then the angle given a pair of pointers or iterators defining the beginning and end ...
void Rectify()
Re-adjust components to eliminate small deviations from the axis being a unit vector and angles out o...
AxisVector Axis() const
access to rotation axis
Scalar Angle() const
access to rotation angle
DisplacementVector3D< Cartesian3D< Scalar > > AxisVector
definition of vector axis
Class describing a generic displacement vector in 3 dimensions.
Scalar X() const
Cartesian X, converting if necessary from internal coordinate system.
Scalar Y() const
Cartesian Y, converting if necessary from internal coordinate system.
DisplacementVector3D< CoordSystem, Tag > & SetCoordinates(const Scalar src[])
Set internal data based on a C-style array of 3 Scalar numbers.
Scalar Z() const
Cartesian Z, converting if necessary from internal coordinate system.
EulerAngles class describing rotation as three angles (Euler Angles).
Scalar Psi() const
Return Psi Euler angle.
Scalar Theta() const
Return Theta Euler angle.
Scalar Phi() const
Return Phi Euler angle.
void SetComponents(IT begin, IT end)
Set the three Euler angles given a pair of pointers or iterators defining the beginning and end of an...
Rotation class with the (3D) rotation represented by a unit quaternion (u, i, j, k).
void Rectify()
Re-adjust components to eliminate small deviations from |Q| = 1 orthonormality.
Scalar U() const
Access to the four quaternion components: U() is the coefficient of the identity Pauli matrix,...
void SetComponents(IT begin, IT end)
Set the four components given an iterator to the start of the desired data, and another to the end (4...
Rotation class with the (3D) rotation represented by a 3x3 orthogonal matrix.
void GetComponents(ForeignVector &v1, ForeignVector &v2, ForeignVector &v3) const
Get components into three vectors which will be the (orthonormal) columns of the rotation matrix.
void SetComponents(const ForeignVector &v1, const ForeignVector &v2, const ForeignVector &v3)
Set components from three orthonormal vectors (which must have methods x(), y() and z()) which will b...
Rotation class representing a 3D rotation about the X axis by the angle of rotation.
Scalar SinAngle() const
Sine or Cosine of the rotation angle.
Scalar Angle() const
Angle of rotation.
Rotation class representing a 3D rotation about the Y axis by the angle of rotation.
Scalar Angle() const
Angle of rotation.
Scalar SinAngle() const
Sine or Cosine of the rotation angle.
Rotation class with the (3D) rotation represented by angles describing first a rotation of an angle p...
void GetComponents(IT begin, IT end) const
Get the axis and then the angle into data specified by an iterator begin and another to the end of th...
void SetComponents(IT begin, IT end)
Set the three Euler angles given a pair of pointers or iterators defining the beginning and end of an...
Rotation class representing a 3D rotation about the Z axis by the angle of rotation.
Scalar Angle() const
Angle of rotation.
Scalar SinAngle() const
Sine or Cosine of the rotation angle.
static void correctByPi(double &psi, double &phi)
void convert(R1 const &, R2 const)
Rotation3D::Scalar Scalar
constexpr Double_t PiOver2()