Resultant course with current calculator
A vessel rarely travels over the ground exactly along its heading when water is moving beneath it.
Run — free
This resultant course with current calculator combines the vessel's velocity through the water with the current vector and reports the actual course over ground and ground speed. Enter the vessel heading, its speed through the water, the direction toward which the current flows, and the current speed. The calculator resolves both motions into east and north components, adds them, and converts the combined vector back into a nautical bearing and speed. It is useful for navigation exercises, passage estimates, training, simulations, and reproducible API calculations.
Enter headings and speeds with a consistent convention
Treat every direction as a compass bearing measured clockwise from true north: zero degrees is north, ninety is east, one hundred eighty is south, and two hundred seventy is west. The vessel heading describes the direction the bow and through-water velocity point. The current direction must describe where the water flows toward, not where it comes from. That distinction matters because some marine forecasts name a current by its destination while other sources may describe its origin. Convert any source convention before entering the value. Supply vessel speed and current speed in the same unit, such as knots, kilometres per hour, metres per second, or miles per hour. The calculator does not need to know the unit because vector addition preserves it, but mixing knots and metres per second produces a meaningless result. Directions outside the usual range are normalized, so minus ten degrees and three hundred fifty degrees represent the same bearing. Speeds must be non-negative finite values. True headings produce a true course; magnetic headings require consistently magnetic current directions or a separate variation correction.
Understand the vector addition behind the answer
The calculation uses an east-north coordinate system. For a speed v at compass bearing theta, the east component is v times sine theta and the north component is v times cosine theta. This ordering differs from the familiar classroom formula where angles start at the positive x-axis, because nautical bearings start at north and increase clockwise. The vessel components and current components are added independently. The length of that combined vector, found with the Pythagorean theorem, is ground speed. Its direction is recovered with a two-argument inverse tangent using east and north, then normalized into the interval from zero up to but not including three hundred sixty degrees. The response includes the vessel, current, and ground vectors so you can audit signs and reproduce the work. It also returns the course and speed rounded to ten decimal places for stable automation. If equal opposing vectors cancel exactly, ground speed is zero and course has no physical meaning, so the request is rejected instead of inventing a northward bearing for a stationary vessel.
Use the result within the limits of the model
The returned course is an instantaneous course over ground for two constant planar velocity vectors. It is a clean answer for chart-work exercises, short time intervals, simulator inputs, and first-pass passage planning. It does not account for changing tidal streams, wind-driven leeway, steering error, magnetic variation, waves, acceleration, latitude-dependent chart geometry, or obstacles. For a real passage, divide the route into suitable time and location segments, obtain current forecasts for each segment, and recalculate as conditions change. Remember that this calculator answers the forward problem: given a heading through the water, what course over ground results? The inverse problem—choosing a heading that will achieve a desired ground track—requires solving for a correction angle and can be impossible when the cross-current exceeds available boat speed. Keep source data and units beside any saved result, since a number without its bearing convention is easy to misuse. The browser tool uses the same deterministic core as the API. Automated calculations cost $0.002 per successful item, making the output suitable for repeatable lessons, logs, and lightweight navigation software tests.
What you can do with it
Check a navigation exercise
Verify a hand-drawn velocity triangle and compare the calculated course over ground with the plotted answer.
Estimate a short passage
Combine a planned heading and through-water speed with a representative current vector for an initial travel estimate.
Build simulator fixtures
Generate deterministic ground vectors for marine training software, unit tests, or educational visualizations.
FAQ
What does current direction mean?
It is the bearing toward which the current flows. Reverse a source value if that source instead states where the current comes from.
Which speed units can I use?
Any speed unit works, provided vessel_speed and current_speed use the same unit. The returned ground_speed uses that unit.
Are bearings true or magnetic?
The arithmetic works with either, but every direction must use one consistent reference. Use true bearings for true course output.
Why can a request have no resultant course?
Equal vectors in exactly opposite directions create zero ground speed. A zero vector has no direction, so the calculator rejects it.
How much does an API calculation cost?
Each successful API item costs $0.002. The on-page browser calculator uses the same deterministic calculation.
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/trig/resultant-course-current \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"heading_degrees":90,"vessel_speed":10,"current_direction_degrees":180,"current_speed":3}'const res = await fetch("https://api.kit.forhosting.com/trig/resultant-course-current", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"heading_degrees": 90,
"vessel_speed": 10,
"current_direction_degrees": 180,
"current_speed": 3
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/trig/resultant-course-current",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"heading_degrees": 90,
"vessel_speed": 10,
"current_direction_degrees": 180,
"current_speed": 3
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/trig/resultant-course-current", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"heading_degrees":90,"vessel_speed":10,"current_direction_degrees":180,"current_speed":3}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"heading_degrees":90,"vessel_speed":10,"current_direction_degrees":180,"current_speed":3}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/trig/resultant-course-current", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"heading_degrees": 90,
"vessel_speed": 10,
"current_direction_degrees": 180,
"current_speed": 3
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "trig.resultant_course_current",
"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. |