Horizontal Curve Calculator
This horizontal curve elements calculator finds three core dimensions of a simple circular roadway, railway, or surveying curve from its radius and central deflection angle.
Run — free
Enter the radius in any length unit and the angle in decimal degrees to obtain tangent length, arc length, and external distance. Every returned length uses the same unit as the radius, which makes the result easy to apply to feet, metres, or another consistent project unit without a separate conversion step.
Understanding the three calculated curve elements
A simple circular horizontal curve joins two straight tangents with an arc of constant radius. The tangent length is the distance from the point of intersection of the tangents to either tangent point, measured along the straight alignment. The curve length is the distance travelled along the circular arc between those tangent points. The external distance is measured from the tangent intersection toward the midpoint of the curve and shows how far the arc lies outside the intersection-to-center relationship. Together, these values support preliminary alignment layout, stationing checks, right-of-way studies, and independent verification of design worksheets. This calculator assumes that the supplied deflection angle is the central angle of the simple curve, which is also the change in tangent direction for the standard geometry. It does not design transition spirals, compound curves, reverse curves, superelevation, sight distance, or speed criteria. Those require additional inputs and engineering judgment. Keep the radius and every downstream distance in one consistent unit so that the numerical results retain a clear physical meaning.
How the formulas use radius and deflection angle
The calculator converts the deflection angle from degrees to radians before evaluating the geometry. Tangent length is computed as the radius multiplied by the tangent of one-half the deflection angle. Arc length is the radius multiplied by the full angle in radians, which is equivalent to multiplying radius, pi, and the angle in degrees, then dividing by 180. External distance is the radius multiplied by the secant of one-half the angle minus one. These are exact relationships for a simple circular curve when the radius is measured to the curve centerline. The angle must be greater than zero and less than 180 degrees because the limiting values either collapse the curve or make the tangent and external-distance expressions singular. The implementation uses deterministic floating-point arithmetic and reports stable numeric results suitable for calculations and software workflows. For construction documents, round only after considering the precision of the survey control, the selected units, applicable standards, and the tolerances required by the project rather than assuming that every displayed digit is field accuracy.
Using and checking the results in practice
Start with a radius and deflection angle taken from the same alignment definition. If the radius is entered in metres, tangent length, curve length, and external distance are all returned in metres; if it is entered in feet, all three are returned in feet. A useful reasonableness check is that curve length should increase directly with either radius or angle. For angles below 180 degrees, tangent length should be positive, and the external distance should also be positive. Small angles produce a comparatively shallow offset, while angles approaching 180 degrees make tangent length and external distance grow rapidly. When comparing the answer with a plan set, confirm that the plan uses a simple centerline curve and the same definition of deflection angle. Some transport standards describe curves through degree of curve, chord definitions, or station equations, which need conversion before these formulas apply. Use the output as a transparent geometry calculation, then have a qualified professional review any safety-critical alignment, staking plan, or final design decision under the governing road, rail, and surveying requirements.
What you can do with it
Check a roadway alignment worksheet
Recalculate the tangent, arc, and external dimensions from the stated radius and intersection angle before carrying values into a design table.
Prepare a preliminary survey layout
Estimate the principal distances of a proposed simple circular curve while testing alternative radii during early alignment work.
Verify classroom or field calculations
Compare manually derived curve elements with a deterministic result and identify unit, angle, or formula-entry mistakes.
FAQ
What angle should I enter?
Enter the central deflection angle of the simple circular curve in decimal degrees. For standard simple-curve geometry, it equals the change in direction between the two tangents.
Which unit does the calculator use?
You may use any consistent length unit for radius. Tangent length, curve length, and external distance are returned in that same unit.
What formulas are used?
The calculator uses T = R tan(Δ/2), L = πRΔ/180 when Δ is in degrees, and E = R(sec(Δ/2) − 1).
Can I enter an angle of 180 degrees?
No. The angle must be greater than zero and less than 180 degrees because the tangent and external-distance formulas become singular at 180 degrees.
Does this calculate spiral or compound curves?
No. It covers one simple circular curve with a constant radius. Spiral transitions, compound curves, reverse curves, and stationing adjustments require additional geometry.
What does an API calculation cost?
Each API request costs $0.002. The browser calculator is available without an API request.
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/eng/horizontal-curve-elements \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"radius":500,"deflection_angle_degrees":60}'const res = await fetch("https://api.kit.forhosting.com/eng/horizontal-curve-elements", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"radius": 500,
"deflection_angle_degrees": 60
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/eng/horizontal-curve-elements",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"radius": 500,
"deflection_angle_degrees": 60
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/eng/horizontal-curve-elements", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"radius":500,"deflection_angle_degrees":60}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"radius":500,"deflection_angle_degrees":60}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/eng/horizontal-curve-elements", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"radius": 500,
"deflection_angle_degrees": 60
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "eng.horizontal_curve_elements",
"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. |