SSA triangle calculator
Two sides and an angle that is not between them can give two different triangles: with a of 10, b of 16 and A of 30°, the third side is 19.8564064606 or 7.8564064606. The calculator counts the solutions and completes each one. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- A
- 10
- The other given side
- 16
- A
- 30
- Quantity
- 2
- Case
- acute_A_ambiguous_two
- A unit
- deg
- Height
- 8
The SSA triangle calculator solves the ambiguous case of two sides and a non-included angle with the law of sines. You supply side a opposite angle A and the other side b; the engine computes sin(B) equals b times sin(A) over a, then classifies how many triangles exist. Acute angle A can produce zero, one, or two solutions depending on the altitude h equals b times sin(A): when h is less than a and a is less than b you get the classic two-triangle ambiguity, when a equals h you get a right triangle at B, and when a is at least b you get a single triangle. Right or obtuse A admits at most one triangle, and only when a is strictly longer than b. Results are deterministic floating-point trigonometry with no random sampling and no network call.
What SSA means and what you get back
SSA means you know two sides and an angle that is not the included angle between those sides: specifically side a opposite angle A, plus another side b. That configuration is notorious in school trigonometry because the law of sines produces an equation for sin(B), and the inverse sine has two candidates in the range from zero to one hundred eighty degrees whenever the angle is acute and the opposite side is long enough but still shorter than the adjacent side.
This calculator exists to make that classification explicit instead of leaving you with a single arcsin result and a question mark. The response includes the normalized inputs a, b, and A in degrees, the altitude height h equals b times sin(A), the intermediate sin(B), a short case label describing which branch of the SSA decision tree was used, a count of solutions, and an array of triangle objects. The contract is intentionally strict.
If you need SAS, ASA, AAS, or SSS as primary modes, use those dedicated tools; the search intent here is the ambiguous SSA case and the clear answer of one triangle, two triangles, or an honest error.
Where SSA solving fits in study, surveying, and code
Students meet the ambiguous case when a textbook gives an angle, the opposite side, and another side, then asks how many triangles are possible and what the missing measures are. Teachers can pre-generate answer keys that list both solutions when they exist and refuse impossible inputs instead of printing a NaN angle.
Surveying and navigation sketches often start from a measured angle at one station and two distances that do not sandwich that angle, which is exactly SSA; knowing whether a second configuration is geometrically possible avoids laying out the wrong second station. Developers call the same contract from scripts to seed deterministic test vectors for geometry libraries, to illustrate law-of-sines branches in teaching tools, or to satisfy programming-challenge statements that demand every valid completion of an SSA triple.
What you can do with it
Homework and exam preparation
Resolve textbook SSA problems that may have zero, one, or two triangles, and check both angle and side completions when the case is ambiguous.
Surveying and layout checks
Given a station angle and two distances, see whether a second triangle configuration is possible before committing a field layout.
FAQ
What does the SSA triangle calculator cost?
It is free in your browser on this page.
When are there two triangles?
When angle A is acute and the opposite side a satisfies h < a < b, where h = b·sin(A). Both B = arcsin(b·sin(A)/a) and B′ = 180° − B can complete a triangle.
Are angles in degrees or radians?
Degrees by default. All angles in the response are reported in degrees.
Does this solve SAS or SSS?
No. This tool is dedicated to the SSA ambiguous case (side a opposite angle A, plus side b). Other congruence modes are out of scope here.
What happens when side a is shorter than the height?
Then side a cannot reach the third side and no triangle exists, so the calculator says so instead of giving an empty answer. With A of 30° and b of 16, the height is 8, so side a must be at least 8.
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/geom/triangle-ssa \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"a":10,"b":16,"A":30}'const res = await fetch("https://api.kit.forhosting.com/geom/triangle-ssa", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"a": 10,
"b": 16,
"A": 30
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geom/triangle-ssa",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"a": 10,
"b": 16,
"A": 30
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geom/triangle-ssa", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"a":10,"b":16,"A":30}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"a":10,"b":16,"A":30}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geom/triangle-ssa", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"a": 10,
"b": 16,
"A": 30
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geom.triangle_ssa",
"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
Inputs that cannot form a triangle are rejected with invalid_input rather than a silent empty list, so automation and grading pipelines fail loudly.
What SSA means and what the response contains
Each triangle lists all three sides a, b, c and all three angles A, B, C in degrees, plus a boolean right_triangle flag when any angle is ninety degrees within floating-point tolerance. Missing sides, non-positive lengths, angles outside the open interval from zero to one hundred eighty degrees, and combinations that cannot close a triangle all raise invalid_input with a message that names the failing condition.
How a, b, and A are read and how the ambiguous case is decided
Computation converts A to radians, evaluates sin(A), and forms height h equals b times sin(A) and sin(B) equals b times sin(A) over a. When A is obtuse or right, the only admissible branch is a strictly greater than b, yielding a single acute B from arcsin and C equals one hundred eighty minus A minus B. When A is acute, the engine compares a to h: if a is shorter than h there is no triangle; if a equals h within tolerance there is one right triangle with B at ninety degrees; if h is less than a and a is less than b there are two candidates B and one hundred eighty minus B, each completed if C remains positive; if a is at least b there is exactly one triangle. Side c is recovered from the law of sines as a times sin(C) over sin(A). The preferred fields are a, b, and A as JSON numbers, but decimal strings are accepted for form and spreadsheet callers. Aliases side_a and opposite map to a; side_b and adjacent map to b; angle, angle_a, and alpha map to A. By default A is in degrees; set angle_unit to rad or radians when you pass a value in radians. Pair the free browser run on this page with the priced API when you need the identical mathematical result inside an automated pipeline without re-implementing the case table yourself.
Where SSA solving fits in study, surveying, and code
CAD and game-tooling teams use short SSA checks when a constraint solver exposes two sides and a free angle and must report whether zero, one, or two rigid figures satisfy the constraint—on this page the no-triangle outcome is an error so callers can branch on invalid_input rather than on an empty array if they prefer fail-fast validation. On this page the work runs entirely in your browser; through the API each successful lookup costs $0.002, failed validation is not charged, and nothing is stored after the response returns. That split—free interactive exploration and a priced, identical API—matches the rest of the KIT tier-A catalog and lets you move from a classroom demo to an automated pipeline without changing the mathematical result. Pair it with unit converters when sides arrive in mixed units, with other free math endpoints when you need series or combinatorial companions for a lab of deterministic tools, and with documentation that shows students both drawings of the ambiguous case so the numbers and the picture stay aligned.
Integration use cases
Deterministic geometry fixtures
Generate reproducible one- and two-solution SSA cases for unit tests, contest validators, and CI assertions without hand-rolled trigonometry.
Technical questions
What happens if no triangle exists?
The handler returns invalid_input with a message that explains the failing branch (for example a < h when A is acute, or a ≤ b when A is obtuse or right).