G.438 area contained rational — Code¶
If an area be contained by a rational segment and the fifth binomial, the “side” of the area is the irrational segment called the side of a rational plus a medial area.
#!/usr/bin/env python3
"""
Programmatic construction for Euclid Book X, Proposition 58 (X.58)
using geometor.model.
"""
from geometor.model import Model
def build_model() -> Model:
m = Model("X.58")
# Left partitioned rectangle ABCD (with vertical dividers GH, EK, FL)
A = m.set_point(17.0, 20.0, classes=["given"], ID="A")
G = m.set_point(115.5, 20.0, classes=["constructed"], ID="G")
E = m.set_point(133.5, 20.0, classes=["given"], ID="E")
F = m.set_point(176.5, 20.0, classes=["constructed"], ID="F")
D = m.set_point(218.0, 20.0, classes=["given"], ID="D")
B = m.set_point(17.0, 72.5, classes=["given"], ID="B")
H = m.set_point(115.5, 72.5, classes=["constructed"], ID="H")
K = m.set_point(133.5, 72.5, classes=["constructed"], ID="K")
L = m.set_point(176.5, 72.5, classes=["constructed"], ID="L")
C = m.set_point(218.0, 72.5, classes=["constructed"], ID="C")
# Top and bottom segments of ABCD
m.set_segment(A, D)
m.set_segment(A, E)
m.set_segment(E, D)
m.set_segment(E, F)
m.set_segment(F, D)
m.set_segment(A, G)
m.set_segment(G, E)
m.set_segment(B, C)
m.set_segment(B, H)
m.set_segment(H, K)
m.set_segment(K, L)
m.set_segment(L, C)
# Vertical dividers of ABCD
m.set_segment(A, B)
m.set_segment(G, H)
m.set_segment(E, K)
m.set_segment(F, L)
m.set_segment(D, C)
# Polygons of ABCD
m.set_polygon([A, B, C, D]) # AC
m.set_polygon([A, B, K, E]) # AK
m.set_polygon([A, B, H, G]) # AH
m.set_polygon([G, H, K, E]) # GK / HE
m.set_polygon([E, K, L, F]) # EL
m.set_polygon([F, L, C, D]) # FC
# Right square SQ with horizontal divider MO and vertical divider RP meeting at N
TL = m.set_point(291.5, 20.0, classes=["constructed"], ID="TL")
R = m.set_point(363.0, 20.0, classes=["constructed"], ID="R")
Q = m.set_point(398.5, 20.0, classes=["constructed"], ID="Q")
M = m.set_point(291.5, 54.5, classes=["constructed"], ID="M")
N = m.set_point(363.0, 54.5, classes=["constructed"], ID="N")
O = m.set_point(398.5, 54.5, classes=["constructed"], ID="O")
S = m.set_point(291.5, 126.5, classes=["constructed"], ID="S")
P = m.set_point(363.0, 126.5, classes=["constructed"], ID="P")
BR = m.set_point(398.5, 126.5, classes=["constructed"], ID="BR")
# Segments of SQ
m.set_segment(M, O)
m.set_segment(M, N)
m.set_segment(N, O)
m.set_segment(R, P)
m.set_segment(R, N)
m.set_segment(N, P)
m.set_segment(M, S)
m.set_segment(S, P)
m.set_segment(O, Q)
m.set_segment(R, Q)
# Polygons of SQ
m.set_polygon([TL, S, BR, Q]) # SQ
m.set_polygon([M, S, P, N]) # SN (square on MN)
m.set_polygon([N, O, Q, R]) # NQ (square on NO)
m.set_polygon([TL, M, N, R]) # MR (rectangle MN, NO)
m.set_polygon([N, P, BR, O]) # NP (rectangle MN, NO)
return m
if __name__ == "__main__":
model = build_model()
print(f"Constructed {model.name} with {len(model)} elements.")