32 const Scalar r_mag = janus::norm(r);
33 const Scalar v_mag = janus::norm(v);
36 const Vec3<Scalar> h = janus::cross(r, v);
37 const Scalar h_mag = janus::norm(h);
41 n << -h(1), h(0), Scalar(0.0);
42 const Scalar n_mag = janus::norm(n);
45 const Scalar r_dot_v = janus::dot(r, v);
46 const Vec3<Scalar> e_vec =
47 ((v_mag * v_mag - mu / r_mag) * r - r_dot_v * v) / mu;
48 oe.
e = janus::norm(e_vec);
51 const Scalar energy = v_mag * v_mag / 2.0 - mu / r_mag;
54 oe.
a = -mu / (2.0 * energy);
57 oe.
i = janus::acos(janus::clamp(h(2) / h_mag, Scalar(-1.0), Scalar(1.0)));
60 const Scalar n_mag_safe = janus::where(n_mag < 1e-10, Scalar(1.0), n_mag);
62 janus::acos(janus::clamp(n(0) / n_mag_safe, Scalar(-1.0), Scalar(1.0)));
63 oe.
Omega = janus::where(n(1) < 0.0, 2.0 * M_PI - Omega_temp, Omega_temp);
64 oe.
Omega = janus::where(n_mag < 1e-10, Scalar(0.0), oe.
Omega);
67 const Scalar e_safe = janus::where(oe.
e < 1e-10, Scalar(1.0), oe.
e);
68 const Scalar n_dot_e = janus::dot(n, e_vec);
69 Scalar omega_temp = janus::acos(janus::clamp(
70 n_dot_e / (n_mag_safe * e_safe), Scalar(-1.0), Scalar(1.0)));
72 janus::where(e_vec(2) < 0.0, 2.0 * M_PI - omega_temp, omega_temp);
73 oe.
omega = janus::where(oe.
e < 1e-10, Scalar(0.0), oe.
omega);
74 oe.
omega = janus::where(n_mag < 1e-10, Scalar(0.0), oe.
omega);
77 const Scalar e_dot_r = janus::dot(e_vec, r);
78 Scalar nu_temp = janus::acos(
79 janus::clamp(e_dot_r / (e_safe * r_mag), Scalar(-1.0), Scalar(1.0)));
80 oe.
nu = janus::where(r_dot_v < 0.0, 2.0 * M_PI - nu_temp, nu_temp);
81 oe.
nu = janus::where(oe.
e < 1e-10, Scalar(0.0), oe.
nu);
102 const Scalar p = oe.
a * (1.0 - oe.
e * oe.
e);
105 const Scalar r_mag = p / (1.0 + oe.
e * janus::cos(oe.
nu));
107 const Scalar cos_nu = janus::cos(oe.
nu);
108 const Scalar sin_nu = janus::sin(oe.
nu);
112 r_pqw << r_mag * cos_nu, r_mag * sin_nu, Scalar(0.0);
115 const Scalar sqrt_mu_p = janus::sqrt(mu / p);
117 v_pqw << -sqrt_mu_p * sin_nu, sqrt_mu_p * (oe.
e + cos_nu), Scalar(0.0);
120 const Scalar cos_O = janus::cos(oe.
Omega);
121 const Scalar sin_O = janus::sin(oe.
Omega);
122 const Scalar cos_i = janus::cos(oe.
i);
123 const Scalar sin_i = janus::sin(oe.
i);
124 const Scalar cos_w = janus::cos(oe.
omega);
125 const Scalar sin_w = janus::sin(oe.
omega);
128 R(0, 0) = cos_O * cos_w - sin_O * sin_w * cos_i;
129 R(0, 1) = -cos_O * sin_w - sin_O * cos_w * cos_i;
130 R(0, 2) = sin_O * sin_i;
131 R(1, 0) = sin_O * cos_w + cos_O * sin_w * cos_i;
132 R(1, 1) = -sin_O * sin_w + cos_O * cos_w * cos_i;
133 R(1, 2) = -cos_O * sin_i;
134 R(2, 0) = sin_w * sin_i;
135 R(2, 1) = cos_w * sin_i;
138 Vec3<Scalar> r = R * r_pqw;
139 Vec3<Scalar> v = R * v_pqw;