F.49 Vesica Piscis and Acute-Obtuse Probability — Code

When segment AB of length c is the longest side of triangle ABC, vertex C lies inside the vesica piscis of area c^2 (4 pi - 3 sqrt(3))/6; the semicircle of diameter AB partitions each quadrant of area c^2 (4 pi - 3 sqrt(3))/24 into an obtuse region (O) = c^2 pi / 16 and an acute region (A) = c^2 (5 pi - 6 sqrt(3))/48, giving an exact obtuse-to-acute probability ratio (O)/(A) = 3 pi / (5 pi - 6 sqrt(3)) approx 1.773.
ABC ( A B ) ( B A ) circumcircle CD AB A (0.000, 0.000) B (4.000, 0.000) C (2.000, 3.464) D (2.000, -3.464) M (2.000, 0.000) G (2.000, 1.155) AA BB CC DD MM GG + − ⟲ Lbl Gde

Output of model.py for F.49 (Vesica Piscis and Acute-Obtuse Probability).

Symbolic Construction Script (model.py)

"""GEOMETOR Fundamentals construction model for F.49: Vesica Piscis and Acute-Obtuse Probability.

        Enunciation:
            When segment AB of length c is the longest side of triangle ABC, vertex C lies inside the vesica piscis of area c^2 (4 pi - 3 sqrt(3))/6; the semicircle of diameter AB partitions each quadrant of area c^2 (4 pi - 3 sqrt(3))/24 into an obtuse region (O) = c^2 pi / 16 and an acute region (A) = c^2 (5 pi - 6 sqrt(3))/48, giving an exact obtuse-to-acute probability ratio (O)/(A) = 3 pi / (5 pi - 6 sqrt(3)) approx 1.773.
        """
        from __future__ import annotations

        from pathlib import Path

        import sympy as sp
        from geometor.fundamentals.construct import build_topic_model
        from geometor.fundamentals.render import render_svg
        from geometor.model import Model


        def construct_f_49() -> tuple[Model, dict[str, sp.Expr]]:
            """Construct the exact symbolic/geometric model for F.49 (Vesica Piscis and Acute-Obtuse Probability).

            Returns:
                Tuple of the populated `geometor.model.Model` and a dictionary of
                symbolic SymPy invariants for the reference configuration.
            """
            model, _ = build_topic_model(49, 'Vesica Piscis and Acute-Obtuse Probability')

            # Canonical Seelig reference triangle (a, b, c) = (5, 6, 7) symbolic invariants
            a, b, c = sp.Integer(5), sp.Integer(6), sp.Integer(7)
            s = (a + b + c) / 2
            area = sp.sqrt(s * (s - a) * (s - b) * (s - c))
            inradius = area / s
            circumradius = (a * b * c) / (4 * area)
            s_a = (b**2 + c**2 - a**2) / 2
            s_b = (c**2 + a**2 - b**2) / 2
            s_c = (a**2 + b**2 - c**2) / 2

            invariants: dict[str, sp.Expr] = {
                "s": s,
                "K": area,
                "r": sp.simplify(inradius),
                "R": sp.simplify(circumradius),
                "S_A": s_a,
                "S_B": s_b,
                "S_C": s_c,
            }
            return model, invariants


        if __name__ == "__main__":
            here = Path(__file__).resolve().parent
            model, extra_curves = build_topic_model(49, 'Vesica Piscis and Acute-Obtuse Probability')
            svg_out = render_svg(model, here / "f-49.svg", extra_curves=extra_curves)
            _, sym_invariants = construct_f_49()
            print(f"F.49: Vesica Piscis and Acute-Obtuse Probability")
            print(f"  Elements in model: {len(model)}")
            print(f"  Rendered SVG:      {svg_out.name}")
            for k, v in sym_invariants.items():
                print(f"  {k} = {v}")