Drag off the tee to aim and power up, or hit throw. The only other controls are the ones a thrower actually has: which disc, how much snap, what angle the plate leaves on, and whether the nose is up or down.
The trace changes colour mid-flight. That is the whole creation, and it is not a styling choice — it is the sign of a number.
One division
A thrown disc is a gyroscope in a wind, and a gyroscope does not do what a torque tells it to do. It does what the torque tells it to do rotated ninety degrees, at a rate divided by how fast it is spinning:
dn/dt = τ⊥ / (I_z · ω_z)
n is the disc’s normal — the way “up” through its top points. The torque
that matters is the pitching moment, because air arriving at an angle to
the plate pushes harder on one half of it than the other, and that moment
points along the disc’s right–left axis. Precession turns a pitch into a
roll:
nose-DOWN moment → the disc banks RIGHT (what the sport calls turn)
nose-UP moment → the disc banks LEFT (what the sport calls fade)
Banked, the lift tilts with the plate, and a tilted lift is a turn. So the flight path is the time-integral of a sign.
The sign is one coefficient
The pitching moment coefficient is a single curve in angle of attack:
C_M(α) = C_M0 + C_Mα·α + C_Mq·α|α| , C_M0 < 0
Below the crossing α* it is negative — nose down — and the disc turns right.
Above α* it is positive and the disc fades left. There is no second
mechanism. Turn and fade are the same coefficient on either side of one root,
and “stability”, the number stamped on every disc ever sold, is a statement
about where that root sits.
| disc | C_M0 | C_Mα | C_Mq | α* | crossed at | widest right | landed |
|---|---|---|---|---|---|---|---|
| understable driver | −0.0205 | 0.150 | 0.90 | 5.10° | 37% of the flight | 7.4 m | 5.3 m |
| neutral driver | −0.0115 | 0.160 | 1.20 | 2.97° | 30% of the flight | 0.0 m | −14.9 m |
| overstable driver | −0.0042 | 0.170 | 1.60 | 1.18° | 21% of the flight | 0.0 m | −21.0 m |
| midrange | −0.0095 | 0.165 | 1.35 | 2.45° | 28% of the flight | 0.0 m | −13.9 m |
| putter | −0.0070 | 0.170 | 1.45 | 1.85° | 26% of the flight | 0.0 m | −13.4 m |
Three degrees of α separate a disc that turns over and never comes back from one that hooks left out of the thrower’s hand.
Nobody pitches the disc up. The air moves.
The thing I did not expect to be able to draw. A gyroscope holds its attitude
in space, so across a flight the plate barely moves — and yet α climbs the whole
way, crosses α*, and reverses the roll. Here is a neutral driver released dead
flat at 26 m/s and 1400 rpm, column three being the plate’s own pitch against
the horizon:
| t | speed | plate pitch | flight path | α | C_M | roll rate |
|---|---|---|---|---|---|---|
| 0.0 s | 26.0 m/s | 10.0° | 10.0° | 0.0° | −0.0115 | 10.1°/s right |
| 1.0 s | 20.8 m/s | 9.8° | 8.9° | 0.9° | −0.0088 | 5.4°/s right |
| 1.5 s | 18.7 m/s | 9.4° | 7.3° | 2.1° | −0.0041 | 2.1°/s right |
| 2.0 s | 16.9 m/s | 8.8° | 5.2° | 3.6° | +0.0032 | 1.4°/s left |
| 3.0 s | 13.9 m/s | 7.7° | 0.1° | 7.6° | 0.0304 | 9.5°/s left |
| 4.0 s | 11.3 m/s | 7.4° | −5.8° | 13.2° | 0.0895 | 19.7°/s left |
| 5.0 s | 9.5 m/s | 0.3° | −17.9° | 18.2° | 0.1604 | 26.1°/s left |
| 6.2 s | 11.7 m/s | −32.4° | −41.5° | 9.2° | 0.0449 | 11.5°/s left |
Between release and five seconds in, the plate pitches ten degrees further down and α rises by eighteen. The disc never lifts its nose. The flight path tips out from under it — a disc that is falling is meeting air that arrives from below — and the angle between the plate and the air is what the coefficient is a function of. Fade is not something the disc starts doing at the end of a flight. It is the same torque that was turning it, arriving on the far side of a root the disc walked across without doing anything.
Taking the halves away
Same release, dead flat, with pieces of C_M deleted:
| model | carry | widest right | landed | bank at landing |
|---|---|---|---|---|
| the disc as it is | 88.0 m | 8.2 m | 4.3 m | −52.5° |
| the α terms removed — a constant nose-down moment | 82.1 m | 24.6 m | 24.6 m | +26.6° |
C_M0 = 0 — the crossing dragged to α = 0 | 81.0 m | 0.0 m | −14.8 m | −50.9° |
C_Mq = 0 — a straight C_M line | 91.0 m | 18.1 m | 18.1 m | −12.2° |
C_M = 0 — no pitching moment at all | 89.5 m | 0.0 m | 0.0 m | 0.0° |
The last row is the one to sit with. A disc with no pitching moment flies dead straight, lands level, and goes almost as far as any of them — the flight that every beginner is trying to throw is the flight of a disc with the interesting physics switched off. Every shot shape in the sport is bought by spending glide on a torque, and the only question a thrower gets to answer is which direction to spend it in.
What snap is actually worth
This is the measurement I would not have guessed. Hold the release speed at 26 m/s — same arm, same disc, same flat release — and vary only the spin:
| spin | carry | landed | flight | bank at landing |
|---|---|---|---|---|
| 600 rpm | 53.7 m | 11.6 m right | 2.78 s | 88.4° |
| 1000 rpm | 66.5 m | 19.0 m right | 3.85 s | 45.9° |
| 1400 rpm | 77.2 m | 25.0 m right | 4.98 s | 17.3° |
| 1900 rpm | 87.0 m | 25.4 m right | 6.18 s | −12.0° |
| 2400 rpm | 89.4 m | 19.4 m right | 6.61 s | −24.7° |
35.7 m — sixty-seven percent more carry, and 3.83 s more air, from spin alone. At 600 rpm the divisor is so small that the disc rolls up onto its edge (88° of bank) and stops being a wing; at 2400 it holds the plate flat and flies. Every coaching video that says snap is distance is reading this table.
Now let the thrower do the obvious thing and re-aim for the disc they actually have — at each spin, the release angle that lands it on the line:
| spin | hyzer that lands on the line | carry |
|---|---|---|
| 700 rpm | 8.8° | 84.9 m |
| 1100 rpm | 3.7° | 86.1 m |
| 1500 rpm | 1.6° | 86.8 m |
| 2000 rpm | 0.4° | 87.3 m |
| 2400 rpm | −0.1° | 87.5 m |
Across 700–2400 rpm the on-line release angle moves 9.0° — about 0.53° per 100 rpm — and the carry it buys moves 2.6 m.
So: unaimed, snap is worth 35.7 m. Aimed, it is worth 2.6 m. The thirty-three metres in between were never spin. They were a release angle that nobody had matched to the arm holding the disc, and they are recoverable with a wrist, not a winter of training. Spin and release angle are the same control, and only one of them is free.
Which also means holding one angle while the arm changes is expensive:
| thrower | spin | carry | miss from the line |
|---|---|---|---|
| novice | 894 rpm | 82.9 m | 8.0 m |
| club player | 1192 rpm | 82.4 m | 12.5 m |
| pro | 1440 rpm | 82.4 m | 14.9 m |
| spin monster | 1738 rpm | 82.5 m | 16.8 m |
Nine metres of lateral spread for 0.5 m of carry, on one disc at one angle. Snap is a steering wheel wearing a power meter’s clothes.
The bag is a set of release angles
Every disc, released on the angle that lands it on the line, at 26 m/s and 1440 rpm:
| disc | hyzer that aims it | carry | widest right |
|---|---|---|---|
| understable driver | 12.0° | 86.9 m | 3.6 m |
| neutral driver | 1.9° | 86.7 m | 5.4 m |
| overstable driver | −6.2° | 82.5 m | 5.9 m |
| midrange | 0.3° | 73.7 m | 4.6 m |
| putter | −1.9° | 64.5 m | 3.9 m |
The three drivers carry 86.9, 86.7 and 82.5 m — a spread of 4.4 m across 18.2° of release angle. They are not three distances. They are three different answers to the same question, and the thing being bought is the shape of the arc between here and there, which is why the bag has more discs in it than a thrower has distances.
Nose
| nose | carry | peak height |
|---|---|---|
| −4° | 92.2 m | 6.1 m |
| −2° | 87.6 m | 7.7 m |
| 0° | 82.4 m | 9.1 m |
| +2° | 77.1 m | 10.4 m |
| +4° | 71.9 m | 11.5 m |
2.64 m of carry per degree, straight off the (α − α0)² in the drag law,
and every metre of it goes into height nobody asked for. It is the only control
here that is worse in both directions than it looks.
Wind, which does not touch the disc and changes everything
| wind | carry | landed | widest right |
|---|---|---|---|
| 6 m/s tail | 76.7 m | 11.6 m left | 0.0 m |
| 2 m/s tail | 83.1 m | 15.5 m left | 0.0 m |
| still | 82.4 m | 14.9 m left | 0.0 m |
| 2 m/s head | 79.8 m | 11.5 m left | 0.0 m |
| 4 m/s head | 76.5 m | 4.2 m left | 3.7 m |
| 6 m/s head | 74.2 m | 10.9 m right | 14.4 m |
| 8 m/s head | 64.9 m | 40.8 m right | 40.8 m |
A headwind raises the airspeed, so it multiplies C_M at every α — including
all the α below the crossing, where the moment is still nose-down. It spends
its time in the turn. That is why a card full of players reaches for a more
overstable disc when it starts blowing in their faces, and why a tailwind that
feels like free distance costs six metres and fades out early.
I did not fit any of that. The coefficients were set by how each disc flies in still air, and the wind behaviour is what the integration did with them — which is the one piece of outside validation this model has, so I am recording it.
Wind is not a substitute for a disc, though, which is worth knowing before buying one fewer: searched across ±10 m/s, the closest a wind can get an understable driver to flying like a neutral one is 6.2 m off its landing spot, and a neutral to an overstable one, 8.7 m. It is a dial that moves the crossing, not one that moves the disc.
The hole
88 m, OB 26 m either side, four trees, a basket. Three drivers can all reach the chains from this tee, and no two of them do it the same way:
| disc | aim | hyzer | carry | miss |
|---|---|---|---|---|
| understable driver | −2° | 11° | 87.6 m | 0.6 m |
| neutral driver | −3° | 0° | 88.1 m | 0.4 m |
| overstable driver | −11° | −14° | 88.3 m | 0.5 m |
| midrange | −12° | −8° | 79.4 m | 8.8 m |
| putter | −13° | −12° | 69.3 m | 18.8 m |
Every one of those lines was found by search, not by taste — measure.mjs
sweeps aim × release angle and reports the best each disc can do. The
overstable disc gets there by being aimed eleven degrees left of the basket on
fourteen degrees of anhyzer, which is a thing no beginner would ever try and
every experienced player does on purpose.
What is modelled and what is fitted
The aerodynamic form is Hummel’s (2003) flying-disc fit: linear lift, quadratic drag about a small negative α, linear pitching moment. Everything structural — precession, the lift tilting with the plate, α being an angle between the plate and the air rather than between the plate and the ground, spin in the divisor — falls out of the integration and is not tuned.
Two things are mine and should be read as modelling choices:
- The α|α| term in
C_M. A straightC_Mline cannot fade. TheC_Mq = 0row above shows what happens: 18.1 m right and no comeback, because at the end of a flight the airspeed is small and a linear moment has nothing left. Real discs fade hard and late, so the centre of pressure must be marching forward as the plate stalls.α|α|is the cheapest honest way to say so. - The coefficient values per disc.
C_M0,C_MαandC_Mqwere chosen by grid search so each preset flies like the disc it is named after. They are not wind-tunnel numbers and I would not quote them anywhere. What the model earns honestly is every relationship in the tables above — those come out of the integration.
SPIN_DECAY is tuned to lose 24–31% of the spin across a drive, which is where
high-speed footage puts it, and spin decay is the only reason I·ω moves at all
during a flight.
Reuse
src/snap.mjs is framework-free: no DOM, no canvas, no timers.
import { simulate, bestLine, rad } from './snap.mjs';
const res = simulate({ disc: 'neutral', speed: 26, snap: 5.8, hyzer: rad(10) });
// → { carry, drift, peakRight, flightTime, peakHeight, path:[{t,x,y,h,v,alpha,bank,CM,rollRate}], … }
const line = bestLine({ disc: 'understable', speed: 26, snap: 5.8 });
// → the release angle that lands it on the aim line, searched coarse-then-fine
createThrow() hands back a live object you step yourself, a frame at a time —
that is what the demo drives. The frame is aerospace (x downrange, y right,
z down), angles are radians inside and degrees only at the edges, and
path[].rollRate is signed right-positive, which is what the trace is coloured
by.
node scripts/measure.mjs prints every table on this page.
node scripts/screenshot-demo.mjs regenerates thumb.png and media/, and
doubles as the smoke test — it drives the real page in Chromium, cross-checks
the page’s landing against a cold simulate() of the same throw, and exercises
the keyboard and pointer paths.






