G.559 similar pyramids triangular — Code

XII.8

Similar pyramids which have triangular bases are in the triplicate ratio of their corresponding sides.
K L A M G N B C O P D Q H R E F
"""Programmatic construction for Book XII, Proposition 8 (XII.8)."""

        from __future__ import annotations

        from geometor.model import Model


        def construct_g1() -> Model:
            """Construct the figure 0400.g1 using geometor.model."""
            model = Model("XII.8")

            # First parallelepiped BGML and pyramid ABCG
            A = model.set_point(25.0, -67.0, classes=["given"], ID="A")
            B = model.set_point(16.0, -144.0, classes=["given"], ID="B")
            C = model.set_point(113.0, -144.0, classes=["given"], ID="C")
            M = model.set_point(122.0, -67.0, ID="M")
            K = model.set_point(44.0, -37.0, ID="K")
            G = model.set_point(35.0, -114.0, classes=["given"], ID="G")
            N = model.set_point(132.0, -114.0, ID="N")
            L = model.set_point(141.0, -37.0, ID="L")

            # Second parallelepiped EHQP and pyramid DEFH
            D = model.set_point(288.0, -67.0, classes=["given"], ID="D")
            E = model.set_point(275.0, -175.0, classes=["given"], ID="E")
            F = model.set_point(412.0, -175.0, classes=["given"], ID="F")
            Q = model.set_point(425.0, -67.0, ID="Q")
            O = model.set_point(318.0, -22.0, ID="O")
            H = model.set_point(305.0, -130.0, classes=["given"], ID="H")
            R = model.set_point(442.0, -130.0, ID="R")
            P = model.set_point(455.0, -22.0, ID="P")

            # Edges of first parallelepiped and pyramid
            for p1, p2 in [
                (A, B), (B, C), (C, M), (M, A),
                (K, G), (G, N), (N, L), (L, K),
                (A, K), (B, G), (C, N), (M, L),
                (A, C), (A, G), (G, C),
            ]:
                model.set_segment(p1, p2)

            # Edges of second parallelepiped and pyramid
            for p1, p2 in [
                (D, E), (E, F), (F, Q), (Q, D),
                (O, H), (H, R), (R, P), (P, O),
                (D, O), (E, H), (F, R), (Q, P),
                (D, F), (D, H), (H, F),
            ]:
                model.set_segment(p1, p2)

            # Polygons
            model.set_polygon([A, B, C])
            model.set_polygon([D, E, F])
            model.set_polygon([B, C, M, A])
            model.set_polygon([B, C, N, G])
            model.set_polygon([B, G, K, A])
            model.set_polygon([E, F, Q, D])
            model.set_polygon([E, F, R, H])
            model.set_polygon([E, H, O, D])

            return model


        if __name__ == "__main__":
            construct_g1()