G.570 similar cones cylinders — Code

XII.12

Similar cones and cylinders are to one another in the triplicate ratio of the diameters in their bases.
L A T W B K D U V C N E S P H M F R Q G O
"""Programmatic construction for Book XII, Proposition 12 (XII.12)."""

        from __future__ import annotations

        from geometor.model import Model


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

            # First circle ABCD, center K, and apex L
            K = model.set_point(104.0, -146.0, ID="K")
            L = model.set_point(38.0, -43.0, classes=["given"], ID="L")
            A = model.set_point(104.0, -62.0, classes=["given"], ID="A")
            B = model.set_point(20.0, -146.0, classes=["given"], ID="B")
            C = model.set_point(104.0, -230.0, classes=["given"], ID="C")
            D = model.set_point(188.0, -146.0, classes=["given"], ID="D")
            T = model.set_point(44.6, -86.6, ID="T")
            U = model.set_point(44.6, -205.4, ID="U")
            V = model.set_point(163.4, -205.4, ID="V")
            W = model.set_point(163.4, -86.6, ID="W")

            model.construct_circle(K, A)
            model.set_segment(B, D)
            model.set_segment(B, K)
            model.set_segment(K, D)
            model.set_segment(K, L)
            model.set_segment(K, T)
            model.set_segment(L, B)
            model.set_segment(L, T)
            for p1, p2 in [(A, B), (B, C), (C, D), (D, A)]:
                model.set_segment(p1, p2)
            for p1, p2 in [(A, T), (T, B), (B, U), (U, C), (C, V), (V, D), (D, W), (W, A)]:
                model.set_segment(p1, p2)

            model.set_polygon([A, B, C, D])
            model.set_polygon([A, T, B, U, C, V, D, W])
            model.set_polygon([B, K, L])
            model.set_polygon([B, K, T])
            model.set_polygon([L, K, T])
            model.set_polygon([L, B, T])

            # Second circle EFGH, center M, and apex N
            M = model.set_point(331.0, -146.0, ID="M")
            N = model.set_point(422.0, -25.0, classes=["given"], ID="N")
            E = model.set_point(331.0, -50.0, classes=["given"], ID="E")
            F = model.set_point(427.0, -146.0, classes=["given"], ID="F")
            G = model.set_point(331.0, -242.0, classes=["given"], ID="G")
            H = model.set_point(235.0, -146.0, classes=["given"], ID="H")
            P = model.set_point(398.88, -78.12, ID="P")
            Q = model.set_point(398.88, -213.88, ID="Q")
            R = model.set_point(263.12, -213.88, ID="R")
            S = model.set_point(263.12, -78.12, ID="S")

            model.construct_circle(M, E)
            model.set_segment(F, H)
            model.set_segment(F, M)
            model.set_segment(M, H)
            model.set_segment(M, N)
            model.set_segment(M, P)
            model.set_segment(N, F)
            model.set_segment(N, P)
            for p1, p2 in [(E, F), (F, G), (G, H), (H, E)]:
                model.set_segment(p1, p2)
            for p1, p2 in [(E, P), (P, F), (F, Q), (Q, G), (G, R), (R, H), (H, S), (S, E)]:
                model.set_segment(p1, p2)

            model.set_polygon([E, F, G, H])
            model.set_polygon([E, P, F, Q, G, R, H, S])
            model.set_polygon([E, P, F])
            model.set_polygon([F, Q, G])
            model.set_polygon([G, R, H])
            model.set_polygon([H, S, E])
            model.set_polygon([F, M, N])
            model.set_polygon([F, M, P])
            model.set_polygon([N, M, P])
            model.set_polygon([N, F, P])

            return model


        if __name__ == "__main__":
            construct_g1()