Enter known values to solve for unknown sides and angles of a triangle.
Side A:–
Side B:–
Side C:–
Angle A:–
Angle B:–
Angle C:–
Area:–
Perimeter:–
Understanding the Triangle Solver Calculator
A triangle is a fundamental geometric shape defined by three sides and three angles. The sum of the interior angles of any triangle is always 180 degrees. Solving a triangle means determining the lengths of all three sides and the measures of all three angles, given a sufficient set of initial information.
When Can You Solve a Triangle?
To uniquely determine a triangle, you typically need at least three pieces of information, with at least one being a side. Common scenarios for solving a triangle include:
Side-Side-Side (SSS): Given the lengths of all three sides.
Side-Angle-Side (SAS): Given two sides and the angle between them.
Angle-Side-Angle (ASA): Given two angles and the side between them.
Angle-Angle-Side (AAS): Given two angles and a non-included side.
Side-Side-Angle (SSA): Given two sides and a non-included angle. This case can sometimes result in two possible triangles (ambiguous case) or no triangle at all.
Mathematical Principles Used:
This calculator employs several key trigonometric principles:
Law of Sines: States that the ratio of the length of a side of a triangle to the sine of the angle opposite that side is the same for all three sides and angles. Mathematically: a/sin(A) = b/sin(B) = c/sin(C).
Law of Cosines: Relates the lengths of the sides of a triangle to the cosine of one of its angles. It's particularly useful for SSS and SAS cases. Mathematically: c² = a² + b² - 2ab*cos(C) (and its permutations for other sides/angles).
Angle Sum Property: As mentioned, the sum of the interior angles is always 180 degrees: A + B + C = 180°.
Area Formulas: The area of a triangle can be calculated using various formulas, including Heron's formula (for SSS) and Area = 1/2 * base * height, or Area = 1/2 * ab * sin(C) (for SAS).
Perimeter: The perimeter is simply the sum of the lengths of all three sides: Perimeter = a + b + c.
How to Use This Calculator:
Input as many known values as possible into the fields. The calculator will attempt to solve for the remaining unknown sides and angles. Ensure you input a valid set of givens (e.g., at least one side must be provided for most calculations, and the Law of Sines/Cosines must be applicable).
Note: This calculator primarily handles cases solvable by the Law of Sines and Cosines, aiming to find all six triangle properties (three sides, three angles) and its area/perimeter where possible with sufficient input. It may not explicitly handle all edge cases of the SSA ambiguous case due to the complexity of returning two solutions.
Example Usage:
Let's say you have a triangle with Side A = 10, Side B = 12, and Angle C = 70 degrees (SAS case).
Enter 10 in the "Side A Length" field.
Enter 12 in the "Side B Length" field.
Enter 70 in the "Angle C (degrees)" field.
Leave other fields blank or as 0.
Click "Calculate Triangle".
The calculator will then use the Law of Cosines to find Side C, and then the Law of Sines to find Angles A and B, and finally calculate the Area and Perimeter.
function calculateTriangle() {
var sideA = parseFloat(document.getElementById("sideA").value);
var sideB = parseFloat(document.getElementById("sideB").value);
var sideC = parseFloat(document.getElementById("sideC").value);
var angleA_deg = parseFloat(document.getElementById("angleA").value);
var angleB_deg = parseFloat(document.getElementById("angleB").value);
var angleC_deg = parseFloat(document.getElementById("angleC").value);
var angleA_rad = angleA_deg !== undefined && !isNaN(angleA_deg) ? angleA_deg * Math.PI / 180 : undefined;
var angleB_rad = angleB_deg !== undefined && !isNaN(angleB_deg) ? angleB_deg * Math.PI / 180 : undefined;
var angleC_rad = angleC_deg !== undefined && !isNaN(angleC_deg) ? angleC_deg * Math.PI / 180 : undefined;
var resultSideA = sideA !== undefined && !isNaN(sideA) ? sideA : undefined;
var resultSideB = sideB !== undefined && !isNaN(sideB) ? sideB : undefined;
var resultSideC = sideC !== undefined && !isNaN(sideC) ? sideC : undefined;
var resultAngleA_deg = angleA_deg !== undefined && !isNaN(angleA_deg) ? angleA_deg : undefined;
var resultAngleB_deg = angleB_deg !== undefined && !isNaN(angleB_deg) ? angleB_deg : undefined;
var resultAngleC_deg = angleC_deg !== undefined && !isNaN(angleC_deg) ? angleC_deg : undefined;
var area = undefined;
var perimeter = undefined;
// Helper function to check if all angles sum to 180 (within tolerance)
function checkAngleSum(a, b, c) {
if (a !== undefined && b !== undefined && c !== undefined) {
return Math.abs(a + b + c – 180) c && a + c > b && b + c > a;
}
return true;
}
// — Calculation Logic —
// Prioritize calculations based on common knowns (SSS, SAS, ASA, AAS)
// Case 1: SSS (Side-Side-Side)
if (resultSideA !== undefined && resultSideB !== undefined && resultSideC !== undefined) {
if (!checkTriangleInequality(resultSideA, resultSideB, resultSideC)) {
alert("Error: The given side lengths do not form a valid triangle (Triangle Inequality Theorem violated).");
return;
}
// Calculate angles using Law of Cosines
var cosA = (resultSideB * resultSideB + resultSideC * resultSideC – resultSideA * resultSideA) / (2 * resultSideB * resultSideC);
var cosB = (resultSideA * resultSideA + resultSideC * resultSideC – resultSideB * resultSideB) / (2 * resultSideA * resultSideC);
var cosC = (resultSideA * resultSideA + resultSideB * resultSideB – resultSideC * resultSideC) / (2 * resultSideA * resultSideB);
resultAngleA_rad = Math.acos(Math.max(-1, Math.min(1, cosA))); // Clamp due to floating point issues
resultAngleB_rad = Math.acos(Math.max(-1, Math.min(1, cosB)));
resultAngleC_rad = Math.acos(Math.max(-1, Math.min(1, cosC)));
resultAngleA_deg = resultAngleA_rad * 180 / Math.PI;
resultAngleB_deg = resultAngleB_rad * 180 / Math.PI;
resultAngleC_deg = resultAngleC_rad * 180 / Math.PI;
}
// Case 2: SAS (Side-Angle-Side)
else if (resultSideA !== undefined && resultSideB !== undefined && resultAngleC_deg !== undefined) {
resultAngleC_rad = resultAngleC_deg * Math.PI / 180;
resultSideC = Math.sqrt(resultSideA * resultSideA + resultSideB * resultSideB – 2 * resultSideA * resultSideB * Math.cos(resultAngleC_rad));
// Calculate remaining angles using Law of Sines
var sinA = resultSideA * Math.sin(resultAngleC_rad) / resultSideC;
resultAngleA_rad = Math.asin(Math.max(-1, Math.min(1, sinA)));
resultAngleB_rad = Math.PI – resultAngleC_rad – resultAngleA_rad; // Third angle from sum
resultAngleA_deg = resultAngleA_rad * 180 / Math.PI;
resultAngleB_deg = resultAngleB_rad * 180 / Math.PI;
}
else if (resultSideB !== undefined && resultSideC !== undefined && resultAngleA_deg !== undefined) {
resultAngleA_rad = angleA_deg * Math.PI / 180;
resultSideA = Math.sqrt(resultSideB * resultSideB + resultSideC * resultSideC – 2 * resultSideB * resultSideC * Math.cos(resultAngleA_rad));
var sinB = resultSideB * Math.sin(resultAngleA_rad) / resultSideA;
resultAngleB_rad = Math.asin(Math.max(-1, Math.min(1, sinB)));
resultAngleC_rad = Math.PI – resultAngleA_rad – resultAngleB_rad;
resultAngleB_deg = resultAngleB_rad * 180 / Math.PI;
resultAngleC_deg = resultAngleC_rad * 180 / Math.PI;
}
else if (resultSideA !== undefined && resultSideC !== undefined && resultAngleB_deg !== undefined) {
resultAngleB_rad = angleB_deg * Math.PI / 180;
resultSideB = Math.sqrt(resultSideA * resultSideA + resultSideC * resultSideC – 2 * resultSideA * resultSideC * Math.cos(resultAngleB_rad));
var sinA = resultSideA * Math.sin(resultAngleB_rad) / resultSideB;
resultAngleA_rad = Math.asin(Math.max(-1, Math.min(1, sinA)));
resultAngleC_rad = Math.PI – resultAngleA_rad – resultAngleB_rad;
resultAngleA_deg = resultAngleA_rad * 180 / Math.PI;
resultAngleC_deg = resultAngleC_rad * 180 / Math.PI;
}
// Case 3: ASA (Angle-Side-Angle)
else if (resultAngleA_deg !== undefined && resultAngleB_deg !== undefined && resultSideC !== undefined) {
resultAngleA_rad = angleA_deg * Math.PI / 180;
resultAngleB_rad = angleB_deg * Math.PI / 180;
resultAngleC_deg = 180 – angleA_deg – angleB_deg;
resultAngleC_rad = resultAngleC_deg * Math.PI / 180;
resultSideA = resultSideC * Math.sin(resultAngleA_rad) / Math.sin(resultAngleC_rad);
resultSideB = resultSideC * Math.sin(resultAngleB_rad) / Math.sin(resultAngleC_rad);
}
else if (resultAngleA_deg !== undefined && resultAngleC_deg !== undefined && resultSideB !== undefined) {
resultAngleA_rad = angleA_deg * Math.PI / 180;
resultAngleC_rad = angleC_deg * Math.PI / 180;
resultAngleB_deg = 180 – angleA_deg – angleC_deg;
resultAngleB_rad = resultAngleB_deg * Math.PI / 180;
resultSideA = resultSideB * Math.sin(resultAngleA_rad) / Math.sin(resultAngleB_rad);
resultSideC = resultSideB * Math.sin(resultAngleC_rad) / Math.sin(resultAngleB_rad);
}
else if (resultAngleB_deg !== undefined && resultAngleC_deg !== undefined && resultSideA !== undefined) {
resultAngleB_rad = angleB_deg * Math.PI / 180;
resultAngleC_rad = angleC_deg * Math.PI / 180;
resultAngleA_deg = 180 – angleB_deg – angleC_deg;
resultAngleA_rad = resultAngleA_deg * Math.PI / 180;
resultSideB = resultSideA * Math.sin(resultAngleB_rad) / Math.sin(resultAngleA_rad);
resultSideC = resultSideA * Math.sin(resultAngleC_rad) / Math.sin(resultAngleA_rad);
}
// Case 4: AAS (Angle-Angle-Side)
else if (resultAngleA_deg !== undefined && resultAngleB_deg !== undefined && resultSideA !== undefined) {
resultAngleA_rad = angleA_deg * Math.PI / 180;
resultAngleB_rad = angleB_deg * Math.PI / 180;
resultAngleC_deg = 180 – angleA_deg – angleB_deg;
resultAngleC_rad = resultAngleC_deg * Math.PI / 180;
resultSideB = resultSideA * Math.sin(resultAngleB_rad) / Math.sin(resultAngleA_rad);
resultSideC = resultSideA * Math.sin(resultAngleC_rad) / Math.sin(resultAngleA_rad);
}
else if (resultAngleA_deg !== undefined && resultAngleC_deg !== undefined && resultSideA !== undefined) {
resultAngleA_rad = angleA_deg * Math.PI / 180;
resultAngleC_rad = angleC_deg * Math.PI / 180;
resultAngleB_deg = 180 – angleA_deg – angleC_deg;
resultAngleB_rad = resultAngleB_deg * Math.PI / 180;
resultSideB = resultSideA * Math.sin(resultAngleB_rad) / Math.sin(resultAngleA_rad);
resultSideC = resultSideA * Math.sin(resultAngleC_rad) / Math.sin(resultAngleA_rad);
}
else if (resultAngleB_deg !== undefined && resultAngleC_deg !== undefined && resultSideB !== undefined) {
resultAngleB_rad = angleB_deg * Math.PI / 180;
resultAngleC_rad = angleC_deg * Math.PI / 180;
resultAngleA_deg = 180 – angleB_deg – angleC_deg;
resultAngleA_rad = resultAngleA_deg * Math.PI / 180;
resultSideA = resultSideB * Math.sin(resultAngleA_rad) / Math.sin(resultAngleB_rad);
resultSideC = resultSideB * Math.sin(resultAngleC_rad) / Math.sin(resultAngleB_rad);
}
// Case 5: SSA (Side-Side-Angle) – Simplified handling, assumes one valid solution
else if (resultSideA !== undefined && resultSideB !== undefined && resultAngleA_deg !== undefined) {
resultAngleA_rad = angleA_deg * Math.PI / 180;
var sinB = resultSideB * Math.sin(resultAngleA_rad) / resultSideA;
// Check for ambiguous case or no solution
if (Math.abs(sinB) > 1) {
alert("Error: No triangle possible with these values (Side-Side-Angle).");
return;
}
resultAngleB_rad = Math.asin(sinB);
var angleB2_rad = Math.PI – resultAngleB_rad; // Possible second angle B
// Using the first solution for B
resultAngleB_deg = resultAngleB_rad * 180 / Math.PI;
resultAngleC_deg = 180 – angleA_deg – resultAngleB_deg;
resultAngleC_rad = resultAngleC_deg * Math.PI / 180;
resultSideC = resultSideA * Math.sin(resultAngleC_rad) / Math.sin(resultAngleA_rad);
}
else if (resultSideA !== undefined && resultSideC !== undefined && resultAngleA_deg !== undefined) {
resultAngleA_rad = angleA_deg * Math.PI / 180;
var sinC = resultSideC * Math.sin(resultAngleA_rad) / resultSideA;
if (Math.abs(sinC) > 1) {
alert("Error: No triangle possible with these values (Side-Side-Angle).");
return;
}
resultAngleC_rad = Math.asin(sinC);
var angleC2_rad = Math.PI – resultAngleC_rad;
resultAngleC_deg = resultAngleC_rad * 180 / Math.PI;
resultAngleB_deg = 180 – angleA_deg – resultAngleC_deg;
resultAngleB_rad = resultAngleB_deg * Math.PI / 180;
resultSideB = resultSideA * Math.sin(resultAngleB_rad) / Math.sin(resultAngleA_rad);
}
else if (resultSideB !== undefined && resultSideA !== undefined && resultAngleB_deg !== undefined) {
resultAngleB_rad = angleB_deg * Math.PI / 180;
var sinA = resultSideA * Math.sin(resultAngleB_rad) / resultSideB;
if (Math.abs(sinA) > 1) {
alert("Error: No triangle possible with these values (Side-Side-Angle).");
return;
}
resultAngleA_rad = Math.asin(sinA);
var angleA2_rad = Math.PI – resultAngleA_rad;
resultAngleA_deg = resultAngleA_rad * 180 / Math.PI;
resultAngleC_deg = 180 – resultAngleA_deg – angleB_deg;
resultAngleC_rad = resultAngleC_deg * Math.PI / 180;
resultSideC = resultSideB * Math.sin(resultAngleC_rad) / Math.sin(resultAngleB_rad);
}
else if (resultSideB !== undefined && resultSideC !== undefined && resultAngleB_deg !== undefined) {
resultAngleB_rad = angleB_deg * Math.PI / 180;
var sinC = resultSideC * Math.sin(resultAngleB_rad) / resultSideB;
if (Math.abs(sinC) > 1) {
alert("Error: No triangle possible with these values (Side-Side-Angle).");
return;
}
resultAngleC_rad = Math.asin(sinC);
var angleC2_rad = Math.PI – resultAngleC_rad;
resultAngleC_deg = resultAngleC_rad * 180 / Math.PI;
resultAngleA_deg = 180 – angleB_deg – resultAngleC_deg;
resultAngleA_rad = resultAngleA_deg * Math.PI / 180;
resultSideA = resultSideB * Math.sin(resultAngleA_rad) / Math.sin(resultAngleB_rad);
}
else if (resultSideC !== undefined && resultSideA !== undefined && resultAngleC_deg !== undefined) {
resultAngleC_rad = angleC_deg * Math.PI / 180;
var sinA = resultSideA * Math.sin(resultAngleC_rad) / resultSideC;
if (Math.abs(sinA) > 1) {
alert("Error: No triangle possible with these values (Side-Side-Angle).");
return;
}
resultAngleA_rad = Math.asin(sinA);
var angleA2_rad = Math.PI – resultAngleA_rad;
resultAngleA_deg = resultAngleA_rad * 180 / Math.PI;
resultAngleB_deg = 180 – resultAngleA_deg – angleC_deg;
resultAngleB_rad = resultAngleB_deg * Math.PI / 180;
resultSideB = resultSideC * Math.sin(resultAngleB_rad) / Math.sin(resultAngleC_rad);
}
else if (resultSideC !== undefined && resultSideB !== undefined && resultAngleC_deg !== undefined) {
resultAngleC_rad = angleC_deg * Math.PI / 180;
var sinB = resultSideB * Math.sin(resultAngleC_rad) / resultSideC;
if (Math.abs(sinB) > 1) {
alert("Error: No triangle possible with these values (Side-Side-Angle).");
return;
}
resultAngleB_rad = Math.asin(sinB);
var angleB2_rad = Math.PI – resultAngleB_rad;
resultAngleB_deg = resultAngleB_rad * 180 / Math.PI;
resultAngleA_deg = 180 – angleB_deg – resultAngleC_deg;
resultAngleA_rad = resultAngleA_deg * Math.PI / 180;
resultSideA = resultSideC * Math.sin(resultAngleA_rad) / Math.sin(resultAngleC_rad);
}
// Ensure all angles sum to 180 after calculations if multiple angles were derived
if (resultAngleA_deg !== undefined && resultAngleB_deg !== undefined && resultAngleC_deg !== undefined) {
if (!checkAngleSum(resultAngleA_deg, resultAngleB_deg, resultAngleC_deg)) {
// Try to correct the third angle if only two were calculated precisely
if (resultAngleA_deg !== undefined && resultAngleB_deg !== undefined && resultAngleC_deg === undefined) {
resultAngleC_deg = 180 – resultAngleA_deg – resultAngleB_deg;
} else if (resultAngleA_deg !== undefined && resultAngleC_deg !== undefined && resultAngleB_deg === undefined) {
resultAngleB_deg = 180 – resultAngleA_deg – resultAngleC_deg;
} else if (resultAngleB_deg !== undefined && resultAngleC_deg !== undefined && resultAngleA_deg === undefined) {
resultAngleA_deg = 180 – resultAngleB_deg – resultAngleC_deg;
}
}
}
// Calculate Area and Perimeter if enough info is available
if (resultSideA !== undefined && resultSideB !== undefined && resultAngleC_rad !== undefined && !isNaN(resultAngleC_rad)) {
area = 0.5 * resultSideA * resultSideB * Math.sin(resultAngleC_rad);
} else if (resultSideA !== undefined && resultSideB !== undefined && resultSideC !== undefined) {
// Heron's formula
var s = (resultSideA + resultSideB + resultSideC) / 2;
area = Math.sqrt(s * (s – resultSideA) * (s – resultSideB) * (s – resultSideC));
}
// Fallback for area if one side and two angles are known
else if (resultSideA !== undefined && resultAngleB_rad !== undefined && resultAngleC_rad !== undefined) {
area = 0.5 * resultSideA * resultSideA * Math.sin(resultAngleB_rad) * Math.sin(resultAngleC_rad) / Math.sin(resultAngleA_rad);
}
if (resultSideA !== undefined && resultSideB !== undefined && resultSideC !== undefined) {
perimeter = resultSideA + resultSideB + resultSideC;
}
// Display Results (formatted to 2 decimal places where appropriate)
document.getElementById("resultSideA").textContent = resultSideA !== undefined && !isNaN(resultSideA) ? resultSideA.toFixed(2) : "-";
document.getElementById("resultSideB").textContent = resultSideB !== undefined && !isNaN(resultSideB) ? resultSideB.toFixed(2) : "-";
document.getElementById("resultSideC").textContent = resultSideC !== undefined && !isNaN(resultSideC) ? resultSideC.toFixed(2) : "-";
document.getElementById("resultAngleA").textContent = resultAngleA_deg !== undefined && !isNaN(resultAngleA_deg) ? resultAngleA_deg.toFixed(2) + "°" : "-";
document.getElementById("resultAngleB").textContent = resultAngleB_deg !== undefined && !isNaN(resultAngleB_deg) ? resultAngleB_deg.toFixed(2) + "°" : "-";
document.getElementById("resultAngleC").textContent = resultAngleC_deg !== undefined && !isNaN(resultAngleC_deg) ? resultAngleC_deg.toFixed(2) + "°" : "-";
document.getElementById("resultArea").textContent = area !== undefined && !isNaN(area) ? area.toFixed(2) : "-";
document.getElementById("resultPerimeter").textContent = perimeter !== undefined && !isNaN(perimeter) ? perimeter.toFixed(2) : "-";
}