G.56 transversal angles of parallel lines — Code

I.29

A transversal cutting parallel lines makes alternate interior angles equal, exterior and opposite interior angles equal, and same-side interior angles supplementary.
Euclid's Elements, Book I, Proposition 29 Straight line EF falling on parallel straight lines AB and CD at G and H. E A G B C H D F
"""Programmatic construction for Book I, Proposition 29 (I.29).

        A straight line falling on parallel straight lines makes the alternate angles
        equal to one another, the exterior angle equal to the interior and opposite
        angle, and the interior angles on the same side equal to two right angles.
        """

        from __future__ import annotations

        from geometor.model import Model


        def construct_g1() -> Model:
            """Construct the figure for Book I, Proposition 29 (I.29) using geometor.model."""
            model = Model("I.29")

            A = model.set_point(20, -69.5, classes=["given"], ID="A")
            B = model.set_point(180, -69.5, classes=["given"], ID="B")
            C = model.set_point(20, -116.5, classes=["given"], ID="C")
            D = model.set_point(180, -116.5, classes=["given"], ID="D")
            E = model.set_point(64, -36, classes=["given"], ID="E")
            F = model.set_point(134.5, -148, classes=["given"], ID="F")
            G = model.set_point(85, -69.5, ID="G")
            H = model.set_point(114.5, -116.5, ID="H")

            model.construct_line(A, B)
            model.construct_line(C, D)
            model.construct_line(E, F)

            model.set_segment(A, B)
            model.set_segment(A, G)
            model.set_segment(G, B)
            model.set_section([A, G, B])

            model.set_segment(C, D)
            model.set_segment(C, H)
            model.set_segment(H, D)
            model.set_section([C, H, D])

            model.set_segment(E, F)
            model.set_segment(E, G)
            model.set_segment(G, H)
            model.set_segment(H, F)
            model.set_section([E, G, H])
            model.set_section([G, H, F])

            model.set_polygon([A, G, H, C])
            model.set_polygon([B, G, H, D])

            # Angles at G and H
            model.set_wedge(G, A, A, H)
            model.set_wedge(G, B, B, H)
            model.set_wedge(G, E, E, B)
            model.set_wedge(H, G, G, D)

            return model


        if __name__ == "__main__":
            construct_g1()