The math

Targets and interpolation

Your tuning sheet has a row for 8 knots and a row for 10. The breeze was 8.7. Here is exactly what the platform puts on screen, and where it refuses to answer.

The sheet, and the problem with it

Every well-sailed boat has a tuning sheet: wind speed down the side, settings across the top. Forestay, shroud turns, the target boat speed, the angle to sail, which headsail. It is the accumulated knowledge of the programme, and it is written at round numbers because a person has to be able to read it on a wet bulkhead.

The wind does not do round numbers. So the question the platform has to answer, continuously, all race, is: what does this sheet say at 8.7 knots?

1 Between two rows

For a number, the answer is a straight line between the rows either side of it:

f = ( tws − tws_lo ) / ( tws_hi − tws_lo ) value = value_lo + f · ( value_hi − value_lo )

Read as a sentence: how far between the two rows the wind is, is how far between the two settings the answer is.

At 8.7 knots, between a 6.30 at eight knots and a 6.55 at ten, that is 0.35 of the way up: a target of 6.39. Straightforward — and the interesting part is the two places it declines.

It clamps; it never extrapolates

Above the top of your sheet and below the bottom, the answer holds at the nearest row. It is never continued outward along the trend.

This is a deliberate refusal, and the reason is that a tuning sheet is not a model — it is a record of settings somebody tried. If the sheet stops at 24 knots, then 24 knots is the most breeze the programme has tuned for, and the correct answer at 30 is “the last thing we know worked,” not a number produced by running a line off the end of the evidence. Extrapolated rig settings are inventions, and an invention that arrives with two decimal places is a confident one.

A blank is a blank

If either of the two bracketing rows leaves that column empty, the answer is nothing rather than a number. Shims go “max in” above some wind speed and the column stops; interpolating across that gap would manufacture a value from a row that deliberately has none.

2 A cell may be a word

Target sheets are free-form because the sheet on the bulkhead is. Your columns are whatever your team calls them, and a cell may hold a word as easily as a number: A2, Max, 3.9-4.2.

A word cannot be averaged with the next word. So a word steps:

a word holds from its own row until the next row that carries a value in that column

Read as a sentence: the named setting stays named until the sheet names another one.

There is no halfway between the A2 and the A1.5, and a range a trimmer works within — 3.9-4.2 — is a range, not two numbers to average. Words are returned exactly as you typed them: never parsed, never rounded, never interpreted.

Below every row that carries a value, a word clamps up to the first one, the same convention the numeric path uses at the foot of the table. And a word reads as a blank on the numeric path — so between the last number in a column and the first word in it, the target is nothing rather than a number bent toward a word.

A word is never graded

A named sail has no deviation to measure. So a word target renders as the setting to use and carries no verdict at all.

This is the constraint that keeps a free-form sheet out of the analytics. There is no percentage by which you are off an A2. Inventing one — by parsing the digits out of a sail name, say — would put a number on screen that means nothing and would then be compared, ranked and trended by people who reasonably assumed it meant something.

3 Grading a number

When a column is compared against a live channel, the tile gets a tone. Three states, from percentage deviation:

deviation = | current − target | / | target | × 100 ≤ 5% ok ≤ 15% warn > 15% bad

Read as a sentence: within five percent of target is on the number; beyond fifteen wants attention.

The near-zero window

Percentages break down around zero. A rudder-angle target of 0.0° makes every deviation infinitely large, and a target of 0.2° makes a two-tenths error a hundred percent wrong. Neither describes a boat.

So below a target of half a unit, the same shape of judgement is applied in the channel’s own units instead:

when | target | < 0.5 | current − target | ≤ 0.30 ok ≤ 0.90 warn > 0.90 bad

Read as a sentence: near zero, ask how far off it is rather than by what proportion.

A tile with no target, or with no live value at the cursor, is not graded either. It shows what it has and says nothing about what it does not.

Upwind or downwind is decided from the true wind angle: inside 90° is upwind work, beyond it is downwind. When there is no wind angle at the cursor the panel holds the mode it had rather than flapping between sheets — and you can pin either mode by hand.

4 VMG percentage

Boat speed alone is not the whole story upwind: a boat sailing fast and low gets to the windward mark late. What matters is the component of speed toward where you are going, and what matters more is how that compares to what the boat should be doing.

VMG = boat speed × cos( true wind angle ) VMG target = target boat speed × cos( target wind angle ) VMG % = VMG / VMG target × 100

Read as a sentence: how much of the progress you should be making toward the mark are you actually making?

Both angles are taken as magnitudes — the sheet is written unsigned because a boat is symmetric, while the live channel is signed by tack — and both halves must be real numbers. If either the speed target or the angle target is a word or a blank, there is no percentage, and the platform shows none.

There is one guard worth naming because it is the kind of thing that produces a spectacular wrong answer rather than a small one. At a target wind angle of exactly 90°, the target VMG is zero — a boat making no progress toward the mark by definition — and dividing by it would yield a percentage in the billions. The platform answers nothinginstead.

5 Reading the polar

A tuning sheet is indexed by wind speed alone. A polar is indexed by wind speed and angle — a grid of target boat speeds — and it is what the percent-of-target readout on the player is measured against. Reading it means interpolating in two directions at once:

take the four grid points around ( tws , |twa| ) interpolate along the angle axis → two speeds interpolate between those along wind → one speed

Read as a sentence: find the square of the grid you are standing in and interpolate across it in both directions.

The same clamping rule applies at the edges of the grid, for the same reason. Real polars are also often ragged — a VPP run that skips the corners where nobody sails — so when a corner of the square is missing, the nearest populated point along the angle axis stands in rather than the lookup failing outright.

Where this runs

Interpolation lives in exactly one place per surface and is fixture-tested against the other: the same rules, the same clamping, the same treatment of words, on the web and on the tablet. Your target at 8.7 knots is the same number in the Race Control tuning tab as it is in the debrief that evening — and if it ever were not, that is a broken test rather than a discovery on the water.

Every column head in the targets editor carries a permanent chip saying whether it is compared against a live channel or is target-only, so a column your team calls bs can never quietly lose its comparison with nothing on screen admitting it.