62 Scalar axis_norm = janus::norm(axis);
63 Scalar eps = Scalar(1e-12);
64 Scalar safe_norm = axis_norm + eps;
67 k(0) = axis(0) / safe_norm;
68 k(1) = axis(1) / safe_norm;
69 k(2) = axis(2) / safe_norm;
72 Mat3<Scalar> K =
skew(k);
73 Mat3<Scalar> K2 = K * K;
76 Scalar s = janus::sin(angle);
77 Scalar c = janus::cos(angle);
79 return Mat3<Scalar>::Identity() + s * K + (Scalar(1) - c) * K2;
89 Scalar angle = janus::norm(rot_vec);
90 Scalar eps = Scalar(1e-12);
91 Scalar safe_angle = angle + eps;
94 axis(0) = rot_vec(0) / safe_angle;
95 axis(1) = rot_vec(1) / safe_angle;
96 axis(2) = rot_vec(2) / safe_angle;
115 Scalar angle = Scalar(2) * janus::acos(w);
118 Scalar sin_half = janus::sqrt(Scalar(1) - w * w);
119 Scalar eps = Scalar(1e-12);
120 Scalar safe_sin_half = sin_half + eps;
123 axis(0) = q.x / safe_sin_half;
124 axis(1) = q.y / safe_sin_half;
125 axis(2) = q.z / safe_sin_half;
128 Scalar is_small = sin_half < eps;
129 axis(0) = janus::where(is_small, Scalar(0), axis(0));
130 axis(1) = janus::where(is_small, Scalar(0), axis(1));
131 axis(2) = janus::where(is_small, Scalar(1), axis(2));
133 return {axis, angle};
167 Scalar trace = R.trace();
168 Scalar cos_angle = (trace - Scalar(1)) * Scalar(0.5);
171 cos_angle = janus::where(cos_angle > Scalar(1), Scalar(1), cos_angle);
172 cos_angle = janus::where(cos_angle < Scalar(-1), Scalar(-1), cos_angle);
174 Scalar angle = janus::acos(cos_angle);
177 Vec3<Scalar> raw_axis;
178 raw_axis(0) = R(2, 1) - R(1, 2);
179 raw_axis(1) = R(0, 2) - R(2, 0);
180 raw_axis(2) = R(1, 0) - R(0, 1);
182 Scalar sin_angle = janus::sin(angle);
183 Scalar eps = Scalar(1e-12);
184 Scalar safe_sin = sin_angle + eps;
187 axis(0) = raw_axis(0) / (Scalar(2) * safe_sin);
188 axis(1) = raw_axis(1) / (Scalar(2) * safe_sin);
189 axis(2) = raw_axis(2) / (Scalar(2) * safe_sin);
192 Scalar axis_norm = janus::norm(axis);
193 Scalar safe_norm = axis_norm + eps;
194 axis(0) = axis(0) / safe_norm;
195 axis(1) = axis(1) / safe_norm;
196 axis(2) = axis(2) / safe_norm;
199 Scalar is_small = janus::abs(sin_angle) < eps;
200 axis(0) = janus::where(is_small, Scalar(0), axis(0));
201 axis(1) = janus::where(is_small, Scalar(0), axis(1));
202 axis(2) = janus::where(is_small, Scalar(1), axis(2));
204 return {axis, angle};