44 double phi = std::sqrt(vx * vx + vy * vy + vz * vz);
47 double factor = std::sin(phi / 2.0) / phi;
48 double S0 = std::cos(phi / 2.0);
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);
74 double phi = std::atan2(s, c);
79 vx = (vx > 0.0 ? phi : (-phi)) * std::sqrt(std::max(
R(0, 0) - c, 0.0) / (1.0 - c));
80 vy = (vy > 0.0 ? phi : (-phi)) * std::sqrt(std::max(
R(1, 1) - c, 0.0) / (1.0 - c));
81 vz = (vz > 0.0 ? phi : (-phi)) * std::sqrt(std::max(
R(2, 2) - c, 0.0) / (1.0 - c));
82 }
else if(std::abs(s) > 1.0e-10) {
83 double factor = phi / s;