G.583 segment cut extreme — Code

XIII.5

If a segment be cut in extreme and mean ratio, and there be added to it a segment equal to the greater segment, the whole segment has been cut in extreme and mean ratio, and the original segment is the greater segment.
D A C B L H K E
"""Programmatic construction for Book XIII, Proposition 5 (XIII.5).

        If a straight line be cut in extreme and mean ratio, and there be added to it
        a straight line equal to the greater segment, the whole straight line has been
        cut in extreme and mean ratio, and the original straight line is the greater
        segment.
        """

        from __future__ import annotations

        from geometor.model import Model


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

            # Straight line AB cut in extreme and mean ratio at C, with AD = AC
            D = model.set_point(12.0, -26.0, classes=["given"], ID="D")
            A = model.set_point(93.0, -26.0, classes=["given"], ID="A")
            C = model.set_point(174.0, -26.0, classes=["given"], ID="C")
            B = model.set_point(228.0, -26.0, classes=["given"], ID="B")

            model.construct_line(D, B)
            model.set_segment(D, B)
            model.set_segment(D, C)
            model.set_segment(D, A)
            model.set_segment(A, B)
            model.set_segment(A, C)
            model.set_segment(C, B)

            # Grid points of square AE on AB and square DH on AD
            L = model.set_point(12.0, -107.0, ID="L")
            H = model.set_point(93.0, -107.0, ID="H")
            F = model.set_point(174.0, -107.0, ID="F")
            K = model.set_point(228.0, -107.0, ID="K")

            M = model.set_point(93.0, -161.0, ID="M")
            G = model.set_point(174.0, -161.0, ID="G")
            E = model.set_point(228.0, -161.0, ID="E")

            # Horizontal segments
            model.set_segment(L, K)
            model.set_segment(L, H)
            model.set_segment(H, F)
            model.set_segment(F, K)
            model.set_segment(M, E)
            model.set_segment(M, G)
            model.set_segment(G, E)

            # Vertical segments
            model.set_segment(D, L)
            model.set_segment(A, M)
            model.set_segment(A, H)
            model.set_segment(H, M)
            model.set_segment(C, G)
            model.set_segment(C, F)
            model.set_segment(F, G)
            model.set_segment(B, E)
            model.set_segment(B, K)
            model.set_segment(K, E)

            # Diagonal AE
            model.set_segment(A, E)
            model.set_segment(A, F)
            model.set_segment(F, E)

            # Polygons (squares and rectangles)
            model.set_polygon([A, B, E, M])
            model.set_polygon([D, B, K, L])
            model.set_polygon([D, A, H, L])
            model.set_polygon([A, C, F, H])
            model.set_polygon([C, B, E, G])
            model.set_polygon([H, K, E, M])
            model.set_polygon([A, B, K, H])
            model.set_polygon([C, B, K, F])
            model.set_polygon([H, F, G, M])
            model.set_polygon([F, K, E, G])

            return model


        if __name__ == "__main__":
            construct_g1()