Book III · Proposition 32
If a straight line touch a circle, and from the point of contact there be drawn across, in the circle, a straight line cutting the circle, the angles which it makes with the tangent will be equal to the angles in the alternate segments of the circle.Heath, 1908
The tangent-chord angle. It is the limiting case of III.21, and the step IV.3 leans on to circumscribe a triangle.
Rests on: C.N.1, C.N.3, C.N.4, C.N.5, Def.10, Def.15, Def.4, Post.5
Depth: 14 steps of argument above the first principles. Parallel postulate: needed.
@proposition(
"III.32",
THEOREM,
sample=_three_on_a_circle,
note="The tangent-chord angle. It is the limiting case of III.21, and the "
"step IV.3 leans on to circumscribe a triangle.",
)
def prop_III_32(o: Point, a: Point, b: Point, c: Point) -> Out:
"""The tangent at A, and the chord AB, with C in the alternate segment."""
hypothesis("the points lie on the circle",
eq_len(o, a, o, b) and eq_len(o, a, o, c))
hypothesis("ABC is a genuine triangle", not collinear(a, b, c), guard=True)
circle(o, a, "the given circle")
outline(a, b, c)
_tangent_at(o, a, "the tangent at A")
across = _across(o, a)
reach = length(o, a)
ends = [
posit(Point(a.x + across[0], a.y + across[1]), "T"),
posit(Point(a.x - across[0], a.y - across[1]), "S"),
]
# The chord AB divides the tangent's two directions between the two
# segments; the one on the far side from C answers the alternate segment.
alternate = ends[0] if not same_side(ends[0], c, Line.through(a, b)) else ends[1]
# The angle in the alternate segment wants a second point of that segment
# for III.21 to compare C with.
alongside = [point for point in _round(o, a)
if point not in (a, b, c) and same_side(point, c, Line.through(a, b))]
because(prop_III_18, o, a, reach)
if alongside:
because(prop_III_21, o, a, b, c, alongside[0])
claim("the tangent meets the radius at right angles", "III.18",
right_angle(o, a, ends[0]) and sign(reach) > 0)
claim("the angle between tangent and chord equals the angle in the alternate "
"segment", "III.21", eq_angle(alternate, a, b, a, c, b))
return Out(tangent_angle=angle_at(alternate, a, b))