···5555 let nu = clamp_acos cos_nu in
5656 if rdotv < 0. then (2. *. Float.pi) -. nu else nu
57575858+let degenerate_elements (pos : Vec3.t) (vel : Vec3.t) r_mag =
5959+ { a = r_mag; e = 2.; i = 0.; raan = 0.; argp = 0.; nu = 0.; n = 0.;
6060+ pos; vel }
6161+5862(** Convert state vector to classical orbital elements. Vallado Algorithm 9. *)
5963let elements_of_state (pos : Vec3.t) (vel : Vec3.t) =
6064 let open Vec3 in
6165 let r_mag = length pos in
6266 let v_mag = length vel in
6363- (* Guard degenerate inputs *)
6467 if r_mag < 1e-10 || v_mag < 1e-10 then
6565- {
6666- a = r_mag;
6767- e = 2.;
6868- i = 0.;
6969- raan = 0.;
7070- argp = 0.;
7171- nu = 0.;
7272- n = 0.;
7373- pos;
7474- vel;
7575- }
6868+ degenerate_elements pos vel r_mag
7669 else
7770 (* Angular momentum vector h = r × v *)
7871 let h = cross pos vel in