Why does a photo bend a spinning propeller — and sometimes smear it? When each sensor row starts makes the bend. How long each row stays open makes the blur.
Each sensor row r (0 = top, 1 = bottom) collects light from start to end.
start = r × readout, end = start + exposure.start = 0, end = exposure for every row; the stored charge is read out row by row afterwards, so readout time cannot bend the image.θ(t) = θ₀ + ωt, ω = 2π × rpm / 60. Turn during a duration: rpm × 6 × ms / 1000 degrees (1500 rpm × 20 ms = 180°).Every photo pixel is the time-average of the scene over its own row's window. Because the blade turns uniformly, that average equals an angular box filter of the blade's polar profile. The profile is supersampled 4× per 0.25° bin and stored as prefix sums per radius, so each pixel's integral is exact and constant-time, even for windows longer than a full turn. Finished photos are cached per frame; while a frame is "developing", only rows still collecting light are recomputed, and pixels brighten in proportion to the light gathered so far.
The card thumbnails isolate one cause each: bend uses your readout with an instant exposure; blur uses your exposure with every row starting together.
demo.getState(). Bend and blur numbers are model outputs computed from your settings.All controls are native sliders and buttons. Press Space (outside a control) to pause or play.
Original code and art by explainer tools. Schematic teaching model.