G.573 equal cones cylinders — Code

XII.15

In equal cones and cylinders the bases are reciprocally proportional to the heights; and those cones and cylinders in which the bases are reciprocally proportional to the heights are equal.
L O D K A B C P M R S T Q U G N F H E
"""Programmatic construction for Book XII, Proposition 15 (XII.15).

        Equal cones and cylinders with circular bases ABCD (diameter AC, axis KL,
        cylinder AO) and EFGH (diameter EG, axis MN cut at Q by plane TUS, cylinder EP
        and partial cylinder ES).
        """

        from __future__ import annotations

        from geometor.model import Model


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

            # Left vertical cylinder AO and cone ABCD-L
            L = model.set_point(89.0, -34.0, classes=["given"], ID="L")
            A2 = model.set_point(31.0, -34.0, ID="A2")
            O = model.set_point(147.0, -34.0, classes=["given"], ID="O")
            K = model.set_point(89.0, -134.0, classes=["given"], ID="K")
            A = model.set_point(31.0, -134.0, classes=["given"], ID="A")
            C = model.set_point(147.0, -134.0, classes=["given"], ID="C")
            D = model.set_point(72.0, -118.7, classes=["given"], ID="D")
            B = model.set_point(106.0, -149.3, classes=["given"], ID="B")

            # Right horizontal cylinder EP and cones with vertex M
            M = model.set_point(206.0, -80.0, classes=["given"], ID="M")
            P = model.set_point(206.0, -42.0, classes=["given"], ID="P")
            R = model.set_point(206.0, -118.0, classes=["given"], ID="R")

            Q = model.set_point(338.0, -80.0, classes=["given"], ID="Q")
            S = model.set_point(338.0, -42.0, classes=["given"], ID="S")
            U = model.set_point(338.0, -118.0, classes=["given"], ID="U")
            T = model.set_point(350.0, -80.0, classes=["given"], ID="T")

            N = model.set_point(434.0, -80.0, classes=["given"], ID="N")
            G = model.set_point(434.0, -42.0, classes=["given"], ID="G")
            E = model.set_point(434.0, -118.0, classes=["given"], ID="E")
            F = model.set_point(446.0, -80.0, classes=["given"], ID="F")
            H = model.set_point(422.0, -80.0, classes=["given"], ID="H")

            # Circular bases and sections
            for center, rim in [
                (L, O), (K, C), (M, P), (Q, S), (N, G),
            ]:
                model.construct_circle(center, rim)

            # Segments
            for p1, p2 in [
                (A2, A), (O, C), (L, K), (A, C), (A, K), (K, C),
                (L, A), (L, C),
                (P, S), (S, G), (P, G),
                (R, U), (U, E), (R, E),
                (M, Q), (Q, N), (M, N),
                (S, U), (G, E),
                (M, S), (M, U), (M, G), (M, E),
            ]:
                model.set_segment(p1, p2)

            # Cylinders and cones
            model.set_polygon([A2, A, C, O])  # Cylinder AO
            model.set_polygon([P, R, E, G])   # Cylinder EP
            model.set_polygon([S, U, E, G])   # Cylinder ES
            model.set_polygon([A, C, L])      # Cone ABCD-L
            model.set_polygon([E, G, M])      # Cone EFGH-M

            return model


        if __name__ == "__main__":
            construct_g1()