Shortest-Path Law of Reflection (Catoptrica Prop. 4)

Hero’s Mirror-Unfolding Variational Proof Preserved in Greek by Olympiodorus — Codex Reference: Definitiones, Catoptrica & Dioptra: Genetic Axiomatics, Universal Gnomon, Shortest-Path Optics & Mountain Tunneling

Interactive Construction (catoptrica-reflection.svg)

Hover or click any geometric label—plane mirror AB, visual source C, object D, reflected virtual image K, optimal incidence point E, or perturbed triangle CZK—to inspect Hero’s shortest-path proof:

Hero Catoptrica Prop. 4 — Variational Shortest-Path Proof of the Law of Reflection [ A B ]: y = 0 [ D F ]: x - 10 = 0 [ C K ]: 9*x + 9*y - 36 = 0 [ E D ]: -6*x + 6*y + 24 = 0 / C E /: |seg| = 3*sqrt(2) / E D /: |seg| = 6*sqrt(2) / E K /: |seg| = 6*sqrt(2) / C Z /: |seg| = 3*sqrt(5) / Z D /: |seg| = 3*sqrt(5) / Z K /: |seg| = 3*sqrt(5) / D H /: |seg| = 6 / H K /: |seg| = 6 A = (0, 0) B = (12, 0) C = (1, 3) D = (10, 6) Z = (7, 0) H = (10, 0) K = (10, -6) E = (4, 0) A B C D Z H K E

Exact Symbolic Unfolding in geometor.model

Setting mirror AB along \(y = 0\), eye C \(= (1, 3)\), and target D \(= (10, 6)\):

  1. Dropping perpendicular DH onto AB gives foot H \(= (10, 0)\), and compass reflection across H gives virtual image K \(= (10, -6)\).

  2. Joining the straight line CK intersects mirror AB at the unique equal-angle point E \(= (4, 0)\):

    • Incidence and reflection spreads with the mirror are strictly equal: \(s(AB, CE) = s(AB, ED) = \frac{1}{2}\) (\(45^\circ\)).

    • Total unfolded ray length is \(|CE| + |ED| = 3\sqrt{2} + 6\sqrt{2} = 9\sqrt{2} = |CK|\), with exact squared length \((9\sqrt{2})^2 = 162\).

  3. For any perturbed mirror point such as Z \(= (7, 0)\), congruence ZD = ZK and Euclid’s triangle inequality ([I.20]) on CZK yield:

    \[|CZ| + |ZD| = 3\sqrt{5} + 3\sqrt{5} = 6\sqrt{5}, \qquad (6\sqrt{5})^2 = 180 > 162 = (|CE| + |ED|)^2.\]

Executable Python API

import sympy as sp
        from geometor.heron import construct_catoptrica_reflection

        model, inv = construct_catoptrica_reflection()
        assert inv["incidence_spread"] == inv["reflection_spread"] == sp.Rational(1, 2)
        assert inv["optimal_length_sq"] == 162
        assert inv["perturbed_length_sq"] == 180