package tiny_libs
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>
From-scratch libraries for teaching: graphics, audio, compression, crypto, networking and more
Install
dune-project
Dependency
Authors
Maintainers
Sources
0.3.6.tar.gz
md5=7c636383d146d30ac6f2fa234a6253c8
sha512=c79f3823c5f8f57e5038eb640d487c61168b84aa07c61999d6622ef9fd0c890e2b03b4c6a7cdbbe9352a49e25dda00ac7bb14693cee8e3d7beeed251351a2af0
doc/src/tiny_libs.physics_2d/Kepler.ml.html
Source file Kepler.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42(* Claude Code * * Copyright (C) 2026 Yoann Padioleau * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public License * (LGPL) as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. *) (* See Kepler.mli *) type elements = { a : float; e : float; inclination : float; mean_longitude : float; perihelion : float; node : float } let radians d = d *. Float.pi /. 180. let period (a : float) : float = a ** 1.5 let eccentric_anomaly ~(e : float) (m : float) : float = (* Newton's method on f(E) = E - e sin E - M, f'(E) = 1 - e cos E; * a handful of iterations for the planets' e < 0.21 *) let rec go n x = let dx = (x -. (e *. sin x) -. m) /. (1. -. (e *. cos x)) in if n = 0 || Float.abs dx < 1e-12 then x -. dx else go (n - 1) (x -. dx) in go 30 m let mean_anomaly (el : elements) ~(days : float) : float = radians (el.mean_longitude -. el.perihelion) +. (2. *. Float.pi *. days /. (365.25 *. period el.a)) let in_plane (el : elements) ~(days : float) : Vec2.t = let e = eccentric_anomaly ~e:el.e (mean_anomaly el ~days) in (el.a *. (cos e -. el.e), el.a *. sqrt (1. -. (el.e *. el.e)) *. sin e) let position (el : elements) ~(days : float) : float * float * float = let (x', y') = in_plane el ~days in (* the argument of perihelion, the node, the inclination (JPL's * rotations) *) let w = radians (el.perihelion -. el.node) and o = radians el.node and i = radians el.inclination in let cw = cos w and sw = sin w and co = cos o and so = sin o and ci = cos i and si = sin i in ( (((cw *. co) -. (sw *. so *. ci)) *. x') +. ((-.(sw *. co) -. (cw *. so *. ci)) *. y'), (((cw *. so) +. (sw *. co *. ci)) *. x') +. ((-.(sw *. so) +. (cw *. co *. ci)) *. y'), (sw *. si *. x') +. (cw *. si *. y') )
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>