astro.Function.ringDynamics - Elite-Dangerous-Almanac/Almanac-Core GitHub Wiki
@elite-dangerous-almanac/core / astro / ringDynamics
ringDynamics(
ring,primary):RingDynamics|null
Defined in: src/astro/body-rings.ts:236
The period a ring turns in and the speed of each of its edges.
The ring. Needs InnerRad and OuterRad, in metres.
The body the ring goes round. Needs a mass — see bodyMass in
./body-physics.
RingDynamics | null
The period in seconds, the nominal radius in metres and both edge speeds in
m/s, or null when a radius or the primary's mass is missing, or the outer radius does
not exceed the inner one.
The game turns a ring as one rigid sheet. A real ring shears — every particle on its own Kepler orbit, the inner edge fastest. Elite Dangerous gives the whole ring a single period instead, so the outer edge is the fast one, which is the opposite of the physical answer and the reason this cannot be computed edge by edge.
That single period is recovered by applying Kepler's third law at a nominal radius some way across the ring:
nominal = inner + (outer − inner) × 3/8
T = 2π √(nominal³ / GM)
The 3/8 is a fitted constant, not a derivation — the Canonn Research Group arrived at
it from in-game measurements, having also weighed 1/e (≈ 0.368) and 1/φ² (≈ 0.382),
which it sits between. Two things bound how exact the result can be: the journal writes
ring radii to four significant figures, and the constant is a fit to in-game
observations rather than an exact value. Treat the figures as close, not exact.
If either argument is not an object.
import { ringDynamics } from '@elite-dangerous-almanac/core/astro/body-rings';
const ring = { Name: 'A Ring', RingClass: 'eRingClass_Icy', MassMT: 1e13, InnerRad: 1e8, OuterRad: 2e8 };
const dynamics = ringDynamics(ring, { MassEM: 300 });
dynamics?.orbitalPeriod; // -> 29296.1…
// The outer edge outruns the inner one: rigid rotation, not Keplerian shear.
(dynamics?.outerVelocity ?? 0) > (dynamics?.innerVelocity ?? 0); // -> true