This is an independent 2D orbital-mechanics model, not a flattened 3D view. The receiver moves on an exact circular orbit of radius r around a center a real distance D from the transmitter, with angular speed ω = 2π/T set by the period slider. At every pulse the sim computes its exact position and velocity vector, then does real geometry:
line of sight u = (receiver − transmitter) / d, d = |receiver − transmitter|
one-way light time τ = d / c
transverse speed v⊥ = |v − (v·u)u| (component of velocity ⟂ to the line of sight)
point-ahead angle α = v⊥ / c (small-angle form)
predicted position = receiver(t) + v(t)·τ (real vector extrapolation, not a canned offset)
The beam is then aimed either at the receiver's current apparent position (point-ahead OFF) or its predicted future position (point-ahead ON), and travels for τ seconds. Meanwhile the receiver keeps moving on its real orbit to its exact position at t+τ — computed from the same circular-orbit equation, not simulated frame-by-frame, so there's no accumulated integration error. The sim then checks, honestly, whether the beam's aim point falls within the diffraction-limited footprint of where the receiver actually ends up:
θ = 1.22 λ / D_tx (Rayleigh half-divergence)
footprint radius r_spot = d · θ
HIT if |receiver(t+τ) − aim point| ≤ r_spot
- Range D — sets the light-time delay τ, and (with aperture/wavelength) the absolute footprint size.
- Orbit radius / period — set the receiver's real orbital speed v = rω, which — combined with where it sits on its orbit relative to the line of sight — determines v⊥.
- Aperture / wavelength — narrow the beam (smaller footprint), making the same point-ahead offset relatively worse in beamwidths if left uncorrected.
- Point-ahead toggle — OFF aims at the receiver's current apparent position (usually a big miss at deep-space ranges); ON leads by the real extrapolated position and lands inside the footprint.