Purge for Mac: Free, Open-Source Mac Cleaner
Free open-source Mac cleaner for caches, Xcode junk, and app leftovers. Trash-first, no telemetry. Install with Homebrew or download for macOS 13+.
Explore and visualize periodic three-body orbits
Translation pending
AI summary · website content
OtherJavaScript · TeXGitHub @roholazandieOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗An interactive gallery of periodic solutions of the planar Newtonian three-body problem, rendered as glowing trails in the browser — plus a braid view that unrolls each orbit along a time axis.
It plays three published catalogues:
| Collection | Orbits | Source |
|---|---|---|
| Classic | 20 famous orbits: figure-eight, Lagrange, Šuvakov–Dmitrašinović butterflies & moths, Broucke | Moore 1993; Chenciner & Montgomery 2000; Šuvakov & Dmitrašinović, PRL 110, 114301 (2013); Broucke 1975 |
| Li & Liao | 2,044 zero-angular-momentum orbits (695 equal-mass, 1,349 with m₃ ∈ {0.5 … 10}) | Li & Liao, Sci. China PMA 60, 129511 (2017); Li, Jing & Liao, PASJ 70, 64 (2018) — sjtu-liao/three-body |
| Free-fall | 24,582 initial conditions = 12,409 distinct collisionless free-fall orbits (236 self-dual) | Hristov, Hristova, Dmitrašinović & Tanikawa, Celest. Mech. Dyn. Astron. 136, 7 (2024), arXiv:2308.16159 — data |
No build step and no dependencies — open app/index.html in a browser (works from file://), or serve the folder:
python3 -m http.server -d app 8000 # then open http://localhost:8000
Deploy: it's a static site. On Vercel, import the repo as-is — vercel.json serves the app/ folder with no build step. On GitHub Pages, publish from main and open /app/.
B) — each body becomes a world-line: position projected on an adjustable axis (→) against time (↑). The bodies ride a "now" line while their history scrolls down; at every crossing the strand nearer the viewer passes over, as in a braid diagram. The time window is in scale-invariant time t* so every cell scrolls at the same rate.L): a census of the braid of every catalogued orbit (14,473 in all). Plot braid entropy log λ against T*, crossings, syzygies, word length or the Lyapunov exponent, with correlation and Nielsen–Thurston type tables. The census is validated against the published topology: 2,043/2,044 Li & Liao free-group words (the remaining entry is an error in the published table) and 236/236 self-dual syzygy sequences. Click a point to open that orbit.
A second mode, Form lifetimes, tests how long forms survive. Each orbit is nudged by ε = 10⁻³ … 10⁻¹³ and run until its syzygy sequence first deviates. The measured lifetimes follow τ ≈ ln(δ/ε)/λ_p, with λ_p from the monodromy matrix: median λ_fit/λ_p = 0.995 for unstable Li & Liao orbits, and λ_p matches the published free-fall Lyapunov exponents to within 1%.C): objects at finite resolution. A cloud of 200 nearby states evolves, in the Chirikov standard map (a KAM island or the chaotic sea; click the portrait to place a cloud) or around a three-body orbit. Two members are one object at resolution ε if they have stayed within ε of each other so far. The view shows the cloud coloured by object, the count N(ε, t), and the dendrogram, which only gains branches as time runs. The first split matches the prediction from the stretching of the cloud's centre, δ₀Λ*(t) = ε, to within a few percent.Keys: Space pause · S settings · B braids · L braid lab · C clouds · ←/→ page · Esc back.
Integrator (app/physics.js). The orbits are extremely unstable (the free-fall catalogue reports Lyapunov multipliers up to e³⁰ per period) and pass through near-collisions down to ~10⁻⁸, so a plain Runge–Kutta drifts or stalls. The app uses algorithmic regularization (Mikkola & Tanikawa 1999): a logarithmic-Hamiltonian leapfrog — exact for Kepler motion — in chain coordinates (relative vectors along the two shortest edges, so a close pair keeps full double precision), driven by Gragg–Bulirsch–Stoer extrapolation with adaptive step and exact landing on a target time.
Each orbit takes ~1–10 ms to compute; cells are filled a few per frame.
Renderer (app/gl-trails.js). Trails are continuous WebGL triangle strips with per-vertex width and brightness (smooth taper, Catmull–Rom-resampled positions, rounded head) and an anti-aliased core evaluated per pixel. Glow is a bloom post-process — the scene is Gaussian-blurred at ½, ¼ and ⅛ resolution and added back — so tight hairpin turns never fold. Braids are drawn back-to-front with a depth buffer: each strand carries a dark outline sitting just behind it, which cuts the strands further back but never itself. A Canvas 2D fallback is used when WebGL is unavailable.
app/
index.html, style.css UI
main.js collections, grid, inspector, braid view, export
physics.js regularized integrator (also loadable from Node)
gl-trails.js WebGL trail / braid / bloom renderer
braid.js syzygies, free-group words, braid words, invariants (also loadable from Node)
lifetime.js form lifetimes: Newton refinement, monodromy exponent, perturbed runs (also loadable from Node)
lab.js braid lab view (braid entropy and form lifetimes)
clouds.js clouds: standard map, three-body clouds, complete-linkage objects (also loadable from Node)
clouds-view.js clouds view
braid-data.js braid census (generated)
lifetime-data.js lifetime census (generated)
classics.js initial conditions of the classic gallery
orbits-data.js Hristov et al. free-fall catalogue (generated)
liao-data.js Li & Liao catalogues (generated)
scripts/
build-data.js regenerate the two data files from the published sources
braid-census.js regenerate app/braid-data.js (all cores, about a minute)
lifetime-census.js regenerate app/lifetime-data.js (all cores, about an hour)
test-physics.js regression checks of the integrator against the catalogues
docs/ screenshots
genealogy_time.tex companion paper (build with tectonic or pdflatex)
npm test # node scripts/test-physics.js (Node 18+)
npm run build-data # re-download and rebuild app/*-data.js (byte-identical output)
Code: MIT. The orbit catalogues belong to their authors (see the table above); this project only re-packages the published initial conditions in a compact form and cites them in the generated files. Please cite the original papers if you use the data.