44 double phi =
std::sqrt(vx * vx + vy * vy + vz * vz);
47 double factor =
std::sin(phi / 2.0) / phi;
49 double S1 = factor * vx;
50 double S2 = factor * vy;
51 double S3 = factor * vz;
53 R(0, 0) = 2.0 * (S1 * S1 + S0 * S0) - 1.0;
54 R(0, 1) = 2.0 * (S1 * S2 - S0 * S3);
55 R(0, 2) = 2.0 * (S1 * S3 + S0 * S2);
57 R(1, 0) = 2.0 * (S2 * S1 + S0 * S3);
58 R(1, 1) = 2.0 * (S2 * S2 + S0 * S0) - 1.0;
59 R(1, 2) = 2.0 * (S2 * S3 - S0 * S1);
61 R(2, 0) = 2.0 * (S3 * S1 - S0 * S2);
62 R(2, 1) = 2.0 * (S3 * S2 + S0 * S1);
63 R(2, 2) = 2.0 * (S3 * S3 + S0 * S0) - 1.0;
69 vx = (
R(2, 1) -
R(1, 2)) / 2.0;
70 vy = (
R(0, 2) -
R(2, 0)) / 2.0;
71 vz = (
R(1, 0) -
R(0, 1)) / 2.0;
72 double c = (
R(0, 0) +
R(1, 1) +
R(2, 2) - 1.0) / 2.0;
73 double s =
std::sqrt(vx * vx + vy * vy + vz * vz);
83 double factor = phi / s;
101 for(
int i = 0; i < 3; i++) {
102 for(
int j = 0; j < 3; j++) {
103 inv.
R(i, j) =
R(j, i);
112 return (
R(0, 1) == 0.0) && (
R(1, 0) == 0.0) && (
R(0, 2) == 0.0) && (
R(2, 0) == 0.0);
117 return (
R(1, 2) == 0.0) && (
R(2, 1) == 0.0) && (
R(1, 0) == 0.0) && (
R(0, 1) == 0.0);
122 return (
R(2, 0) == 0.0) && (
R(0, 2) == 0.0) && (
R(2, 1) == 0.0) && (
R(1, 2) == 0.0);
133 result.
R(1, 1) = result.
R(2, 2) =
std::cos(angle);
134 result.
R(1, 2) = - (result.
R(2, 1) =
std::sin(angle));
141 result.
R(2, 2) = result.
R(0, 0) =
std::cos(angle);
142 result.
R(2, 0) = - (result.
R(0, 2) =
std::sin(angle));
149 result.
R(0, 0) = result.
R(1, 1) =
std::cos(angle);
150 result.
R(0, 1) = - (result.
R(1, 0) =
std::sin(angle));
Tps< T > cos(const Tps< T > &x)
Cosine.
Tps< T > sin(const Tps< T > &x)
Sine.
Tps< T > sqrt(const Tps< T > &x)
Square root.
T::PETE_Expr_t::PETE_Return_t max(const PETE_Expr< T > &expr, NDIndex< D > &loc)
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
PETE_TBTree< FnArcTan2, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > atan2(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
constexpr double c
The velocity of light in m/s.
Rotation in 3-dimensional space.
static Rotation3D Identity()
Make identity.
static Rotation3D ZRotation(double angle)
Make rotation.
static Rotation3D YRotation(double angle)
Make rotation.
Rotation3D inverse() const
Inversion.
bool isPureXRotation() const
Test for rotation.
Vector3D getAxis() const
Get axis vector.
bool isPureZRotation() const
Test for rotation.
static Rotation3D XRotation(double angle)
Make rotation.
bool isPureYRotation() const
Test for rotation.
Rotation3D()
Default constructor.