ZanderNav uses vector triangle navigation to compute two related quantities for each leg.
The Course to Steer is the compass heading the helmsman sets — it points deliberately upstream into the tide.
The Speed Over Land is how fast the boat actually advances along the intended track.
Both are derived from the same vector triangle of boat speed, tide vector and intended track.
1. Course Over Land (COL)
The COL is the great-circle bearing from the departure waypoint to the destination waypoint. It describes the direction the boat actually moves across the chart, regardless of what the helmsman steers.
// Haversine great-circle bearing
Δλ = lon₂ − lon₁ (in radians)
y = sin(Δλ) · cos(lat₂)
x = cos(lat₁)·sin(lat₂) − sin(lat₁)·cos(lat₂)·cos(Δλ)
COL = atan2(y, x) (converted to 0–360°)
2. Tidal Stream Interpolation
Tide speed is linearly interpolated between the neap speed (at coefficient 45) and spring speed (at coefficient 95) using the day's tidal coefficient.
f = (coefficient − 45) / 50
tide_speed = neap_speed + f × (spring_speed − neap_speed)
// f = 0 at neap (coeff 45), f = 1 at spring (coeff 95)
3. Tide Vector Components
The tide vector is resolved into two components relative to the intended track (COL):
θ = tide_direction − COL (relative angle)
along = tide_speed · cos(θ) // + = with you, − = against you
cross = tide_speed · sin(θ) // + = pushes right, − = pushes left
4. Course to Steer (CTS)
If the tide pushes the boat sideways, the helmsman must aim the bow upstream to compensate. The correction angle is found by resolving the vector triangle: bow direction + tide vector = track direction.
correction = −arcsin( cross / engine_speed )
CTS = (COL + correction) mod 360
// Negative cross (tide from right) → positive correction → steer right of COL
// If |cross| ≥ engine_speed, tide overwhelms; CTS = COL (fallback)
5. Speed Over Land (SOL)
The boat's effective forward speed along the track. By steering CTS, the cross-tide component is neutralised; only the along-track component of the tide affects progress. The reduced engine contribution (engine must fight the cross-tide) combines with the along-track tide component:
SOL = √(engine_speed² − cross²) + along
// √(engine² − cross²) = engine contribution along the track
// + along = tide helping or hindering forward progress
// If |cross| ≥ engine_speed: SOL = max(0.1, along) (fallback)
6. Sailing Speed & Point of Sail
In sail mode the engine speed is replaced by boat speed through water, determined by the wind strength and the angle of the wind to the bow (point of sail). The no-go zone — within 55° of the headwind — returns zero boat speed; all other angles use the polar table below.
| Wind |
🚫 No-go <55° |
Close-hauled 55–65° |
Close reach 65–85° |
Beam reach 85–115° |
Broad reach 115–155° |
Run 155–180° |
| Calm 0–3 kn | 0 | 0.0 | 0.5 | 0.8 | 0.6 | 0.5 |
| F2 4–7 kn | 0 | 2.0 | 2.8 | 3.2 | 2.8 | 2.4 |
| F3 8–10 kn | 0 | 3.0 | 3.8 | 4.5 | 4.0 | 3.5 |
| F4 11–16 kn | 0 | 3.8 | 4.8 | 5.5 | 5.0 | 4.5 |
| F5 17–21 kn | 0 | 4.0 | 5.2 | 6.0 | 5.5 | 5.0 |
| F6+ ≥22 kn | 0 | 3.5 | 5.2 | 6.0 | 5.5 | 5.0 |
Values are boat speed through water in knots, calibrated against actual GPX tracks from Dell Quay Sailing Club dinghy events. Intermediate wind speeds are linearly interpolated between bands. The resulting boat speed feeds into the same SOL vector triangle as engine mode — tide still applies on top.
Upwind tacking
When a leg is within the no-go zone, ZanderNav simulates a tacking strategy: the boat alternates between the two close-hauled headings (wind ± 55°), bouncing off corridor walls, with a 10-second penalty per tack. The better of port-first or starboard-first is kept. VMG-aware logic suppresses tacks where one heading has negative progress toward the destination.
✦ Worked Example: West Pole → Dean Elbow
Departure waypoint
West Pole
50.7567°N, 0.9375°W
Destination waypoint
Dean Elbow
50.7292°N, 1.0306°W
Assumed conditions
Engine speed = 4.0 kn · Tidal coefficient = 70 (moderate)
Tidal stream at HW−2: neap 0.7 kn, spring 1.5 kn, direction 135° (SE)
Step 1 — Distance (Haversine)
Δlat = 50.7292 − 50.7567 = −0.0275°
Δlon = −1.0306 − (−0.9375) = −0.0931°
a = sin²(Δlat/2) + cos(50.7567°)·cos(50.7292°)·sin²(Δlon/2)
= sin²(−0.01375°) + 0.6321 × 0.6327 × sin²(−0.04655°)
= 0.0000057 + 0.3998 × 0.000000659 = 0.0000059
dist = 2 × 6371 × arcsin(√0.0000059) = 3.90 nm
↗ Verify with Google AI
Step 2 — Course Over Land
Δλ = −0.0931° = −0.001625 rad
y = sin(−0.001625) × cos(50.7292°) = −0.001625 × 0.6327 = −0.001028
x = cos(50.7567°)×sin(50.7292°) − sin(50.7567°)×cos(50.7292°)×cos(−0.001625)
= 0.6321×0.7746 − 0.7749×0.6327×0.9999 = 0.4895 − 0.4902 = −0.000701
COL = atan2(−0.001028, −0.000701) = 235° + 360° ≡ 245.0° (WSW)
↗ Verify with Google AI
Step 3 — Tidal Stream Interpolation
f = (70 − 45) / 50 = 0.50
tide_speed = 0.7 + 0.50 × (1.5 − 0.7) = 0.7 + 0.40 = 1.10 kn @ 135° (SE)
↗ Verify with Google AI
Step 4 — Tide Vector Components
θ = tide_dir − COL = 135° − 245° = −110°
along = 1.10 × cos(−110°) = 1.10 × (−0.342) = −0.376 kn (against track)
cross = 1.10 × sin(−110°) = 1.10 × (−0.940) = −1.034 kn (pushing left of track)
Step 5 — Course to Steer
|cross| = 1.034 < engine 4.0 ✓
correction = −arcsin(−1.034 / 4.0) = −arcsin(−0.2584) = +14.98°
(tide pushes left, so steer right: positive correction)
CTS = 245.0° + 14.98° = 260.0° (W)
→ Helmsman steers 260° to track 245° over ground
↗ Verify with Google AI
Step 6 — Speed Over Land
SOL = √(4.0² − (−1.034)²) + (−0.376)
= √(16.00 − 1.069) + (−0.376)
= √14.931 + (−0.376)
= 3.864 − 0.376 = 3.49 kn
Journey time = 3.90 nm ÷ 3.49 kn = 67 min
↗ Verify with Google AI
Result summary
Distance: 3.90 nm
COL (track): 245° WSW
CTS (steer): 260° W (+15° correction for tide)
Tide: 1.10 kn SE @ 135°
SOL: 3.49 kn
Journey time: 67 min
All calculations are performed in real time for every leg using the departure time, interpolated tidal coefficient, and the nearest tidal stream data point. Formulae match the vector triangle method used in the source spreadsheet (zandernav8.xlsm Plan sheet, columns AN–BC).