Heron Calculator: Area of Any Triangle

Heron Calculator: Area of Any Triangle
Loading the math board and drawing, please wait…
2025-12-15 23:53
This example demonstrates how to compute the area of an arbitrary triangle from its three side lengths using Heron’s (Hero’s) formula, with interactive checking and step-by-step guidance. The key mathematics includes the semiperimeter and the square-root form of the area formula, where side lengths determine the area uniquely. Construction and interface logic are built from the commands in the con

GeoGebra Commands & Parameters

  1. Sequence(Random[1, 10], i, 1, 10) → randomNumbers, {10, 5, 7, 1, 8, 7, 5, 8, 9, 2}
  2. Element(randomNumbers, Mod[questionCount, Length[randomNumbers]] + 1) → randomNumber
  3. Textfield(input) → inputBox
  4. Join({Sequence[Segment[Corner[4] + (RasterPixMat * ((k * RasterStepXY), 0)), Corner[4] + (RasterPixMat * ((k * RasterStepXY), RasterMaxY))], k, 0, RasterMaxX / RasterStepXY], Sequence[Segment[Corner[4] + (RasterPixMat * (0, (k * RasterStepXY))), Corner[4] + (RasterPixMat * (RasterMaxX, (k * RasterStepXY)))], k, 0, RasterMaxY / RasterStepXY]}) → RasterStrecken
  5. Join({Sequence[Text[UnicodeToLetter[65 + k], Midpoint[Corner[4] + (RasterPixMat * ((k * RasterStepXY), RasterMaxY)), Corner[4] + (RasterPixMat * (((k + 1) * RasterStepXY), RasterMaxY))], false, true, 0, -1], k, 0, RasterMaxX / RasterStepXY - 1], Sequence[Text[("" * k), Midpoint[Corner[4] + (RasterPixMat * (RasterMaxX, ((k - 1) * RasterStepXY))), Corner[4] + (RasterPixMat * (RasterMaxX, (k * RasterStepXY)))], false, true, 1, 0], k, 1, RasterMaxY / RasterStepXY]}) → RasterBeschriftung
  6. Sequence(Sequence[Corner[4] + (RasterPixMat * ((k * RasterStepXY), (m * RasterStepXY))), k, 0, RasterMaxX / RasterStepXY], m, 0, RasterMaxY / RasterStepXY) → RasterPunkte
  7. Textfield(number) → InputBox1
  8. Sequence(Sequence[PosTable + (Sum[ListSpalte, k], (-Sum[ListZeile, m])), k, 0, 2], m, 0, 10) → TablePosMat
  9. Take(Split[ReplaceAll[(number21 * ""), ".", ","], {""}], 1, Min[If[number21 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number21 * ""), ".", ","], {""}]]]) → txtN21
  10. Take(Split[ReplaceAll[(number22 * ""), ".", ","], {""}], 1, Min[If[number22 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number22 * ""), ".", ","], {""}]]]) → txtN22
  11. Take(Split[ReplaceAll[(number31 * ""), ".", ","], {""}], 1, Min[If[number31 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number31 * ""), ".", ","], {""}]]]) → txtN31
  12. Take(Split[ReplaceAll[(number32 * ""), ".", ","], {""}], 1, Min[If[number32 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number32 * ""), ".", ","], {""}]]]) → txtN32
  13. Take(Split[ReplaceAll[(number41 * ""), ".", ","], {""}], 1, Min[If[number41 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number41 * ""), ".", ","], {""}]]]) → txtN41
  14. Take(Split[ReplaceAll[(number42 * ""), ".", ","], {""}], 1, Min[If[number42 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number42 * ""), ".", ","], {""}]]]) → txtN42
  15. Take(Split[ReplaceAll[(number51 * ""), ".", ","], {""}], 1, Min[If[number51 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number51 * ""), ".", ","], {""}]]]) → txtN51
  16. Take(Split[ReplaceAll[(number52 * ""), ".", ","], {""}], 1, Min[If[number52 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number52 * ""), ".", ","], {""}]]]) → txtN52
  17. Take(Split[ReplaceAll[(number61 * ""), ".", ","], {""}], 1, Min[If[number61 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number61 * ""), ".", ","], {""}]]]) → txtN61
  18. Take(Split[ReplaceAll[(number62 * ""), ".", ","], {""}], 1, Min[If[number62 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number62 * ""), ".", ","], {""}]]]) → txtN62
  19. Take(Split[ReplaceAll[(number71 * ""), ".", ","], {""}], 1, Min[If[number71 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number71 * ""), ".", ","], {""}]]]) → txtN71
  20. Take(Split[ReplaceAll[(number72 * ""), ".", ","], {""}], 1, Min[If[number72 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number72 * ""), ".", ","], {""}]]]) → txtN72
  21. Take(Split[ReplaceAll[(number81 * ""), ".", ","], {""}], 1, Min[If[number81 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number81 * ""), ".", ","], {""}]]]) → txtN81
  22. Take(Split[ReplaceAll[(number82 * ""), ".", ","], {""}], 1, Min[If[number82 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number82 * ""), ".", ","], {""}]]]) → txtN82
  23. Take(Split[ReplaceAll[(number91 * ""), ".", ","], {""}], 1, Min[If[number91 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number91 * ""), ".", ","], {""}]]]) → txtN91
  24. Take(Split[ReplaceAll[(number92 * ""), ".", ","], {""}], 1, Min[If[number92 ≥ 10, commaCounter + 3, commaCounter + 2], Length[Split[ReplaceAll[(number92 * ""), ".", ","], {""}]]]) → txtN92
  25. Split(ReplaceAll[(SqrtNumber * ""), ".", ","], {""}) → txtSol
  26. If(0 < number ≤ 6, 6, 6 < number < 13, 13, 13 ≤ number ≤ 20, 21, 25) → maxX
  27. If(0 < number ≤ 6, 3, 6 < number < 13, 5, 6) → maxY
  28. If(0 < number ≤ 6, 1.2, 6 < number < 13, 0.8, 13 ≤ number ≤ 20, 0.65, 0.55) → disX
  29. Segment(Origin + ((minX / stepX * disX) - edgeAxisX, 0), Origin + ((maxX / stepX * disX) + edgeAxisX, 0)) → segAxisX
  30. Segment(Origin + (0, (minY / stepY * disY) - edgeAxisY), Origin + (0, (maxY / stepY * disY) + edgeAxisY)) → segAxisY
  31. Sequence(Origin + ((minX / stepX * disX), 0) + (k * (disX, 0)), k, 0, maxX / stepX - minX / stepX) → PointsXAxis
  32. Sequence(Origin + (0, (minY / stepY * disY)) + (k * (0, disY)), k, 0, maxY / stepY - minY / stepY) → PointsYAxis
  33. Sequence(Segment[PointsXAxis(k) + (0, (-disSeg)), PointsXAxis(k) + (0, disSeg)], k, 1, Length[PointsXAxis]) → segXAxis
  34. Sequence(Segment[PointsYAxis(k) + ((-disSeg), 0), PointsYAxis(k) + (disSeg, 0)], k, 1, Length[PointsYAxis]) → segYAxis
  35. Sequence(m, m, minX, maxX, stepX) → numbersXAxis
  36. Sequence(Text[((("\textsf{\footnotesize{\(" * If[numbersXAxis(k) ≥ 0, "\phantom{\(-\)}", ""]) * If[Element[numbersXAxis, k] ≟ 0, "", ("" * Element[numbersXAxis, k])]) * "\)}}"), PointsXAxis(k) + (-0.12, (-disSeg)), false, true, 0, -1], k, 1, (maxX - minX) / stepX + 1) → CapX
  37. Sequence(m, m, minY, maxY, stepY) → numbersYAxis
  38. Sequence(Text[((("\textsf{\footnotesize{\(" * If[numbersYAxis(k) ≥ 0, "\phantom{\(-\)}", ""]) * If[Element[numbersYAxis, k] ≟ 0, "", ("" * Element[numbersYAxis, k])]) * "\)}}"), PointsYAxis(k) + ((-disSeg) + 0.05, 0), false, true, -1, 0], k, 1, (maxY - minY) / stepY + 1) → CapY
  39. Sequence(If[¬Defined[DiffListOriginal(k)], 20, DiffListOriginal(k)], k, 1, 8) → DiffList
  40. Text(txt41, Midpoint[TablePosMat(5, 1), TablePosMat(6, 2)], false, true, 0, 0) → Cap41
  41. Text(txt51, Midpoint[TablePosMat(6, 1), TablePosMat(7, 2)], false, true, 0, 0) → Cap51
  42. Text(txt61, Midpoint[TablePosMat(7, 1), TablePosMat(8, 2)], false, true, 0, 0) → Cap61
  43. Text(txt71, Midpoint[TablePosMat(8, 1), TablePosMat(9, 2)], false, true, 0, 0) → Cap71
  44. Text(txt81, Midpoint[TablePosMat(9, 1), TablePosMat(10, 2)], false, true, 0, 0) → Cap81
  45. Text(txt91, Midpoint[TablePosMat(10, 1), TablePosMat(11, 2)], false, true, 0, 0) → Cap91
  46. Text(txt31, Midpoint[TablePosMat(4, 1), TablePosMat(5, 2)], false, true, 0, 0) → Cap31
  47. Text(txt21, Midpoint[TablePosMat(3, 1), TablePosMat(4, 2)], false, true, 0, 0) → Cap21
  48. Text(txt22, Midpoint[TablePosMat(3, 2), TablePosMat(4, 3)], false, true, 0, 0) → Cap22
  49. Text(txt32, Midpoint[TablePosMat(4, 2), TablePosMat(5, 3)], false, true, 0, 0) → Cap32
  50. Text(txt42, Midpoint[TablePosMat(5, 2), TablePosMat(6, 3)], false, true, 0, 0) → Cap42
  51. Text(txt52, Midpoint[TablePosMat(6, 2), TablePosMat(7, 3)], false, true, 0, 0) → Cap52
  52. Text(txt62, Midpoint[TablePosMat(7, 2), TablePosMat(8, 3)], false, true, 0, 0) → Cap62
  53. Text(txt72, Midpoint[TablePosMat(8, 2), TablePosMat(9, 3)], false, true, 0, 0) → Cap72
  54. Text(txt82, Midpoint[TablePosMat(9, 2), TablePosMat(10, 3)], false, true, 0, 0) → Cap82
  55. Text(txt92, Midpoint[TablePosMat(10, 2), TablePosMat(11, 3)], false, true, 0, 0) → Cap92
  56. PolyLine(Vertex[polyRectangle(1), 2], Vertex[polyRectangle(1), 3], Vertex[polyRectangle(1), 4]) → segRectangle
  57. IndexOf(false, Sequence[txtN81(k) ≟ txtN82(k), k, 1, Min[Length[txtN81], Length[txtN82]]]) → a
  58. Text(((((((((("\textsf{\sqrt{" * number) * "} ") * If[IsInteger[SqrtNumber], "=", "="]) * " \textcolor{#db6114}{") * ReplaceAll[(floor((SqrtNumber * If[¬cBC, 100000, 10^(commaCounter)])) / If[¬cBC, 100000, 10^(commaCounter)] * ""), ".", ","]) * "") * If[number ≟ 19, "0", ""]) * If[IsInteger[SqrtNumber], "", "..."]) * "}}"), TablePosMat(11, 2) + (0, 0), false, true, 0, -1) → CapSol
  59. Text("\textsf{\bold{\textcolor{#50c1ce}{Zieh mich!}}}", TablePosMat(2, 3) + (0.45, 0.5), false, true, 0, 1) → CapZiehMich
  60. Text((("\textsf{\large{\bold{\textcolor{#50c1ce}{" * If[sliderH > 2, "↓", ""]) * "}}}}"), TablePosMat(11, 3) + (0.65, 0.3) + ((9 - 10 + sliderH) * (0, zeile1)), false, true, 1, 0) → CapSliderH