G.542 parallelepipedal solids height — Code

XI.32

Parallelepipedal solids which are of the same height are to one another as their bases.
B E A D K (L) F C G H
"""Programmatic construction for Book XI, Proposition 32 (XI.32).

        Parallelepipedal solids AB and CD of the same height are to one another as
        their bases AE and CF, proved by applying parallelogram FH equal to AE to FG
        and completing solid GK (or DH).
        """

        from __future__ import annotations

        import sympy as sp
        from geometor.model import Model


        def construct_g1() -> Model:
            """Construct the two parallelepiped figures for XI.32 using geometor.model."""
            model = Model("XI.32")

            # Left solid AB with base AE
            T1 = model.set_point(sp.Rational(18, 100), sp.Rational(131, 100), label="T1")
            B = model.set_point(sp.Rational(116, 100), sp.Rational(131, 100), classes=["given"], label="B")
            T2 = model.set_point(sp.Rational(106, 100), sp.Rational(103, 100), label="T2")
            T3 = model.set_point(sp.Rational(8, 100), sp.Rational(103, 100), label="T3")

            A1 = model.set_point(sp.Rational(34, 100), sp.Rational(49, 100), label="A1")
            E = model.set_point(sp.Rational(132, 100), sp.Rational(49, 100), classes=["given"], label="E")
            A2 = model.set_point(sp.Rational(122, 100), sp.Rational(21, 100), label="A2")
            A = model.set_point(sp.Rational(24, 100), sp.Rational(21, 100), classes=["given"], label="A")

            # Right solid CK (CD + GK)
            L = model.set_point(sp.Rational(202, 100), sp.Rational(44, 100), classes=["given"], label="L")
            F = model.set_point(sp.Rational(286, 100), sp.Rational(44, 100), classes=["given"], label="F")
            M1 = model.set_point(sp.Rational(370, 100), sp.Rational(44, 100), label="M1")

            C = model.set_point(sp.Rational(234, 100), sp.Rational(18, 100), classes=["given"], label="C")
            G = model.set_point(sp.Rational(318, 100), sp.Rational(18, 100), classes=["given"], label="G")
            H = model.set_point(sp.Rational(402, 100), sp.Rational(18, 100), label="H")

            N1 = model.set_point(sp.Rational(224, 100), sp.Rational(129, 100), label="N1")
            D = model.set_point(sp.Rational(308, 100), sp.Rational(129, 100), classes=["given"], label="D")
            K = model.set_point(sp.Rational(392, 100), sp.Rational(129, 100), label="K")

            N2 = model.set_point(sp.Rational(256, 100), sp.Rational(103, 100), label="N2")
            D2 = model.set_point(sp.Rational(340, 100), sp.Rational(103, 100), label="D2")
            K2 = model.set_point(sp.Rational(424, 100), sp.Rational(103, 100), label="K2")

            # Left segments and faces
            for p1, p2 in [
                (T1, B), (B, T2), (T2, T3), (T3, T1),
                (A1, E), (E, A2), (A2, A), (A, A1),
                (T1, A1), (B, E), (T2, A2), (T3, A),
            ]:
                model.set_segment(p1, p2)

            model.set_polygon([A1, E, A2, A])
            model.set_polygon([T1, B, T2, T3])

            # Right segments and faces
            for p1, p2 in [
                (L, F), (F, M1), (C, G), (G, H),
                (L, C), (F, G), (M1, H),
                (N1, D), (D, K), (N2, D2), (D2, K2),
                (N1, N2), (D, D2), (K, K2),
                (L, N1), (C, N2), (F, D), (G, D2), (M1, K), (H, K2),
            ]:
                model.set_segment(p1, p2)

            model.set_polygon([L, F, G, C])
            model.set_polygon([F, M1, H, G])
            model.set_polygon([F, D, D2, G])

            return model


        if __name__ == "__main__":
            construct_g1()