G.541 parallelepipedal solids equal — Code¶
g1.py
"""Programmatic construction for Book XI, Proposition 31 (XI.31 - g1).
Parallelepipedal solids AE and CF on equal bases AB and CD and of the same height
are equal to one another, proved via auxiliary solids XU, XY, RI, and CI.
"""
from __future__ import annotations
import sympy as sp
from geometor.model import Model
def construct_g1() -> Model:
"""Construct the parallelepipedal solids for Book XI, Proposition 31."""
model = Model("XI.31.g1")
# Left compound figure: top-back line Q-F-I and top-front line P-D-a
Q = model.set_point(sp.Rational(60, 100), sp.Rational(224, 100), classes=["given"], label="Q")
F = model.set_point(sp.Rational(179, 100), sp.Rational(224, 100), classes=["given"], label="F")
I = model.set_point(sp.Rational(300, 100), sp.Rational(224, 100), label="I")
P = model.set_point(sp.Rational(28, 100), sp.Rational(186, 100), classes=["given"], label="P")
D = model.set_point(sp.Rational(147, 100), sp.Rational(186, 100), classes=["given"], label="D")
a = model.set_point(sp.Rational(268, 100), sp.Rational(186, 100), label="a")
# Middle-back line O-S-X and middle-front line C-R-T
O = model.set_point(sp.Rational(47, 100), sp.Rational(146, 100), classes=["given"], label="O")
S = model.set_point(sp.Rational(166, 100), sp.Rational(146, 100), classes=["given"], label="S")
X = model.set_point(sp.Rational(287, 100), sp.Rational(146, 100), label="X")
C = model.set_point(sp.Rational(15, 100), sp.Rational(108, 100), classes=["given"], label="C")
R = model.set_point(sp.Rational(134, 100), sp.Rational(108, 100), classes=["given"], label="R")
T = model.set_point(sp.Rational(255, 100), sp.Rational(108, 100), label="T")
# Bottom-back line e-d-c-V and bottom-front line Y-U-b-W
e = model.set_point(sp.Rational(152, 100), sp.Rational(64, 100), label="e")
d = model.set_point(sp.Rational(229, 100), sp.Rational(64, 100), label="d")
c = model.set_point(sp.Rational(273, 100), sp.Rational(64, 100), label="c")
V = model.set_point(sp.Rational(350, 100), sp.Rational(64, 100), label="V")
Y = model.set_point(sp.Rational(120, 100), sp.Rational(26, 100), label="Y")
U = model.set_point(sp.Rational(197, 100), sp.Rational(26, 100), label="U")
b = model.set_point(sp.Rational(241, 100), sp.Rational(26, 100), label="b")
W = model.set_point(sp.Rational(318, 100), sp.Rational(26, 100), label="W")
# Right figure: solid AE
K = model.set_point(sp.Rational(444, 100), sp.Rational(143, 100), classes=["given"], label="K")
E = model.set_point(sp.Rational(565, 100), sp.Rational(143, 100), classes=["given"], label="E")
H = model.set_point(sp.Rational(412, 100), sp.Rational(105, 100), classes=["given"], label="H")
B = model.set_point(sp.Rational(533, 100), sp.Rational(105, 100), classes=["given"], label="B")
G = model.set_point(sp.Rational(504, 100), sp.Rational(64, 100), classes=["given"], label="G")
M = model.set_point(sp.Rational(625, 100), sp.Rational(64, 100), classes=["given"], label="M")
A = model.set_point(sp.Rational(472, 100), sp.Rational(26, 100), classes=["given"], label="A")
L = model.set_point(sp.Rational(593, 100), sp.Rational(26, 100), classes=["given"], label="L")
# Segments
for p, q in [
(P, Q), (D, F), (C, O), (R, S), (a, I), (T, X),
(H, K), (B, E), (A, G), (L, M),
(C, R), (R, T), (R, U), (A, L), (L, B),
(D, R), (R, Y), (D, Y), (W, U), (Y, W), (e, V),
(a, b), (T, b), (T, W), (S, e), (S, d), (X, c), (X, V), (P, D),
]:
model.set_segment(p, q)
# Polygons
model.set_polygon([A, H, B, L])
model.set_polygon([C, P, D, R])
model.set_polygon([R, U, W, T])
model.set_polygon([R, T, X, S])
model.set_polygon([A, L, M, G])
model.set_polygon([L, B, E, M])
model.set_polygon([S, R, U, d])
model.set_polygon([Y, b, c, e])
model.set_polygon([U, W, V, d])
model.set_polygon([Y, b, T, R])
model.set_polygon([D, a, T, R])
model.set_polygon([R, D, F, S])
return model
if __name__ == "__main__":
construct_g1()
g2.py
"""Programmatic construction for Book XI, Proposition 31 Case 2 (XI.31 - g2).
Oblique parallelepipedal solids AE and CF on equal bases AB and CD and of the
same height, together with right parallelepipedal solids KV and QI dropped
perpendicularly from top faces KM and QS to the planes of the bases.
"""
from __future__ import annotations
import sympy as sp
from geometor.model import Model
def construct_g2() -> Model:
"""Construct the two oblique-to-right parallelepiped figures for XI.31 Case 2."""
model = Model("XI.31.g2")
# Left figure: Top face GKEM, oblique base AHBL, right base UOTV
G = model.set_point(sp.Rational(42, 100), sp.Rational(136, 100), classes=["given"], label="G")
K = model.set_point(sp.Rational(146, 100), sp.Rational(136, 100), classes=["given"], label="K")
E = model.set_point(sp.Rational(128, 100), sp.Rational(100, 100), classes=["given"], label="E")
M = model.set_point(sp.Rational(24, 100), sp.Rational(100, 100), classes=["given"], label="M")
U = model.set_point(sp.Rational(42, 100), sp.Rational(54, 100), label="U")
O = model.set_point(sp.Rational(146, 100), sp.Rational(54, 100), label="O")
T = model.set_point(sp.Rational(128, 100), sp.Rational(18, 100), label="T")
V = model.set_point(sp.Rational(24, 100), sp.Rational(18, 100), label="V")
A = model.set_point(sp.Rational(65, 100), sp.Rational(54, 100), classes=["given"], label="A")
H = model.set_point(sp.Rational(169, 100), sp.Rational(54, 100), classes=["given"], label="H")
B = model.set_point(sp.Rational(151, 100), sp.Rational(18, 100), classes=["given"], label="B")
L = model.set_point(sp.Rational(47, 100), sp.Rational(18, 100), classes=["given"], label="L")
# Right figure: Top face QFNS, oblique base PDRC, right base WXIY
Q = model.set_point(sp.Rational(305, 100), sp.Rational(138, 100), classes=["given"], label="Q")
F = model.set_point(sp.Rational(406, 100), sp.Rational(138, 100), classes=["given"], label="F")
S = model.set_point(sp.Rational(426, 100), sp.Rational(102, 100), classes=["given"], label="S")
N = model.set_point(sp.Rational(325, 100), sp.Rational(102, 100), classes=["given"], label="N")
W = model.set_point(sp.Rational(305, 100), sp.Rational(54, 100), label="W")
X = model.set_point(sp.Rational(406, 100), sp.Rational(54, 100), label="X")
I = model.set_point(sp.Rational(426, 100), sp.Rational(18, 100), label="I")
Y = model.set_point(sp.Rational(325, 100), sp.Rational(18, 100), label="Y")
P = model.set_point(sp.Rational(282, 100), sp.Rational(54, 100), classes=["given"], label="P")
D = model.set_point(sp.Rational(383, 100), sp.Rational(54, 100), classes=["given"], label="D")
R = model.set_point(sp.Rational(403, 100), sp.Rational(18, 100), classes=["given"], label="R")
C = model.set_point(sp.Rational(302, 100), sp.Rational(18, 100), classes=["given"], label="C")
# Left segments and faces
for p1, p2 in [
(G, K), (K, E), (E, M), (M, G),
(A, G), (H, K), (B, E), (L, M),
(G, U), (K, O), (E, T), (M, V),
(U, O), (O, T), (T, V), (V, U),
(A, H), (H, B), (B, L), (L, A),
(U, A), (A, O), (O, H),
(V, L), (L, T), (T, B),
]:
model.set_segment(p1, p2)
model.set_polygon([G, K, E, M])
model.set_polygon([U, O, T, V])
model.set_polygon([A, H, B, L])
# Right segments and faces
for p1, p2 in [
(Q, F), (F, S), (S, N), (N, Q),
(P, Q), (D, F), (R, S), (C, N),
(Q, W), (F, X), (S, I), (N, Y),
(W, X), (X, I), (I, Y), (Y, W),
(P, D), (D, R), (R, C), (C, P),
(P, W), (W, D), (D, X),
(C, Y), (Y, R), (R, I),
]:
model.set_segment(p1, p2)
model.set_polygon([Q, F, S, N])
model.set_polygon([W, X, I, Y])
model.set_polygon([P, D, R, C])
return model
if __name__ == "__main__":
construct_g2()