Quick start
One measurement is three moves: capture, scan, capture.
- Capture the ballLine up the center reticle (a "+" that turns green, yellow, or blue depending on ground-tracking quality) on the ball and tap the + button. Terrain scanning starts the moment you do.
- Scan between ball and holeSweep the camera slowly across the ground between ball and hole. The 3×3 grid at the center of the screen keeps collecting the position and surface normal at each point it points to. Pinch to resize the grid.
- Capture the holeLine up the reticle on the hole and tap + again — scanning stops and both solvers run at once. Results usually land within about a tenth of a second.
- Read the resultCheck the result card up top and the trajectory lines in AR. Tap the card to collapse it to one line; tap again to expand.
- ResetWhen you're done, reset clears the ball/hole positions, the computed result, all terrain data, and every AR marker so you can start fresh.
Reading the results
What each line on the result card means.
- ⬇️ The arrows stretch long toward the holeLong fall-line arrows pointing toward the hole mean a fairly steep downhill here.
- 📏📐 Actual 2.46m, flat-adjusted 0.29mThe slope is so strong that roughly a tenth of the actual distance's effort (about what a flat 0.29m putt takes) is enough to reach the hole.
- 🎯 0.5m spot: 2.2cm right0.5m in front of the ball, aim 2.2cm to the right of the line extended through the hole.
- ↕️ Valid range: -1.4cm to +12.7cmAim anywhere in this range off hole center (roughly half a cup's width to the right) and it still goes in at this pace.
Boundary A / Boundary B — the two edges of the left/right aim window that "still goes in if you aim anywhere inside it," given a reasonable stroke strength. Uphill putts tend to widen this window; downhill putts narrow it.
How it's computed: the ball-to-hole line is sampled every 10cm, the terrain normal is looked up at each point, and all the tilt directions are averaged. If the average direction points toward the hole, that's downhill; any sideways component reads as left/right lean. Because this treats the whole ball-to-hole stretch as one flat plane, terrain that alternates uphill and downhill along the way can partly cancel out in the average.
Cup-count convention
"N cups out" is measured from the hole's edge, not its center — a point 5.4cm (hole radius) + N × 10.8cm (hole diameter) away from the hole's center.
AR overlay legend
What each on-screen marking means.
Reading this screen — left photo
- 📏📐 Actual 2.23m, but flat-adjusted is larger: 3.73mFlat-adjusted being larger than actual distance signals an uphill putt — swing with the effort of a flat 3.73m putt.
- 🎯 left 4.5 cups out · 0.5m spot: -12.7cm0.5m in front of the ball, aim 12.7cm to the left of the line extended through the hole.
- ↕️ Valid range: left 6.0–4.5 cups out (-68.3cm to -55.2cm)Both edges sit to the left, and the window is wide — a typical trait of uphill putts giving more room to aim.
Even before you look at the computed result, the blue arrows alone tell you something about the terrain — parallel to the line means a straight uphill or downhill putt, tilted across it means side-slope (a break factor).
Settings
The sheet opened from the gear button at the bottom.
📐 Flat-adjusted: 3.73m
B F
Elapsed — B+F: 18.3ms / B-only: 9.2ms
[Backward+Forward] Valid direction: Yes
🎯 Left 4.5 cups out · 0.5m spot: -12.7cm
↑ Boundary A: aim left 6.0 cups out (-68.3cm)
↑ Boundary B: aim left 4.5 cups out (-55.2cm)
[Backward-only] Valid direction: Yes
🎯 Left 3.0 cups out · 0.5m spot: -8.4cm
↑ Boundary A: aim left 3.5 cups out (-42.5cm)
↑ Boundary B: aim left 2.5 cups out (-32.9cm)
| Item | What it does |
|---|---|
| Stimpmeter | Green speed (rolling resistance). Enter a measured stimp distance and the deceleration constant is recalculated immediately. |
| Show terrain slope | Toggles the yellow squares and blue arrow overlay on or off. |
| Normal vector diagnostics | Shows the average normal and tilt, plus a sample list sorted by steepest tilt. |
| Solver tuning · target overrun distance | Directly adjusts the target speed at the hole — enough to roll a little past if missed, rather than dying exactly at the cup. The larger this value, the narrower the aim window (Boundary A/B) tends to get — V1 had no equivalent control. |
| Advanced: solver comparison | Shows both solvers' results and timing for the same input, side by side. |
How it works
A summary of the technical documentation.
Terrain: a field of normal samples, not a plane fit
Approximating a green as a single plane tends to average away local undulation. EasyPutt instead stores hundreds of raw (position, normal) samples as-is, and at every simulation step looks up the horizontally-nearest sample's normal at the ball's current position.
Physics: a rolling model calibrated to measurement
Two forces act at every step — slope acceleration (gravity projected onto the surface, scaled by the 5/7 rolling-sphere inertia factor), and rolling resistance derived from the stimpmeter value. The hole-out radius is simply the hole's own radius (5.4cm) — the ball falls in whenever its center of mass crosses over open space above the cup.
Solver: backward tracing, then forward re-verification
The main solver traces backward in time from the hole to the ball to build a candidate, then repeatedly corrects it against a forward simulation from the ball. A separate backward-only solver (2–3× faster, an approximation) solves the same problem independently as a cross-check.
Improvements over V1
Based on the codebase of V1, the first version of this app, and a field test on 2026-07-28. These are current observations, not settled conclusions.
When V1 first shipped, its project name had changed several times during development — TangTong → TingTing/TingPutt → PuttPro — but it reached the App Store under the same name as today: EasyPutt. This version is an upgrade of that same EasyPutt. It reconstructed the entire rectangular area between ball and hole as a tile mesh, and found the aim by brute-force sweeping a speed × direction grid with RK4.
The three biggest differences you'll feel
- The scanning step is goneV1 required scanning every tile covering the whole terrain, one at a time, via long-press-and-drag. EasyPutt just needs the ball and hole marked — the corridor you naturally walk between them gets sampled along the way.
- Calculation is much fasterSweeping every speed and direction through RK4 gave way to narrowing candidates via backward tracing and verifying forward — solver time dropped to single- or double-digit milliseconds.
- More to adjust in settingsThe target overrun distance at the hole can be tuned directly, and new screen zoom and AR-view-to-Photos capture features were added.
Differences observed in the field (8 identical putts, same locations)
- Subtle slope appears to be picked up more sensitively. On a paved plaza with an average tilt of 1.9–2.9°, V1 added only +0.07–0.22m to the flat-adjusted distance — reading close to flat — while EasyPutt added +0.56–0.71m, detecting the slope. Some of this gap may come from the target overrun distance setting — a lower overrun means a slower target speed, which leaves the ball exposed to the slope longer and produces more break. Try tuning the overrun value in Settings to match the sensitivity you want.
- Local terrain right along the line seems to carry through to the reading. On a steep dirt path with an 11–13° collapsed slope confined to a strip 0.65–0.9m off the line, EasyPutt read the putt as nearly straight based on samples near the line itself, while V1's plane fit appears to have blended in that side slope and produced a noticeably larger break.
- Only 1 of the 8 locations — an extreme steep downhill — failed to find a solution.
V1's actual AR screen. The ball-to-hole rectangle is broken into individual tiles, each with its own arrow showing the local slope at that spot. The header text (Left Inside(-1) ~ Right Edge(2)) is the aim window computed that way.
Structural differences
V1
- Reconstructs the entire ball-hole rectangle as a tile mesh — each tile raycast individually via long-press-and-drag, with retries on failure
- Brute-force sweeps a speed × direction grid with RK4 — heavy enough to need a loading spinner; gated putts over 1.5m behind a paywall
- The RK4 search result and the on-screen approximation formula are computed independently and can disagree
- "Flat-adjusted distance" was implemented three separate times in the code (one path dead), and height correction for diagonal tile crossings was left unimplemented
EasyPutt
- Lightly collects (position, normal) samples along the corridor you actually walk from ball to hole — the scan is the walk
- Narrows candidates via backward tracing, then verifies with a forward simulation — both solvers together run in the single- to double-digit milliseconds
- Aim description, cup count, and cm offset all come from a single pipeline (aimOffsetCentimeters), so the numbers can never disagree with each other
- Even when distance is too far or no solution is found, a scan-derived uphill/downhill and left/right lean reading is always shown instead
Limitations
- The backward-only solver can be inaccurate or diverge on steep slopes — the backward+forward (solid-line) result is always the one to trust.
- Beyond roughly 12m between ball and hole, EasyPutt skips precise calculation entirely — that distance is treated as outside this app's realistic putting range.
- Terrain samples only exist near the path that was actually scanned, so trajectories that stray far from that corridor draw on less representative samples.
- Requires ARKit camera tracking, so it only runs on a real device.