The 3D sim never actually simulates a wave: it computes each leg's amplitude and arrival time in one shot from a closed-form formula, D = r + Δθ·r·s, then animates a cosmetic ripple to match. This 2D companion removes that shortcut and simulates the real thing — the web as a network of point masses connected by damped springs, with an actual transverse wave equation integrated frame by frame:
node (i,j): mass m, transverse displacement z, velocity v
radial spring: k_r = m·(c/a)² a = ring spacing, c = wave-speed slider
spiral spring: k_s = k_r / s s = spiral extra-loss multiplier
damping: γ_r = ζ·2·sqrt(k_r·m) (critical-damping-scaled, ζ = damping ratio)
γ_s = min(1.5,ζ·s)·2·sqrt(k_s·m)
per edge: F = k·(z_b − z_a) + γ·(v_b − v_a) (Hooke's law + viscous coupling)
integrator: v += (ΣF/m)·dt ; z += v·dt (symplectic Euler, ~24 substeps/frame)
The hub is a pinned (fixed) boundary — a reasonable simplification since the spider's own body and the rigid frame anchors are far more massive than the vibrating capture area. A strike sets one node's displacement to 1.0 and lets the lattice relax; the disturbance genuinely propagates node-to-node along radii (efficiently) and around rings via the weaker, extra-damped spiral springs (poorly), exactly the physical asymmetry the 3D sim only asserted algebraically. Eight legs read the ring closest to the hub on their own radius and record the real peak displacement and the real time their 5%-of-strike threshold is first crossed — direction is decoded as the amplitude-weighted population vector of the eight leg angles, and distance as wave-speed × latency at the fastest leg, both derived from numbers the lattice actually produced.
Verified numerically (standalone Node script, not shown here): the lattice's threshold-crossing front speed scales linearly with the wave-speed slider (~1.2× the nominal c, a known discretization effect — a single-node pluck is broadband and its leading edge outruns the long-wavelength group velocity c=a·sqrt(k/m) that the slider sets); increasing the damping ratio strictly lowers the peak amplitude reaching a distant node (checked at ζ = 0.02, 0.15, 0.4, 0.8); and the population-vector direction estimate exactly recovers the strike angle in the noiseless case, including for a strike between two legs. Push the wind-forcing slider up to watch this noise floor — now a real measured RMS from the simulated lattice, not an injected number — start competing with weak, distant, heavily-damped signals.
Controls: wave speed sets the radial spring stiffness (and so how fast a real wave crosses the web); damping ratio sets how much of each spring's energy is dissipated per oscillation; spiral extra-loss multiplier weakens and further damps the ring-to-ring coupling that lets one leg "hear" a strike on a neighboring radius; wind forcing continuously perturbs every node, exactly as background vibration would.