G.544 equal parallelepipedal solids — Code¶
In equal parallelepipedal solids the bases are reciprocally proportional to the heights; and those parallelepipedal solids in which the bases are reciprocally proportional to the heights are equal.
g1.py
"""Programmatic construction for Book XI, Proposition 34 Case 1 (XI.34 - g1).
In equal right parallelepipedal solids AB and CD, the bases EH and NQ are
reciprocally proportional to the heights AG and CM, proved by cutting off
CT equal to AG and completing solid CV.
"""
from __future__ import annotations
import sympy as sp
from geometor.model import Model
def construct_g1() -> Model:
"""Construct the right parallelepipeds figure for XI.34 Case 1 using geometor.model."""
model = Model("XI.34.g1")
# Left solid AB
K = model.set_point(sp.Rational(56, 100), sp.Rational(208, 100), classes=["given"], label="K")
B = model.set_point(sp.Rational(155, 100), sp.Rational(208, 100), classes=["given"], label="B")
F = model.set_point(sp.Rational(124, 100), sp.Rational(170, 100), classes=["given"], label="F")
G = model.set_point(sp.Rational(25, 100), sp.Rational(170, 100), classes=["given"], label="G")
H = model.set_point(sp.Rational(56, 100), sp.Rational(94, 100), classes=["given"], label="H")
L = model.set_point(sp.Rational(155, 100), sp.Rational(94, 100), classes=["given"], label="L")
E = model.set_point(sp.Rational(124, 100), sp.Rational(56, 100), classes=["given"], label="E")
A = model.set_point(sp.Rational(25, 100), sp.Rational(56, 100), classes=["given"], label="A")
# Right solid CD with middle slice TV
R = model.set_point(sp.Rational(314, 100), sp.Rational(246, 100), classes=["given"], label="R")
D = model.set_point(sp.Rational(385, 100), sp.Rational(246, 100), classes=["given"], label="D")
O = model.set_point(sp.Rational(398, 100), sp.Rational(190, 100), classes=["given"], label="O")
M = model.set_point(sp.Rational(327, 100), sp.Rational(190, 100), classes=["given"], label="M")
V_left = model.set_point(sp.Rational(314, 100), sp.Rational(200, 100), label="V_left")
V = model.set_point(sp.Rational(385, 100), sp.Rational(200, 100), label="V")
T_right = model.set_point(sp.Rational(398, 100), sp.Rational(144, 100), label="T_right")
T = model.set_point(sp.Rational(327, 100), sp.Rational(144, 100), label="T")
Q = model.set_point(sp.Rational(314, 100), sp.Rational(81, 100), classes=["given"], label="Q")
P = model.set_point(sp.Rational(385, 100), sp.Rational(81, 100), classes=["given"], label="P")
N = model.set_point(sp.Rational(398, 100), sp.Rational(25, 100), classes=["given"], label="N")
C = model.set_point(sp.Rational(327, 100), sp.Rational(25, 100), classes=["given"], label="C")
# Left solid AB segments and faces
for p1, p2 in [
(K, B), (B, F), (F, G), (G, K),
(H, L), (L, E), (E, A), (A, H),
(K, H), (B, L), (F, E), (G, A),
]:
model.set_segment(p1, p2)
model.set_polygon([H, L, E, A])
model.set_polygon([K, B, F, G])
# Right solid CD segments and faces
for p1, p2 in [
(R, D), (D, O), (O, M), (M, R),
(V_left, V), (V, T_right), (T_right, T), (T, V_left),
(Q, P), (P, N), (N, C), (C, Q),
(R, Q), (D, P), (O, N), (M, C),
(C, T), (T, M),
]:
model.set_segment(p1, p2)
model.set_polygon([Q, P, N, C])
model.set_polygon([V_left, V, T_right, T])
model.set_polygon([R, D, O, M])
model.set_polygon([M, R, Q, C])
model.set_polygon([T, V_left, Q, C])
return model
if __name__ == "__main__":
construct_g1()
g2.py
"""Programmatic construction for Book XI, Proposition 34 Case 2 (XI.34 - g2).
Oblique parallelepipedal solids AB and CD on bases EH and NQ, together with
right parallelepipedal solids BT (or FV) and DX (or Oa) formed by dropping
perpendiculars FS, GT, BU, KV and OW, MX, DY, Ra 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 oblique parallelepipeds figure for XI.34 Case 2 using geometor.model."""
model = Model("XI.34.g2")
# Left figure: Top face KBFG, oblique base HLEA, right base VUST
K = model.set_point(sp.Rational(76, 100), sp.Rational(206, 100), classes=["given"], label="K")
B = model.set_point(sp.Rational(182, 100), sp.Rational(206, 100), classes=["given"], label="B")
F = model.set_point(sp.Rational(200, 100), sp.Rational(172, 100), classes=["given"], label="F")
G = model.set_point(sp.Rational(94, 100), sp.Rational(172, 100), classes=["given"], label="G")
H = model.set_point(sp.Rational(26, 100), sp.Rational(110, 100), classes=["given"], label="H")
L = model.set_point(sp.Rational(132, 100), sp.Rational(110, 100), classes=["given"], label="L")
E = model.set_point(sp.Rational(150, 100), sp.Rational(76, 100), classes=["given"], label="E")
A = model.set_point(sp.Rational(44, 100), sp.Rational(76, 100), classes=["given"], label="A")
V = model.set_point(sp.Rational(76, 100), sp.Rational(94, 100), label="V")
U = model.set_point(sp.Rational(182, 100), sp.Rational(94, 100), label="U")
S = model.set_point(sp.Rational(200, 100), sp.Rational(60, 100), label="S")
T = model.set_point(sp.Rational(94, 100), sp.Rational(60, 100), label="T")
# Right figure: Top face RDOM, oblique base QPNC, right base aYWX
R = model.set_point(sp.Rational(295, 100), sp.Rational(234, 100), classes=["given"], label="R")
D = model.set_point(sp.Rational(378, 100), sp.Rational(234, 100), classes=["given"], label="D")
O = model.set_point(sp.Rational(352, 100), sp.Rational(197, 100), classes=["given"], label="O")
M = model.set_point(sp.Rational(269, 100), sp.Rational(197, 100), classes=["given"], label="M")
Q = model.set_point(sp.Rational(318, 100), sp.Rational(67, 100), classes=["given"], label="Q")
P = model.set_point(sp.Rational(401, 100), sp.Rational(67, 100), classes=["given"], label="P")
N = model.set_point(sp.Rational(375, 100), sp.Rational(30, 100), classes=["given"], label="N")
C = model.set_point(sp.Rational(292, 100), sp.Rational(30, 100), classes=["given"], label="C")
a = model.set_point(sp.Rational(295, 100), sp.Rational(78, 100), label="a")
Y = model.set_point(sp.Rational(378, 100), sp.Rational(78, 100), label="Y")
W = model.set_point(sp.Rational(352, 100), sp.Rational(41, 100), label="W")
X = model.set_point(sp.Rational(269, 100), sp.Rational(41, 100), label="X")
# Left segments and faces
for p1, p2 in [
(K, B), (B, F), (F, G), (G, K),
(H, L), (L, E), (E, A), (A, H),
(V, U), (U, S), (S, T), (T, V),
(K, H), (B, L), (F, E), (G, A),
(K, V), (B, U), (F, S), (G, T),
]:
model.set_segment(p1, p2)
model.set_polygon([K, B, F, G])
model.set_polygon([H, L, E, A])
model.set_polygon([V, U, S, T])
# Right segments and faces
for p1, p2 in [
(R, D), (D, O), (O, M), (M, R),
(Q, P), (P, N), (N, C), (C, Q),
(a, Y), (Y, W), (W, X), (X, a),
(R, Q), (D, P), (O, N), (M, C),
(R, a), (D, Y), (O, W), (M, X),
]:
model.set_segment(p1, p2)
model.set_polygon([R, D, O, M])
model.set_polygon([Q, P, N, C])
model.set_polygon([a, Y, W, X])
return model
if __name__ == "__main__":
construct_g2()