Enter two known angles and one known side of a triangle. The calculator will determine the remaining angles and sides.
Understanding Triangle Angles and Sides
Triangles are fundamental geometric shapes with three sides and three interior angles. The sum of the interior angles of any Euclidean triangle always equals 180 degrees. This property, along with trigonometric laws, allows us to calculate unknown angles and sides if we have sufficient information about the triangle.
Triangle Types and Angle Properties:
Acute Triangle: All three angles are less than 90 degrees.
Right Triangle: One angle is exactly 90 degrees. The sides are related by the Pythagorean theorem (a² + b² = c²).
Obtuse Triangle: One angle is greater than 90 degrees.
Equilateral Triangle: All three sides are equal, and all three angles are 60 degrees.
Isosceles Triangle: Two sides are equal, and the angles opposite those sides are also equal.
Key Laws for Solving Triangles:
When you don't have a right triangle, you rely on the Law of Sines and the Law of Cosines:
Law of Sines:
This law relates the length of a side of a triangle to the sine of its opposite angle. For a triangle with sides a, b, c and opposite angles A, B, C:
a / sin(A) = b / sin(B) = c / sin(C) = 2R
Where R is the radius of the circumcircle of the triangle.
The Law of Sines is particularly useful when you know:
Two angles and one side (AAS or ASA).
Two sides and an angle opposite one of them (SSA – be aware of the ambiguous case here, where two solutions might exist).
Law of Cosines:
This law generalizes the Pythagorean theorem. It relates the length of a side to the cosine of its opposite angle:
c² = a² + b² - 2ab * cos(C)
Similarly:
a² = b² + c² - 2bc * cos(A)
b² = a² + c² - 2ac * cos(B)
The Law of Cosines is useful when you know:
Three sides (SSS).
Two sides and the included angle (SAS).
How This Calculator Works:
This calculator is designed to solve for unknown angles and sides given a minimum of three pieces of information (angle-angle-side, side-angle-side, side-side-side). It prioritizes using the Law of Sines when possible due to its simplicity for certain configurations.
If two angles are given: The third angle is easily found by subtracting the sum of the two given angles from 180°. Then, the Law of Sines can be used to find the remaining sides if at least one side is known.
If sides are given and angles are needed: The Law of Cosines is typically used to find the angles.
Input Validation: The calculator checks for valid numeric inputs and ensures that the sum of known angles does not exceed 180°. It also handles cases where inputs might lead to impossible triangles.
Use Cases:
Surveying and Navigation: Calculating distances and positions using triangulation.
Engineering and Architecture: Designing structures, calculating forces, and determining dimensions.
Physics: Analyzing vectors, projectile motion, and wave phenomena.
Mathematics Education: Helping students understand and apply trigonometric principles.
function calculateTriangleAngles() {
var angleA = parseFloat(document.getElementById("angleA").value);
var angleB = parseFloat(document.getElementById("angleB").value);
var angleC = parseFloat(document.getElementById("angleC").value);
var sideA = parseFloat(document.getElementById("sideA").value);
var sideB = parseFloat(document.getElementById("sideB").value);
var sideC = parseFloat(document.getElementById("sideC").value);
var resultDiv = document.getElementById("result");
var output = "";
// Helper function to check if a value is a valid number
function isValidNumber(value) {
return typeof value === 'number' && !isNaN(value) && value >= 0;
}
// Store knowns
var knownAngles = [];
var knownSides = [];
var inputs = {
angleA: angleA, angleB: angleB, angleC: angleC,
sideA: sideA, sideB: sideB, sideC: sideC
};
for (var key in inputs) {
if (isValidNumber(inputs[key])) {
if (key.startsWith("angle")) knownAngles.push({ name: key, value: inputs[key] });
if (key.startsWith("side")) knownSides.push({ name: key, value: inputs[key] });
}
}
// Basic validation: At least 3 pieces of info, and not all angles or all sides
if ((knownAngles.length + knownSides.length) 2 && knownSides.length 2 && knownAngles.length = 180) {
resultDiv.innerHTML = "Error: Sum of known angles exceeds 180 degrees.";
return;
}
if (calculatedAngles.angleA === null && calculatedAngles.angleB !== null && calculatedAngles.angleC !== null) {
calculatedAngles.angleA = 180 – calculatedAngles.angleB – calculatedAngles.angleC;
} else if (calculatedAngles.angleB === null && calculatedAngles.angleA !== null && calculatedAngles.angleC !== null) {
calculatedAngles.angleB = 180 – calculatedAngles.angleA – calculatedAngles.angleC;
} else if (calculatedAngles.angleC === null && calculatedAngles.angleA !== null && calculatedAngles.angleB !== null) {
calculatedAngles.angleC = 180 – calculatedAngles.angleA – calculatedAngles.angleB;
}
// Ensure all angles are positive after calculation
for (var key in calculatedAngles) {
if (calculatedAngles[key] !== null && calculatedAngles[key] 0) baseRatio = calculatedSides.sideA / Math.sin(calculatedAngles.angleA * Math.PI / 180);
else if (calculatedSides.sideB !== null && calculatedAngles.angleB !== null && calculatedAngles.angleB > 0) baseRatio = calculatedSides.sideB / Math.sin(calculatedAngles.angleB * Math.PI / 180);
else if (calculatedSides.sideC !== null && calculatedAngles.angleC !== null && calculatedAngles.angleC > 0) baseRatio = calculatedSides.sideC / Math.sin(calculatedAngles.angleC * Math.PI / 180);
// Calculate missing sides using the base ratio from Law of Sines
if (baseRatio !== null) {
if (calculatedSides.sideA === null && calculatedAngles.angleA !== null && calculatedAngles.angleA > 0) calculatedSides.sideA = baseRatio * Math.sin(calculatedAngles.angleA * Math.PI / 180);
if (calculatedSides.sideB === null && calculatedAngles.angleB !== null && calculatedAngles.angleB > 0) calculatedSides.sideB = baseRatio * Math.sin(calculatedAngles.angleB * Math.PI / 180);
if (calculatedSides.sideC === null && calculatedAngles.angleC !== null && calculatedAngles.angleC > 0) calculatedSides.sideC = baseRatio * Math.sin(calculatedAngles.angleC * Math.PI / 180);
}
// Try to use Law of Cosines if we have SSS or SAS and need angles
if (knownSides.length === 3 && knownAngles.length === 0) { // SSS case
if (isValidNumber(sideA) && isValidNumber(sideB) && isValidNumber(sideC)) {
var cosA = (sideB * sideB + sideC * sideC – sideA * sideA) / (2 * sideB * sideC);
if (cosA >= -1 && cosA = -1 && cosB = 0) {
if (missingSideName === 'sideA') calculatedSides.sideA = Math.sqrt(squaredMissingSide);
else if (missingSideName === 'sideB') calculatedSides.sideB = Math.sqrt(squaredMissingSide);
else if (missingSideName === 'sideC') calculatedSides.sideC = Math.sqrt(squaredMissingSide);
// Now calculate the other two angles using Law of Sines
var baseRatio = null;
if (calculatedSides.sideA !== null && calculatedAngles.angleA !== null && calculatedAngles.angleA > 0) baseRatio = calculatedSides.sideA / Math.sin(calculatedAngles.angleA * Math.PI / 180);
else if (calculatedSides.sideB !== null && calculatedAngles.angleB !== null && calculatedAngles.angleB > 0) baseRatio = calculatedSides.sideB / Math.sin(calculatedAngles.angleB * Math.PI / 180);
else if (calculatedSides.sideC !== null && calculatedAngles.angleC !== null && calculatedAngles.angleC > 0) baseRatio = calculatedSides.sideC / Math.sin(calculatedAngles.angleC * Math.PI / 180);
if (baseRatio !== null) {
if (calculatedSides.sideA === null && calculatedAngles.angleA !== null && calculatedAngles.angleA > 0) calculatedSides.sideA = baseRatio * Math.sin(calculatedAngles.angleA * Math.PI / 180);
if (calculatedSides.sideB === null && calculatedAngles.angleB !== null && calculatedAngles.angleB > 0) calculatedSides.sideB = baseRatio * Math.sin(calculatedAngles.angleB * Math.PI / 180);
if (calculatedSides.sideC === null && calculatedAngles.angleC !== null && calculatedAngles.angleC > 0) calculatedSides.sideC = baseRatio * Math.sin(calculatedAngles.angleC * Math.PI / 180);
}
// Recalculate angles based on new sides if needed
if (calculatedAngles.angleA === null && calculatedSides.sideA !== null && calculatedSides.sideB !== null && calculatedSides.sideC !== null) {
var cosA = (calculatedSides.sideB * calculatedSides.sideB + calculatedSides.sideC * calculatedSides.sideC – calculatedSides.sideA * calculatedSides.sideA) / (2 * calculatedSides.sideB * calculatedSides.sideC);
if (cosA >= -1 && cosA = -1 && cosB = -1 && cosC <= 1) calculatedAngles.angleC = Math.acos(cosC) * 180 / Math.PI;
}
}
}
}
// Final Check: Ensure all calculated values are valid numbers and angles sum to ~180
var finalAngleSum = 0;
var hasErrors = false;
output += "
Calculated Results:
";
output += "
";
// Angles
if (calculatedAngles.angleA !== null) {
if (calculatedAngles.angleA > 0 && calculatedAngles.angleA <= 180) {
output += "
"; }
// Sides
if (calculatedSides.sideA !== null) {
if (calculatedSides.sideA > 0) output += "
Side Opposite A: " + calculatedSides.sideA.toFixed(3) + "
";
else { output += "
Side Opposite A: Invalid Calculation
"; hasErrors = true; }
} else { output += "
Side Opposite A: Not Calculated
"; }
if (calculatedSides.sideB !== null) {
if (calculatedSides.sideB > 0) output += "
Side Opposite B: " + calculatedSides.sideB.toFixed(3) + "
";
else { output += "
Side Opposite B: Invalid Calculation
"; hasErrors = true; }
} else { output += "
Side Opposite B: Not Calculated
"; }
if (calculatedSides.sideC !== null) {
if (calculatedSides.sideC > 0) output += "
Side Opposite C: " + calculatedSides.sideC.toFixed(3) + "
";
else { output += "
Side Opposite C: Invalid Calculation
"; hasErrors = true; }
} else { output += "
Side Opposite C: Not Calculated
"; }
output += "
";
if (!hasErrors) {
// Check if all required values were calculated
var missingValues = 0;
if (calculatedAngles.angleA === null || calculatedAngles.angleA 180) missingValues++;
if (calculatedAngles.angleB === null || calculatedAngles.angleB 180) missingValues++;
if (calculatedAngles.angleC === null || calculatedAngles.angleC 180) missingValues++;
if (calculatedSides.sideA === null || calculatedSides.sideA <= 0) missingValues++;
if (calculatedSides.sideB === null || calculatedSides.sideB <= 0) missingValues++;
if (calculatedSides.sideC === null || calculatedSides.sideC 0) {
resultDiv.innerHTML = "Error: Could not solve for all values. Ensure you have provided sufficient and consistent information for a valid triangle.";
} else if (Math.abs(finalAngleSum – 180) > 0.1) { // Allow for small floating point inaccuracies
resultDiv.innerHTML = "Warning: Calculated angles sum to " + finalAngleSum.toFixed(2) + "°, which deviates slightly from 180°. This may indicate floating-point inaccuracies or an impossible triangle configuration.";
} else {
resultDiv.innerHTML = output;
}
} else {
resultDiv.innerHTML = "Error during calculation. Please check your inputs.";
}
}