Book I · Proposition 44
To a given straight line to apply, in a given rectilineal angle, a parallelogram equal to a given triangle.Heath, 1908
The application of areas -- the engine of Book II and, later, of the Greek solution of quadratic problems.
Needs: I.3 I.15 I.23 I.31 I.42 I.43
Used by: I.45
Rests on: C.N.1, C.N.2, C.N.3, C.N.4, C.N.5, Def.10, Def.15, Def.4, Post.5
Depth: 15 steps of argument above the first principles. Parallel postulate: needed.
@proposition(
"I.44",
CONSTRUCTION,
sample=_line_triangle_angle,
note="The application of areas -- the engine of Book II and, later, of the "
"Greek solution of quadratic problems.",
)
def prop_I_44(
a: Point,
b: Point,
c: Point,
d: Point,
e: Point,
p: Point,
q: Point,
r: Point,
away_from: "Point | None" = None,
) -> Out:
hypothesis("A and B are distinct", a != b)
hypothesis("CDE is a genuine triangle", not collinear(c, d, e), guard=True)
hypothesis("PQR is a genuine angle", not collinear(p, q, r), guard=True)
outline(p, q, r, close=False) # the arms of the given angle
# Carry a parallelogram equal to the triangle, in the given angle, over to B,
# with its base along AB produced (I.3 for the lengths, I.23 for the angle).
model = prop_I_42(c, d, e, p, q, r)
corner_f, corner_e, corner_c, corner_g = model.parallelogram
base_length = length(corner_e, corner_c)
side_length = length(corner_e, corner_f)
# AB is produced far enough past B for I.3 to cut the base off it: I.3 asks
# for the greater line, and the base carried over may exceed AB itself.
span = 2 * base_length / length(a, b) + 1
beyond = posit(Point(b.x + span * (b.x - a.x), b.y + span * (b.y - a.y)), "B'")
placed_e = posit(prop_I_3(b, beyond, corner_e, corner_c).cut, "E")
turned = prop_I_23(corner_f, corner_e, corner_c, b, placed_e, apart_from=away_from)
placed_g = posit(_along(b, turned.ray_through, side_length), "G")
placed_f = posit(_fourth_vertex(b, placed_e, placed_g), "F")
claim("BEFG equals the given triangle and has the given angle", ["I.3", "I.23", "I.42"],
_area(b, placed_e, placed_f, placed_g) == _area(c, d, e)
and eq_angle(placed_e, b, placed_g, p, q, r))
# the gnomon: complete the figure about the diameter HB produced
top = line(placed_f, placed_g, "FG produced")
h = posit(meet_one(top, _parallel_through(a, b, placed_g)), "H")
diameter = line(h, b, "the diameter HB")
side = line(placed_f, placed_e, "FE produced")
if parallel(diameter, side):
raise GeometryError("HB and FE do not meet in this configuration")
k = posit(meet_one(diameter, side), "K")
through_k = _parallel_through(k, placed_e, a)
l = posit(meet_one(through_k, Line.through(h, a)), "L")
m = posit(meet_one(through_k, Line.through(placed_g, b)), "M")
claim("HLKF is a parallelogram and HK its diameter", "I.31",
parallel(Line.through(h, l), Line.through(placed_f, k))
and parallel(Line.through(h, placed_f), Line.through(l, k)))
# HLKF is the parallelogram, HK its diameter, and B the point on it: I.43's
# own configuration. The angles at B are vertical, which is I.15's.
because(prop_I_43, h, l, k, placed_f, b)
because(prop_I_15, placed_g, m, placed_e, a)
claim("the complements about the diameter are equal, so LABM equals BEFG", "I.43",
_area(l, a, b, m) == _area(b, placed_e, placed_f, placed_g))
claim("therefore the applied parallelogram equals the given triangle", "C.N.1",
_area(l, a, b, m) == _area(c, d, e))
claim("and the angle ABM equals the given angle, being vertical to GBE", "I.15",
eq_angle(a, b, m, p, q, r))
# What the enunciation is about: the parallelogram applied to AB, and the
# triangle it is equal to. Three levels of helper construction stand behind
# them, and stay in the figure, drawn back.
outline_result(l, a, b, m)
outline_result(c, d, e)
return Out(parallelogram=(l, a, b, m))