Velocity made good to waypoint
At 8 knots on a course of 45° toward a mark bearing 30°, you close on it at 7.727407 knots. Enter speed, course and bearing in the same frame and see how much of your speed actually brings the waypoint nearer. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Speed
- 8
- Course deg
- 45
- Bearing deg
- 30
- Angle diff deg
- 15
- Angle diff rad
- 0.261799
- Cos factor
- 0.965926
- Vmg
- 7.727407
Velocity made good toward a waypoint is the component of your speed that actually reduces the remaining distance to a destination mark. Sailors, powerboat navigators, race officers, and routing engines care about VMG because a faster course that points away from the mark can lose ground, while a slightly slower course aimed closer to the bearing often wins. This velocity made good to waypoint calculator accepts vessel speed over ground, the vessel course or heading in degrees, and the bearing from the vessel to the waypoint, then projects the speed vector onto that bearing with a pure cosine: VMG equals speed times cosine of the course-minus-bearing difference. Positive VMG means you are closing on the mark; negative means you are opening away.
What velocity made good means and how the projection works
In classical navigation and yacht racing, velocity made good (VMG) toward a waypoint is the length of the vessel’s velocity vector when it is projected onto the great-circle or rhumb-line direction of the mark you care about. If your course over ground matches the bearing to the waypoint exactly, every unit of speed becomes VMG and the cosine factor is one.
If you sail or motor at a relative angle of sixty degrees off the mark bearing, cosine of sixty degrees is one half, so VMG is half your speed even though the knotmeter or SOG reading looks fine. At ninety degrees off the mark you make zero progress toward it; beyond ninety degrees the cosine is negative and VMG becomes an opening rate—you are increasing distance to the waypoint at that rate.
You bring the speed, the course (or COG/heading in the same angular frame as the bearing), and the destination bearing from your plotter, AIS app, or great-circle calculator. The angular difference is folded into the open-closed interval from negative one hundred eighty to positive one hundred eighty degrees so that a three-hundred-fifty-degree course and a ten-degree bearing correctly yield a twenty-degree relative angle rather than a misleading three-hundred-forty-degree gap. That normalization keeps cosines continuous around north and matches how skippers talk about “twenty degrees high of the mark.”
Where VMG-to-waypoint earns its keep and how pricing works
Race-tracking apps use velocity made good to waypoint to rank legs to the next mark without requiring full polar diagrams when SOG and mark bearing are already known. Coastal powerboat and ferry systems can post periodic SOG, COG, and destination bearing to show a closing rate on ETA panels when distance-based ETA alone is noisy. Routing notebooks that already computed a bearing with a separate great-circle call can chain this pure projection instead of re-implementing cosine edge cases around north.
Content sites targeting the search phrase velocity made good to waypoint calculator get a live free tool whose numbers match the automation path byte-for-byte. Failed validation does not consume balance.
What you can do with it
Yacht racing mark legs
Feed SOG, course, and bearing to the next mark into the VMG calculator to compare candidate headings and see which one closes faster on the buoy.
Navigation training and simulators
Give students a deterministic velocity-made-good oracle so answers for closing versus opening courses match the same cosine definition used in production apps.
ETA and bridge dashboards
Project vessel speed onto the destination bearing to display a live closing rate beside distance-based ETA when COG wanders off the rhumb or great-circle track.
FAQ
How is velocity made good to a waypoint calculated?
VMG equals speed times the cosine of the difference between your course and the bearing to the waypoint. Positive values mean you are closing on the mark; negative values mean you are opening away.
What does a negative VMG mean?
Negative VMG means your course has more than ninety degrees of relative angle to the mark bearing, so the projection opens distance to the waypoint at |VMG| in the same unit as speed.
Does this compute bearing from latitude and longitude?
No. You supply the bearing (and course and speed). Pair this tool with a separate bearing or great-circle capacity if you start from two coordinates.
Why does sailing 60° off the mark give only half my speed toward it?
Because the cosine of 60° is one half, and VMG is speed times the cosine of the angle between course and bearing. At 90° off the mark you make no progress toward it at all.
How are a course and a bearing on either side of north compared?
The difference is folded into the range from -180° to 180°, so a course of 350° and a bearing of 10° give a 20° angle rather than a misleading 340° gap.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/geo/vmg-to-waypoint \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"speed":8,"course_deg":45,"bearing_deg":30}'const res = await fetch("https://api.kit.forhosting.com/geo/vmg-to-waypoint", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"speed": 8,
"course_deg": 45,
"bearing_deg": 30
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/vmg-to-waypoint",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"speed": 8,
"course_deg": 45,
"bearing_deg": 30
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/vmg-to-waypoint", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"speed":8,"course_deg":45,"bearing_deg":30}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"speed":8,"course_deg":45,"bearing_deg":30}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/vmg-to-waypoint", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"speed": 8,
"course_deg": 45,
"bearing_deg": 30
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.vmg_to_waypoint",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
What velocity made good means and how the projection works
This endpoint implements that textbook definition with a single cosine of the normalized course-minus-bearing difference: it does not recompute a bearing from two lat/lon pairs, and it does not fetch wind or current.
Input contract, response fields, and error behaviour
Course and bearing may sit outside zero to three hundred sixty; only their difference matters, and it is normalized before the cosine. POST a JSON body with three required finite numbers: speed (aliases sog, vessel_speed, v, speed_over_ground), course_deg (aliases course, heading, cog, course_degrees, track_deg), and bearing_deg (aliases bearing, waypoint_bearing, destination_bearing, bearing_to_waypoint, target_bearing). Speed must be non-negative; units are yours—knots, metres per second, miles per hour, or kilometres per hour—because the projection is unitless and every speed-like output reuses the same unit, labelled same_as_speed. On success the response echoes speed, course_deg, and bearing_deg for audit trails; angle_diff_deg and angle_diff_rad for the signed relative angle; cos_factor as the pure cosine of that angle; vmg as the signed projection; vmg_abs as its magnitude; efficiency as vmg over speed (or zero when speed is zero); closing as the string closing, opening, or neither; the unit marker; and the formula string. Floating fields that need cross-runtime stability are rounded to six decimal places so browser widgets, goldens, and API logs agree. Missing fields, non-finite strings, empty objects, or negative speed fail with invalid_input and are never billed.
Where VMG-to-waypoint earns its keep and how pricing works
Training simulators and sailing-school dashboards quiz students on whether a heading change improved VMG, using this endpoint as the deterministic oracle.
Technical questions
What inputs does the VMG calculator need?
Three finite numbers: speed (non-negative, any consistent unit), course_deg (vessel course or heading), and bearing_deg (bearing from the vessel to the waypoint in the same angular frame).
What does the velocity made good calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.