G.74 construct a parallelogram equal to a polygon — Code

I.45

Construct, in a given angle, a parallelogram equal in area to a given polygon.
A D B C E F G L K H M
"""Programmatic construction for Book I, I.45 (I.45).

        To construct, in a given rectilineal angle, a parallelogram equal to a given rectilineal figure.
        """

        from __future__ import annotations

        from geometor.model import Model


        def construct_g1() -> Model:
            """Construct the figure for 0359.g1 (I.45) using geometor.model."""
            model = Model("I.45")

            # 1. Points
            A = model.set_point(31, -50, classes=["given"], ID="A")
            D = model.set_point(149, -27, classes=["given"], ID="D")
            B = model.set_point(149, -120, classes=["given"], ID="B")
            C = model.set_point(230, -52, classes=["given"], ID="C")
            E = model.set_point(244, -93, classes=["given"], ID="E")
            E1 = model.set_point(266, -51, ID="E1")
            E2 = model.set_point(295, -102, ID="E2")
            F = model.set_point(385, -35, ID="F")
            G = model.set_point(456, -35, ID="G")
            L = model.set_point(498, -35, ID="L")
            K = model.set_point(363, -117, ID="K")
            H = model.set_point(434, -117, ID="H")
            M = model.set_point(476, -117, ID="M")

            # 3. Segments
            model.set_segment(A, D)
            model.set_segment(A, B)
            model.set_segment(D, C)
            model.set_segment(B, C)
            model.set_segment(D, B)
            model.set_segment(E, E1)
            model.set_segment(E, E2)
            model.set_segment(F, L)
            model.set_segment(F, G)
            model.set_segment(G, L)
            model.set_segment(K, M)
            model.set_segment(K, H)
            model.set_segment(H, M)
            model.set_segment(F, K)
            model.set_segment(G, H)
            model.set_segment(L, M)

            # 4. Collinear Sections
            model.set_section([F, G, L])
            model.set_section([K, H, M])

            # 5. Polygons (Triangles, Parallelograms, Trapezia, Squares)
            model.set_polygon([A, B, C, D])
            model.set_polygon([A, B, D])
            model.set_polygon([D, B, C])
            model.set_polygon([F, K, H, G])
            model.set_polygon([G, H, M, L])
            model.set_polygon([K, F, L, M])

            # 6. Angles (Wedges)
            model.set_wedge(E, E1, E1, E2)
            model.set_wedge(K, H, H, F)
            model.set_wedge(H, G, G, M)
            model.set_wedge(H, K, K, G)
            model.set_wedge(G, H, H, F)
            model.set_wedge(G, H, H, L)

            return model


        if __name__ == "__main__":
            construct_g1()