Please enter at least two corresponding sides from each triangle to find missing sides.
Understanding Similar Triangles
Similar triangles are triangles that have the same shape but not necessarily the same size. This means their corresponding angles are equal, and the ratios of their corresponding sides are equal. This property is fundamental in geometry and has numerous applications in fields like architecture, engineering, surveying, and even computer graphics.
If two triangles, say Triangle ABC and Triangle DEF, are similar, then:
Angle A = Angle D, Angle B = Angle E, Angle C = Angle F
The ratio of corresponding sides is constant: AB/DE = BC/EF = AC/DF = k, where k is the scale factor.
How the Calculator Works
This calculator helps you determine the lengths of missing sides in similar triangles. For triangles to be considered similar, you need to know either:
All three corresponding angles are equal (AAA similarity).
All three corresponding sides are proportional (SSS similarity).
Two corresponding sides are proportional, and the included angle is equal (SAS similarity).
This calculator primarily uses the SSS similarity principle. If you provide at least two pairs of corresponding sides (e.g., side A1 and A2, side B1 and B2), it can calculate the missing side(s) of the second triangle based on the known sides of the first triangle and the established ratio.
The core logic relies on finding the scale factor (ratio) between the known corresponding sides. For example, if you input sideA1 = 10 and sideA2 = 5, the scale factor for side A is sideA2 / sideA1 = 5 / 10 = 0.5. If the triangles are similar, this ratio should hold for all corresponding sides.
If you know sideA1, sideB1, sideA2, and sideB2, the calculation proceeds as follows:
Calculate the ratio for side A: ratioA = sideA2 / sideA1.
Calculate the ratio for side B: ratioB = sideB2 / sideB1.
If ratioA is approximately equal to ratioB, then we can assume similarity and use this ratio to find a missing side. If a side (e.g., sideC2) is missing, it can be calculated as: sideC2 = sideC1 * ratioA (or ratioB, as they should be equal).
If only one pair of corresponding sides is provided (e.g., sideA1 and sideA2), and one other side from Triangle 1 (e.g. sideB1) and two sides from Triangle 2 (e.g. sideB2 and sideC2) are provided, we can calculate the remaining side (sideC1) using the ratio: sideC1 = sideB1 * (sideC2 / sideB2).
Use Cases
Architecture & Engineering: Scaling down blueprints or models to full size.
Surveying: Calculating inaccessible distances (e.g., height of a building or width of a river) using shadows or other reference points.
Art & Design: Ensuring proportional resizing of images or elements.
Cartography: Understanding map scales and real-world distances.
Note: This calculator assumes that the sides entered as "corresponding" (e.g., Side A1 and Side A2) are indeed proportional. It's crucial to ensure the correct sides are matched based on the geometric properties of the triangles.
function calculateSimilarTriangle() {
var sideA1 = parseFloat(document.getElementById("sideA1").value);
var sideB1 = parseFloat(document.getElementById("sideB1").value);
var sideC1 = parseFloat(document.getElementById("sideC1").value);
var sideA2 = parseFloat(document.getElementById("sideA2").value);
var sideB2 = parseFloat(document.getElementById("sideB2").value);
var sideC2 = parseFloat(document.getElementById("sideC2").value);
var resultDiv = document.getElementById("result");
var results = [];
var hasError = false;
// Helper to check if a value is a valid positive number
function isValidNumber(num) {
return typeof num === 'number' && !isNaN(num) && num > 0;
}
// — Calculation Logic —
// Case 1: Two pairs of sides known, calculate the third side of Triangle 2
if (isValidNumber(sideA1) && isValidNumber(sideB1) && isValidNumber(sideA2) && isValidNumber(sideB2) && !isValidNumber(sideC2) && isValidNumber(sideC1)) {
var ratioA = sideA2 / sideA1;
var ratioB = sideB2 / sideB1;
// Check for approximate equality of ratios due to potential floating point inaccuracies
if (Math.abs(ratioA – ratioB) < 0.00001) {
var calculatedSideC2 = sideC1 * ratioA;
results.push("Using ratio (A'/A = B'/B = " + ratioA.toFixed(3) + "): Calculated Side C' = " + calculatedSideC2.toFixed(3));
} else {
results.push("Error: Ratios of provided sides (A'/A = " + ratioA.toFixed(3) + ", B'/B = " + ratioB.toFixed(3) + ") are not equal. Triangles may not be similar with these correspondences.");
hasError = true;
}
} else if (isValidNumber(sideA1) && isValidNumber(sideC1) && isValidNumber(sideA2) && isValidNumber(sideC2) && !isValidNumber(sideB2) && isValidNumber(sideB1)) {
var ratioA = sideA2 / sideA1;
var ratioC = sideC2 / sideC1;
if (Math.abs(ratioA – ratioC) < 0.00001) {
var calculatedSideB2 = sideB1 * ratioA;
results.push("Using ratio (A'/A = C'/C = " + ratioA.toFixed(3) + "): Calculated Side B' = " + calculatedSideB2.toFixed(3));
} else {
results.push("Error: Ratios of provided sides (A'/A = " + ratioA.toFixed(3) + ", C'/C = " + ratioC.toFixed(3) + ") are not equal. Triangles may not be similar with these correspondences.");
hasError = true;
}
} else if (isValidNumber(sideB1) && isValidNumber(sideC1) && isValidNumber(sideB2) && isValidNumber(sideC2) && !isValidNumber(sideA2) && isValidNumber(sideA1)) {
var ratioB = sideB2 / sideB1;
var ratioC = sideC2 / sideC1;
if (Math.abs(ratioB – ratioC) < 0.00001) {
var calculatedSideA2 = sideA1 * ratioB;
results.push("Using ratio (B'/B = C'/C = " + ratioB.toFixed(3) + "): Calculated Side A' = " + calculatedSideA2.toFixed(3));
} else {
results.push("Error: Ratios of provided sides (B'/B = " + ratioB.toFixed(3) + ", C'/C = " + ratioC.toFixed(3) + ") are not equal. Triangles may not be similar with these correspondences.");
hasError = true;
}
}
// Case 2: One pair of sides known, calculate two sides of Triangle 2
else if (isValidNumber(sideA1) && isValidNumber(sideA2) && isValidNumber(sideB1) && !isValidNumber(sideB2) && !isValidNumber(sideC2) && isValidNumber(sideC1)) {
var ratioA = sideA2 / sideA1;
var calculatedSideB2 = sideB1 * ratioA;
var calculatedSideC2 = sideC1 * ratioA;
results.push("Using ratio (A'/A = " + ratioA.toFixed(3) + "): Calculated Side B' = " + calculatedSideB2.toFixed(3) + ", Calculated Side C' = " + calculatedSideC2.toFixed(3));
} else if (isValidNumber(sideA1) && isValidNumber(sideA2) && isValidNumber(sideC1) && !isValidNumber(sideC2) && !isValidNumber(sideB2) && isValidNumber(sideB1)) {
var ratioA = sideA2 / sideA1;
var calculatedSideC2 = sideC1 * ratioA;
var calculatedSideB2 = sideB1 * ratioA;
results.push("Using ratio (A'/A = " + ratioA.toFixed(3) + "): Calculated Side C' = " + calculatedSideC2.toFixed(3) + ", Calculated Side B' = " + calculatedSideB2.toFixed(3));
} else if (isValidNumber(sideB1) && isValidNumber(sideB2) && isValidNumber(sideA1) && !isValidNumber(sideA2) && !isValidNumber(sideC2) && isValidNumber(sideC1)) {
var ratioB = sideB2 / sideB1;
var calculatedSideA2 = sideA1 * ratioB;
var calculatedSideC2 = sideC1 * ratioB;
results.push("Using ratio (B'/B = " + ratioB.toFixed(3) + "): Calculated Side A' = " + calculatedSideA2.toFixed(3) + ", Calculated Side C' = " + calculatedSideC2.toFixed(3));
} else if (isValidNumber(sideB1) && isValidNumber(sideB2) && isValidNumber(sideC1) && !isValidNumber(sideC2) && !isValidNumber(sideA2) && isValidNumber(sideA1)) {
var ratioB = sideB2 / sideB1;
var calculatedSideC2 = sideC1 * ratioB;
var calculatedSideA2 = sideA1 * ratioB;
results.push("Using ratio (B'/B = " + ratioB.toFixed(3) + "): Calculated Side C' = " + calculatedSideC2.toFixed(3) + ", Calculated Side A' = " + calculatedSideA2.toFixed(3));
} else if (isValidNumber(sideC1) && isValidNumber(sideC2) && isValidNumber(sideA1) && !isValidNumber(sideA2) && !isValidNumber(sideB2) && isValidNumber(sideB1)) {
var ratioC = sideC2 / sideC1;
var calculatedSideA2 = sideA1 * ratioC;
var calculatedSideB2 = sideB1 * ratioC;
results.push("Using ratio (C'/C = " + ratioC.toFixed(3) + "): Calculated Side A' = " + calculatedSideA2.toFixed(3) + ", Calculated Side B' = " + calculatedSideB2.toFixed(3));
} else if (isValidNumber(sideC1) && isValidNumber(sideC2) && isValidNumber(sideB1) && !isValidNumber(sideB2) && !isValidNumber(sideA2) && isValidNumber(sideA1)) {
var ratioC = sideC2 / sideC1;
var calculatedSideB2 = sideB1 * ratioC;
var calculatedSideA2 = sideA1 * ratioC;
results.push("Using ratio (C'/C = " + ratioC.toFixed(3) + "): Calculated Side B' = " + calculatedSideB2.toFixed(3) + ", Calculated Side A' = " + calculatedSideA2.toFixed(3));
}
// Case 3: One pair of sides known, calculate one side of Triangle 2 (and implicitly infer the ratio)
// This covers cases where one side of Triangle 1 is missing but others are provided for Triangle 2
else if (isValidNumber(sideB1) && isValidNumber(sideB2) && isValidNumber(sideC1) && isValidNumber(sideC2) && !isValidNumber(sideA1) && isValidNumber(sideA2)) {
var ratioB = sideB2 / sideB1;
var ratioC = sideC2 / sideC1;
if (Math.abs(ratioB – ratioC) < 0.00001) {
var calculatedSideA1 = sideA2 / ratioB;
results.push("Using ratio (B'/B = C'/C = " + ratioB.toFixed(3) + "): Calculated Side A = " + calculatedSideA1.toFixed(3));
} else {
results.push("Error: Ratios of provided sides (B'/B = " + ratioB.toFixed(3) + ", C'/C = " + ratioC.toFixed(3) + ") are not equal. Triangles may not be similar with these correspondences.");
hasError = true;
}
} else if (isValidNumber(sideA1) && isValidNumber(sideA2) && isValidNumber(sideC1) && isValidNumber(sideC2) && !isValidNumber(sideB1) && isValidNumber(sideB2)) {
var ratioA = sideA2 / sideA1;
var ratioC = sideC2 / sideC1;
if (Math.abs(ratioA – ratioC) < 0.00001) {
var calculatedSideB1 = sideB2 / ratioA;
results.push("Using ratio (A'/A = C'/C = " + ratioA.toFixed(3) + "): Calculated Side B = " + calculatedSideB1.toFixed(3));
} else {
results.push("Error: Ratios of provided sides (A'/A = " + ratioA.toFixed(3) + ", C'/C = " + ratioC.toFixed(3) + ") are not equal. Triangles may not be similar with these correspondences.");
hasError = true;
}
} else if (isValidNumber(sideA1) && isValidNumber(sideA2) && isValidNumber(sideB1) && isValidNumber(sideB2) && !isValidNumber(sideC1) && isValidNumber(sideC2)) {
var ratioA = sideA2 / sideA1;
var ratioB = sideB2 / sideB1;
if (Math.abs(ratioA – ratioB) < 0.00001) {
var calculatedSideC1 = sideC2 / ratioA;
results.push("Using ratio (A'/A = B'/B = " + ratioA.toFixed(3) + "): Calculated Side C = " + calculatedSideC1.toFixed(3));
} else {
results.push("Error: Ratios of provided sides (A'/A = " + ratioA.toFixed(3) + ", B'/B = " + ratioB.toFixed(3) + ") are not equal. Triangles may not be similar with these correspondences.");
hasError = true;
}
}
// General Check: If not enough info or conflicting info
if (results.length === 0 && !hasError) {
var inputsProvided = [
isValidNumber(sideA1), isValidNumber(sideB1), isValidNumber(sideC1),
isValidNumber(sideA2), isValidNumber(sideB2), isValidNumber(sideC2)
].filter(Boolean).length;
if (inputsProvided < 3) { // Need at least 3 valid side lengths total, with at least one pair of corresponding sides
resultDiv.innerHTML = "Please enter at least three side lengths, including at least one pair of corresponding sides (e.g., Side A1 and Side A2) to calculate missing sides.";
} else {
// This case might occur if all sides are provided but don't form similar triangles
// Or if exactly 3 sides are provided but they are all from one triangle
resultDiv.innerHTML = "Please provide sufficient corresponding side lengths (at least one pair) to calculate missing sides.";
}
} else {
resultDiv.innerHTML = results.join("");
}
}