G.541 parallelepipedal solids equal — Code

XI.31

Parallelepipedal solids which are on equal bases and of the same height are equal.

g1.py

Q F I P D a O S X C R T e d c V Y U b W K E H B G M A L
"""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

G K M E U O A H V L T B Q F N S W X P D Y C R I
"""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()