···11+type t = { x : float; y : float; z : float }
22+33+let v x y z = { x; y; z }
44+let zero = { x = 0.; y = 0.; z = 0. }
55+let add a b = { x = a.x +. b.x; y = a.y +. b.y; z = a.z +. b.z }
66+let sub a b = { x = a.x -. b.x; y = a.y -. b.y; z = a.z -. b.z }
77+let scale s v = { x = s *. v.x; y = s *. v.y; z = s *. v.z }
88+let dot a b = (a.x *. b.x) +. (a.y *. b.y) +. (a.z *. b.z)
99+1010+let cross a b =
1111+ {
1212+ x = (a.y *. b.z) -. (a.z *. b.y);
1313+ y = (a.z *. b.x) -. (a.x *. b.z);
1414+ z = (a.x *. b.y) -. (a.y *. b.x);
1515+ }
1616+1717+let length v = sqrt (dot v v)
1818+1919+let normalize v =
2020+ let l = length v in
2121+ if l < 1e-12 then zero else scale (1. /. l) v
2222+2323+let negate v = { x = -.v.x; y = -.v.y; z = -.v.z }
2424+let distance a b = length (sub a b)
2525+2626+let equal ?(eps = 1e-12) a b =
2727+ Float.abs (a.x -. b.x) <= eps
2828+ && Float.abs (a.y -. b.y) <= eps
2929+ && Float.abs (a.z -. b.z) <= eps
3030+3131+let pp ppf v = Fmt.pf ppf "(%.4f, %.4f, %.4f)" v.x v.y v.z
+36
lib/vec3.mli
···11+(** 3D vectors.
22+33+ Shared type for astrodynamics, coordinate transforms, and rendering. All
44+ packages (kepler, sgp4, globe, coordinate) use this type. *)
55+66+type t = { x : float; y : float; z : float }
77+(** A 3D vector. The interpretation (km, m/s, GL units) depends on context. *)
88+99+val v : float -> float -> float -> t
1010+(** [v x y z] creates a vector. *)
1111+1212+val zero : t
1313+(** The zero vector. *)
1414+1515+val add : t -> t -> t
1616+val sub : t -> t -> t
1717+val scale : float -> t -> t
1818+val dot : t -> t -> float
1919+val cross : t -> t -> t
2020+val length : t -> float
2121+2222+val normalize : t -> t
2323+(** [normalize v] is the unit vector in the direction of [v]. Returns [zero] if
2424+ [length v < 1e-12]. *)
2525+2626+val negate : t -> t
2727+(** [negate v] is [scale (-1.) v]. *)
2828+2929+val distance : t -> t -> float
3030+(** [distance a b] is [length (sub a b)]. *)
3131+3232+val equal : ?eps:float -> t -> t -> bool
3333+(** [equal ?eps a b] is [true] if all components differ by at most [eps]
3434+ (default [1e-12]). *)
3535+3636+val pp : t Fmt.t