PhysWall inverts a closed, non-linear physical law at a single measurement point — and refuses when the inverse is not unique.
The gateway between what physics allows and what the numbers show — geometry sets the expectation, the data measures the distance from it.
What this does.
Every three-pointer is a thrown object. Given how much a shooter's release speed varies
from shot to shot, geometry alone decides what fraction of their attempts fall inside the
rim. This tool computes that number, compares it to what the player actually shoots, and
reports the difference.
A gap does not mean a bad shooter. It means something other than the arc is doing the
work — defensive pressure, shot selection, fatigue, or mechanics. The point is to separate
the part that is physics from the part that is not, so a coach knows which one to address.
⚠ Worked out in your browser. This tool is not an inversion of a physical law, so there is no server answer to sign — it is a significance calculation, and it says so rather than implying otherwise.
⚠ worked out in your browser
Lower σ = tighter mechanics = higher expected FG%. Move the slider to see how consistency changes what physics predicts.
| Zone | Dist. | Predicted | Observed | Gap ⓘ |
|---|---|---|---|---|
| Corner 3 | 22 ft | 38.6% | 38.6% | 0.0 |
| Wing 3 | 23.8 ft | 35.5% | 36.5% | +0.4 |
| Top key | 25 ft | 34.5% | 34.6% | +0.1 |
| Non-RA paint | 8 ft | 78.2% | 44.2% | −34.0 |
A percentage is not comparable across the floor. Accuracy falls about 0.8 points per foot, so two shooters at the same number are not the same shooter if one is standing closer. Set both and see.
⚠ This falls out of combining two things, neither of which was ours — the inversion above, and a distance slope measured by somebody else across ~25,000 attempts. It is a consequence, not a validated ranking, and nobody has checked it against a scouting outcome.
DRI is not derived from a physical law. It is an index of four box-score rates, each standing in for a dimension of coverage, and it is checkable by direction rather than by formula: a known rim protector should score high, a pure shooter should not. Move the four and see.
⚠ Read this one by direction, not by the number. It is a weighting of counting stats, so what it can tell you is whether a player covers ground, protects the rim, or does neither — not by how much. The release consistency above is a different kind of thing: it comes out of the geometry of the shot, and it has a measured value.
Defence does not show up as a number of its own. What shows up is a gap: what the physics says a shot from here should go in at, against what it actually goes in at. The first half of that needs a shooter — so set one, and the gap is what is left over.
| Zone | Physical exp. | Observed | From defence |
|---|
43% = (78.2−44.2)/78.2. Fraction of physical expectation removed by defense. Corner 3 is ~100% ballistic — defense minimal.
⚠ And the corner row is the calibration point, not a result.
σ is set so the corner matches, which is why it lands at zero. The finding is
what happens to the other rows once that is fixed: the same σ and the
same physics predict 78.2% in the paint, and the paint returns 44.2%. Defence
is not spread evenly across the floor, and the arc is where it can do least.
σ belongs to the player — it is their release mechanics and it travels with them. The three-point line does not: NBA 7.24 m above the break, FIBA 6.75 m. Same shooter, a 2.3-point shift in what geometry expects. Pick a player and a destination.
The three teams here are what I had box scores for. Any roster works
— the arc does not care who is shooting.
Three columns are required: name,
3P%, 3PA. That is enough for the arc.
Five more open the defensive index: MP,
STL, BLK, DRB,
TOV. All five or none — four rates with the fifth
treated as league average is a number that looks complete and is not.
The header names are Basketball-Reference's own, so a
Per Game table pastes in with nothing renamed:
Share & Export → Get table as CSV.
Required: name, 3P%, 3PA. Optional: team, league, GP, 2P%, PTS, position, age.
League takes nba, el or bcl — it sets which arc the
player is judged against, and defaults to NBA.
The model predicts what an open shot goes in at. A box score mixes open and contested attempts, so the gap it measures contains two things that cannot be separated. Load uncontested splits and the verdict sharpens: a shooter whose open looks match the arc has a shot-selection problem, not a mechanical one, and those need different work.
CSV: player, uncontested_3PM, uncontested_3PA. Optional: contested_3PM, contested_3PA. Names are matched loosely on surname, so an export from any provider should land.
ORI and DRI are on a 0–100 scale. 50 is the baseline — a player contributing
at the average level of the dataset. Numbers above 55 are meaningfully above baseline;
below 45 are below it.
These numbers are checkable by direction, not by formula.
A known defensive anchor should score high on DRI. A pure shooter should score
high on ORI. If they don't, the index is wrong — and that is the check.
Built from three offensive statistics, each measuring a different dimension:
| Statistic | What it measures |
| 3P% | How far above or below the arc's prediction the player shoots from three — the core physical signal of this app |
| 2P% | Paint efficiency — how close to the physical ceiling the player gets inside the arc |
| AST, TOV, MP | Creation value — net passes that become baskets minus giveaways, per minute played |
Built from four defensive statistics, each corresponding to a physical dimension of coverage:
| Statistic | What it measures |
| STL | Horizontal coverage — anticipation and closing speed across the floor |
| BLK | Vertical coverage — peak jump height and timing at the rim |
| REB | Spatial control — positioning and pursuit after the shot |
| TOV, MP | Liability adjustment — turnovers extend opponent possessions, per minute played |
Complete (ORI↑ DRI↑) · Offensive (ORI↑ DRI↓) · Defensive (ORI↓ DRI↑) · Developing (ORI↓ DRI↓).
Thresholds are fixed reference values, not league medians.
The FIBA number was a prediction with nothing behind it until now. A full 2024-25
EuroLeague season — 14,981 attempts, from Basketball Reference — settles half of it.
The gap holds. Geometry predicts Europe should shoot 2.30 points better
because the line is 49 cm closer. Observed: 36.35% against Portland's 34.82%, a gap of
1.53 points with a standard error of 1.00. That is 0.77σ from the prediction — the arc
was right.
The level is high. Both leagues shoot about 1.1 points below what the
model expects, by almost the same amount. A constant offset in both places is not noise;
it is the model predicting an open shot while a box score counts every shot,
contested ones included. Which is the thing tracking data fixes, and why the loader
above exists.
So: trust a gap more than a level. The difference between two players, or between two
leagues, is measured against the same offset and it cancels.
ORI and DRI are independent axes, so they are read as a logical AND — a player is complete when both clear their threshold, not when their average does. Averaging them would rank a player at ORI 70 / DRI 40 the same as one at 55 / 55, and those are different players. This is the same reason the D1–D7 engine returns seven separate verdicts rather than one score: independent constraints define a rectangle, not a distance from an ideal point.
ORI and DRI are not predictions of the shot-arc model. ORI uses its 3P gap as one input; DRI does not use it at all. Neither index produces a physical forecast — a player's position on this chart is a description, not a prediction. The zone table above is the only thing the physics itself produces.
Data sources — what we use now
All player statistics are from Basketball Reference (public). The EuroLeague validation uses the same source: 2024-25 season totals, 260 players, 14,981 three-point attempts. Box-score totals: games played,
FG%, 3P%, 2P%, assists, turnovers, steals, blocks, rebounds, minutes. These are the inputs
to ORI and DRI as described in the ⓘ panel above.
What paid tracking data would add
The NBA's official tracking provider (Second Spectrum) captures 25 frames per second
from cameras in every arena. This unlocks data unavailable in public box scores:
contested vs uncontested FG% per zone — the physical model predicts what an
open shot should go in at; tracking tells us whether the shot was actually open.
Play-type breakdown (isolation, pick-and-roll ball-handler, spot-up, cut) —
ORI could separate a player's mechanics from their shot selection.
Defensive FG% allowed per zone — DRI would measure actual opponent efficiency
instead of proxying it through steals and blocks.
Closing speed and distance covered — the physical quantities the model
reasons about, measured directly instead of inferred.
The model does not change when better data arrives. The same physical constraint applies — only the signal gets sharper. This is the architecture: physics sets the expectation, data measures the gap.
Gilovich, Vallone and Tversky (1985) reported that basketball shooting shows no hot hand. That result stood for 33 years and was taught as a standard example of people misreading randomness.
Miller and Sanjurjo (2018) showed the original analysis carried a bias, and correcting it reverses part of the conclusion. Econometrica 86(6), 2019–2047, free as arXiv:1902.01265.
⚠ And their own Appendix A.2 limits it: the bias is negligible when an observer sees many sequences. This tool is about a short run by one player. It does not carry over to a season-long or league-wide analysis, and an analyst pooling thousands of sequences is not exposed to the effect.
Nothing here was measured by us. The mathematics is published, the correction is published, and the limit is the authors' own.
Every shot in basketball follows a ballistic arc. Given a release angle and speed, physics determines whether the ball enters the hoop. The model asks: what fraction of shots land inside the rim's tolerance window?
σ is the player's release consistency — the standard deviation of shot-to-shot
variation in release speed. Launch angle sits at a stationary point of the range
equation and contributes ~7% of the tolerance window per degree — an order of
magnitude less than release speed (~189% per 1%). A lower σ means tighter, more repeatable mechanics.
Calibrated at σ = 1.45% from NBA corner-3 data (38.6% observed).
Move the slider to model different consistency levels.
For each zone, the expected FG% a player with this σ should make — purely from geometry. The gap between this expectation and a player's actual percentage is the signal: positive means above physics, negative means below.
NBA and FIBA use different three-point distances. The FIBA-NBA gap is validated against a full 2024-25 EuroLeague season: 36.35% on 14,981 attempts vs Portland's 34.82%, observed gap 1.53 points where geometry predicts 2.30 (z=−0.77).
What the shot arc predicts at this release consistency (σ=1.45%, set from NBA corner-3 data). Move slider to see sensitivity.
The three predictions above land within half a point of the observed numbers, across zones that differ by four points. That is the model working.
An independent analysis of ~25,000 attempts then answered the next question — what actually makes one zone harder. Accuracy falls about 0.8 points per foot, and the corners land exactly where that line says a 22.9-foot shot should.
Fitted against the same three numbers:
tolerance window per zone within 0.42 points distance alone within 0.14 points fitted slope -1.3 points per foot independently measured -0.8 points per foot
Distance is the driver. Which is useful, because distance is something a coach can change and a tolerance window is not: the gap between the corner and the top of the key is roughly two and a half feet, and that is where the four points live.
So the zone tolerances here are best read as a stand-in for distance rather than as a geometric property of the spot. The part that is geometric, and separately confirmed by tracking data, is the one below it: release speed is what varies, and the angle is not.
That parameter was picked from geometry — it is the term that survives when you ask what a ballistic arc is sensitive to — and everything above was built around it before any of the following was read.
It turns out to be an established measure in the shot-mechanics literature, arrived at from the opposite direction. Slegers & Love (2024), working from motion capture of 31 professional players, assessed shooting accuracy using "the standard deviation of the intra-individual release velocity as a proxy, given its relevance to distance control."
Same quantity. Different reason. They reached it from biomechanics and coaching practice; this reached it from the geometry of a parabola through a hoop. That the two converge is the point — and it was found by checking afterwards, the way an outside reviewer would, rather than by starting from the literature and building to fit it.
Two further results in the same line of work sit alongside it. Mullineaux & Uhl (2010) found that successful shots cluster near an optimal minimum release speed rather than at higher speeds. And Slegers (2022) found that peak performance comes from matching a player's own mechanics rather than conforming to a fixed ideal release angle — which is the same conclusion this model reaches by treating the angle as a free choice and the speed as the thing that must be repeatable.
This is not a basketball model that happens to be careful. It is one shape, used four times, and shooting is where it is easiest to check:
a relationship, backwards release scatter → what fraction goes in
becomes: the percentage → the scatter
a window the rim's tolerance, from geometry
a refusal no verdict when the sample is too small
to carry one, which is an output and
not a missing one
a stated source every threshold names where it came from
The tool on this site with no physics in it at all meets the same four. Which is the point: the shape is what makes an answer trustworthy, and physics is where it was found rather than what makes it hold.
⚠ The tilde is not modesty. Three of the four counts are exact to the shot; the court-zone set is published as ~25,000. A sum of three exact figures and one rounded to the nearest thousand, printed to the unit, claims a precision it does not have. This read 180,513 until an outside reviewer said so.
This model came out of geometry, not data. Every figure below was produced by somebody else, for their own reasons, before any of it was read here — and each one is followed by what it did to the model.
90,970 three-point attempts found three errors of presentation
49,562 free throws confirmed the core assumption
25,000 shots by court zone took the zone differences away
14,981 EuroLeague attempts where the arc's prediction was tested
———————
~180,500 shots · four independent sources
plus 31 players motion capture — the parameter
(not shots, not counted above)
Two of them confirmed something, one took something away, and one found a boundary. All four could have found nothing, which is what makes them worth quoting at all.
⚠ The EuroLeague line is the only one where the model said what it expected before anyone looked. The European arc is shorter, so shooting there should be easier — by about 2.3 points, on the geometry. A full season came back at 1.5. Half the effect is real and half of it is not there, and a gap that size on that many shots could still be chance. It is written down as a miss rather than a match.
Two collections of numbers exist that were produced without knowing this model exists, and both grade it. They share no provider, no method, and no shot type.
Outcomes only. Made or missed, by zone.
What it caught: three errors. A gap presented as tight that the official count put at +3.7%. A catch-and-shoot figure matched against the wrong cell — catch-and-shoot is roughly half contested, and the model predicts an open shot. And nine players from one team standing in for a league baseline, which turned a refutation into a false agreement.
All three are fixed, and a subset is now refused as a league proxy by type rather than by review.
Launch conditions. Speed, angle and height at release.
What it confirmed: this model varies release speed and holds the angle fixed, because the angle sits where small errors barely matter. A physics group measured that separately from 21,964 tracked shots and found the same — and that speed consistency predicts shot quality at r = 0.73 against angle at r = 0.35.
Velocity to reach the hoop centre, from geometry with nothing fitted: 14.94 mph. Measured: 14.74.
The two do not reconcile, and the size of the gap is itself a quantity nobody publishes.
league free-throw average ~78%
pure-swish window, from geometry ±1.20%
→ model needs σ = 0.49% (0.07 mph)
tracking measured σ = 1.6-1.9% (0.24-0.28 mph)
rim forgiveness = 3.3 to 3.9x
A shot that touches the rim frequently still drops, so the window that actually admits a ball is three to four times wider than a clean swish. That ratio falls out of the disagreement, not from either dataset alone.
So the σ here is not what a tracking camera would hand you. It is smaller, because it already assumes the rim helps. It puts shooters in the right order, and the number itself belongs to this model rather than to the shot.
⚠ And 3.3-3.9x is measured on free throws. A three-pointer arrives at a flatter entry angle, so its forgiveness is probably smaller — carrying this across shot types has not been checked, and is not claimed.
This model aims at the centre of the hoop. Optical tracking of hundreds of millions of shots says the highest make rate is centred 11 inches deep — two inches past centre, because a ball off the back of the rim frequently still drops. Coaches taught the swish for decades; the tracking data did not agree.
So the model has an assumption sitting at zero that the world puts at two inches. The useful question is where that costs anything, and the answer is not everywhere:
aiming centre aiming 2" deep cost three-pointer 36.0% 36.1% ~0 free throw 91.5% 92.6% 1.1 free throw, 3" short 85.0% — 6.5
On a three-pointer the hand shakes far more than two inches, so the aim point vanishes into the scatter and the assumption is harmless. On a free throw the hand is steady enough that where you aim starts to matter as much as how steadily you shoot.
Which sets a boundary rather than a correction. This model is sound on long shots, and on short accurate ones it is optimistic — by a few points, in a direction we can name.
⚠ And it explains part of the 3.3-3.9 figure above, which was computed on free throws: some of that gap is the rim being forgiving, and some of it is this model aiming at the wrong point. Those are two separate effects, and how much each contributes is not something anyone has separated.
The three teams here play in three different competitions, and the app used to label two of them the same. Portland plays 82 NBA games of 48 minutes. Maccabi plays 38 EuroLeague games of 40. Holon plays roughly 14 in the Basketball Champions League. The arc is identical in the two European competitions — 6.75 m against the NBA's 7.24 m — so the geometric expectation is the same for both, but the seasons are not comparable and the app now says so on every card.
The arc gives FIBA a geometric advantage: the line is 6.75 m instead of 7.24 m, which at an unchanged release consistency is worth +2.2 percentage points. Checked against whole-league data, that advantage does not appear:
| NBA | EuroLeague | gap | |
| predicted | 35.6% | 37.8% | +2.2 |
| all shots | 36.0% | 35.8% | −0.2 |
| catch-and-shoot | — | 37.6% | matches |
| season minutes | ~2,800 | ~1,050 | 2.7× |
On all shots the prediction is wrong by 2.4 points and wrong in sign. On
catch-and-shoot it lands within 0.2 points. The difference between those two rows is
that a third of EuroLeague threes are pull-ups, taken on the move, and they convert at
32.3% rather than 37.6%.
The geometry was right and the assumption around it was not. The model
predicts a set, open shot. Extending it to a league average silently assumed that release
consistency travels unchanged across leagues; it does not. Solving backwards from the
observed number puts EuroLeague σ at roughly 1.54% against the NBA's 1.45% — about 6%
looser, which is what a higher share of shots on the move would produce.
An NBA player logs roughly 2.7 times the season minutes of a European one, so
fatigue is a fair objection to attributing all of this to shot profile — and it is
not answered here. Postseason shooting does fall, 35.96% to 34.76% league-wide, but
that comparison moves at least six things at once: accumulated fatigue and injuries
peak, pressure peaks, defence tightens and isolations rise, while rest between games
also rises and rotations shorten. The 1.21-point drop fits any of them or all of
them. What the arc explains and what the calendar explains are not separated
by the data loaded here. Separating them needs month-by-month splits, or
back-to-backs against rested games, or the catch-and-shoot and pull-up split within
the same games — each moving one variable instead of six.
So the zone table below should be read as catch-and-shoot expectations,
not league averages, and a player's gap is only comparable across leagues once their
shot profile is. That is exactly what the tracking import resolves.
A checking tool, not professional advice. It tells you what a measurement does and does not support; what to do about that is your decision.