Enter at least three known values (sides and angles) to solve for the unknown sides and angles of a triangle. Ensure sides are positive and angles are between 0 and 180 degrees. Angles should be in degrees.
Enter known values and click Calculate.
Understanding Triangle Solving
Solving a triangle means determining the lengths of its three sides and the measures of its three angles when some of these values are already known. There are specific cases (known as congruence postulates) that guarantee a unique triangle can be formed, allowing us to calculate the remaining properties. These cases are:
SSS (Side-Side-Side): If all three sides are known.
SAS (Side-Angle-Side): If two sides and the included angle (the angle between them) are known.
ASA (Angle-Side-Angle): If two angles and the included side are known.
AAS (Angle-Angle-Side): If two angles and a non-included side are known.
SSA (Side-Side-Angle) – Ambiguous Case: If two sides and a non-included angle are known. This case can sometimes result in zero, one, or two possible triangles, and requires careful handling. This calculator aims to provide solutions for the well-defined cases.
Mathematical Principles Used:
The calculations rely on fundamental trigonometric laws:
Law of Sines: For any triangle with sides a, b, c and opposite angles A, B, C respectively:
a / sin(A) = b / sin(B) = c / sin(C)
Sum of Angles: The sum of the interior angles of any triangle is always 180 degrees.
A + B + C = 180°
How This Calculator Works:
This calculator attempts to solve the triangle based on the input you provide. It checks for valid input combinations and applies the appropriate trigonometric laws (Law of Sines, Law of Cosines) or simple angle subtraction to find the missing sides and angles. It prioritizes solving cases with three sides (SSS), two sides and an included angle (SAS), or two angles and a side (ASA/AAS).
Note: The calculator might not be able to solve all possible combinations, especially ambiguous cases (SSA) where multiple solutions exist or no solution is possible. Always ensure your inputs define a valid and unique triangle.
Example: If you know all three sides (e.g., side a=3, side b=4, side c=5), you can use the Law of Cosines to find the angles. If you know two sides and an angle opposite one of them (SSA), the calculator will attempt to find a solution but might indicate ambiguity if present.
function solveTriangle() {
var a = parseFloat(document.getElementById('sideA').value);
var b = parseFloat(document.getElementById('sideB').value);
var c = 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 resultDiv = document.getElementById('result');
resultDiv.innerHTML = 'Enter known values and click Calculate.'; // Reset result
var knownValues = [];
if (!isNaN(a) && a > 0) knownValues.push('a');
if (!isNaN(b) && b > 0) knownValues.push('b');
if (!isNaN(c) && c > 0) knownValues.push('c');
if (!isNaN(angleA_deg) && angleA_deg > 0 && angleA_deg 0 && angleB_deg 0 && angleC_deg < 180) knownValues.push('C');
if (knownValues.length ['a', 'b', 'c'].includes(val))) {
if (a + b > c && a + c > b && b + c > a) { // Triangle inequality theorem
calculatedAngleA_rad = Math.acos((b*b + c*c – a*a) / (2*b*c));
calculatedAngleB_rad = Math.acos((a*a + c*c – b*b) / (2*a*c));
calculatedAngleC_rad = Math.PI – calculatedAngleA_rad – calculatedAngleB_rad;
} else {
errors.push("The provided side lengths do not form a valid triangle (Triangle Inequality Theorem violation).");
}
}
// Case 2: SAS (2 sides, 1 included angle)
else if (knownValues.length === 3 && knownValues.sort().join(") === 'ASa' || knownValues.sort().join(") === 'ASb' || knownValues.sort().join(") === 'ASc') {
if (knownValues.includes('a') && knownValues.includes('b') && knownValues.includes('C')) {
calculatedC = Math.sqrt(a*a + b*b – 2*a*b*Math.cos(angleC_rad));
calculatedAngleA_rad = Math.acos((b*b + calculatedC*calculatedC – a*a) / (2*b*calculatedC));
calculatedAngleB_rad = Math.PI – angleC_rad – calculatedAngleA_rad;
} else if (knownValues.includes('a') && knownValues.includes('c') && knownValues.includes('B')) {
calculatedB = Math.sqrt(a*a + c*c – 2*a*c*Math.cos(angleB_rad));
calculatedAngleA_rad = Math.acos((calculatedB*calculatedB + c*c – a*a) / (2*calculatedB*c));
calculatedAngleC_rad = Math.PI – angleB_rad – calculatedAngleA_rad;
} else if (knownValues.includes('b') && knownValues.includes('c') && knownValues.includes('A')) {
calculatedA = Math.sqrt(b*b + c*c – 2*b*c*Math.cos(angleA_rad));
calculatedAngleB_rad = Math.acos((calculatedA*calculatedA + c*c – b*b) / (2*calculatedA*c));
calculatedAngleC_rad = Math.PI – angleA_rad – calculatedAngleB_rad;
}
}
// Case 3: ASA (2 angles, 1 included side)
else if (knownValues.length === 3 && knownValues.sort().join(") === 'AAS') {
if (knownValues.includes('A') && knownValues.includes('B') && knownValues.includes('c')) {
calculatedAngleC_rad = Math.PI – angleA_rad – angleB_rad;
calculatedC = calculatedC; // side c is known
calculatedA = (calculatedC * Math.sin(angleA_rad)) / Math.sin(calculatedAngleC_rad);
calculatedB = (calculatedC * Math.sin(angleB_rad)) / Math.sin(calculatedAngleC_rad);
} else if (knownValues.includes('A') && knownValues.includes('C') && knownValues.includes('b')) {
calculatedAngleB_rad = Math.PI – angleA_rad – angleC_rad;
calculatedB = calculatedB; // side b is known
calculatedA = (calculatedB * Math.sin(angleA_rad)) / Math.sin(calculatedAngleB_rad);
calculatedC = (calculatedB * Math.sin(calculatedAngleC_rad)) / Math.sin(calculatedAngleB_rad);
} else if (knownValues.includes('B') && knownValues.includes('C') && knownValues.includes('a')) {
calculatedAngleA_rad = Math.PI – angleB_rad – angleC_rad;
calculatedA = calculatedA; // side a is known
calculatedB = (calculatedA * Math.sin(angleB_rad)) / Math.sin(calculatedAngleA_rad);
calculatedC = (calculatedA * Math.sin(calculatedAngleC_rad)) / Math.sin(calculatedAngleA_rad);
}
}
// Case 4: AAS (2 angles, 1 non-included side) – Handled by Law of Sines after finding the third angle
else if (knownValues.length === 3 && (knownValues.includes('A') && knownValues.includes('B') && knownValues.includes('a')) ||
(knownValues.includes('A') && knownValues.includes('B') && knownValues.includes('b')) ||
(knownValues.includes('A') && knownValues.includes('C') && knownValues.includes('a')) ||
(knownValues.includes('A') && knownValues.includes('C') && knownValues.includes('c')) ||
(knownValues.includes('B') && knownValues.includes('C') && knownValues.includes('b')) ||
(knownValues.includes('B') && knownValues.includes('C') && knownValues.includes('c'))) {
if (knownValues.includes('A') && knownValues.includes('B') && knownValues.includes('a')) {
calculatedAngleC_rad = Math.PI – angleA_rad – angleB_rad;
calculatedC = (a * Math.sin(calculatedAngleC_rad)) / Math.sin(angleA_rad);
calculatedB = (a * Math.sin(angleB_rad)) / Math.sin(angleA_rad);
} else if (knownValues.includes('A') && knownValues.includes('B') && knownValues.includes('b')) {
calculatedAngleC_rad = Math.PI – angleA_rad – angleB_rad;
calculatedC = (b * Math.sin(calculatedAngleC_rad)) / Math.sin(angleB_rad);
calculatedA = (b * Math.sin(angleA_rad)) / Math.sin(angleB_rad);
} else if (knownValues.includes('A') && knownValues.includes('C') && knownValues.includes('a')) {
calculatedAngleB_rad = Math.PI – angleA_rad – angleC_rad;
calculatedB = (a * Math.sin(calculatedAngleB_rad)) / Math.sin(angleA_rad);
calculatedC = (a * Math.sin(calculatedAngleC_rad)) / Math.sin(angleA_rad);
} else if (knownValues.includes('A') && knownValues.includes('C') && knownValues.includes('c')) {
calculatedAngleB_rad = Math.PI – angleA_rad – angleC_rad;
calculatedB = (c * Math.sin(calculatedAngleB_rad)) / Math.sin(calculatedAngleC_rad);
calculatedA = (c * Math.sin(angleA_rad)) / Math.sin(calculatedAngleC_rad);
} else if (knownValues.includes('B') && knownValues.includes('C') && knownValues.includes('b')) {
calculatedAngleA_rad = Math.PI – angleB_rad – angleC_rad;
calculatedA = (b * Math.sin(calculatedAngleA_rad)) / Math.sin(angleB_rad);
calculatedC = (b * Math.sin(calculatedAngleC_rad)) / Math.sin(angleB_rad);
} else if (knownValues.includes('B') && knownValues.includes('C') && knownValues.includes('c')) {
calculatedAngleA_rad = Math.PI – angleB_rad – angleC_rad;
calculatedA = (c * Math.sin(calculatedAngleA_rad)) / Math.sin(calculatedAngleC_rad);
calculatedB = (c * Math.sin(angleB_rad)) / Math.sin(calculatedAngleC_rad);
}
}
// Case 5: SSA (2 sides, 1 non-included angle) – Ambiguous case, simplified handling
else if (knownValues.length === 3 && knownValues.sort().join(") === 'ASa' || knownValues.sort().join(") === 'ASb' || knownValues.sort().join(") === 'ASc') {
// This case requires more complex logic to handle 0, 1, or 2 solutions.
// For this simplified calculator, we'll attempt one solution if possible using Law of Sines.
// A more robust calculator would iterate through possibilities.
if (knownValues.includes('a') && knownValues.includes('b') && knownValues.includes('A')) {
var sinB = (b * Math.sin(angleA_rad)) / a;
if (sinB > 1 || sinB 0 && angleC2_rad