Theorem 2.8: two-sided polygonal crosscuts #
A crosscut P of a simple closed polygon C cuts one of the two regions of ℝ² ∖ C into
exactly two, bounded by the two curves Jᵢ = Aᵢ ∪ P; and ℝ² ∖ (C ∪ P) then has exactly three
regions, with boundaries C, J₁, J₂.
One theorem, not two #
The blueprint splits the statement into case (a), the crosscut inside C, and case (b), the
crosscut outside. The two cases differ only in which region of ℝ² ∖ Jᵢ is the new cell: in
case (a) it is Int(Jᵢ) for both i, while in case (b) it is Ext(J₁) for one index and
Int(J₂) for the other, and which is which is not determined by the data. What is uniform is
the description "the region of ℝ² ∖ Jᵢ on the far side from a point y of the region of
ℝ² ∖ C that the crosscut does not enter". So the whole theorem is proved once, for
farRegion J y = the region of `ℝ² ∖ J` that does not contain `y`,
and the two cases of the blueprint are then read off by identifying farRegion with inside
or with outside (IsSeparating.farRegion_eq_inside, …_eq_outside). A reference point y
in the untouched region is the one extra datum this costs, and it is exactly the datum the
blueprint hides in the phrase "let Ω be the region containing P ∖ {p, q}".
Exhaustion is pure parity, in both cases at once #
Lemma 2.6 (Schoenflies.crosscut_cells) already exhibits the two cells as components of
Ω ∖ P. All that Theorem 2.8 adds is that there are no others, and the blueprint reads this
off Lemma 2.7. Here the reading is uniform. Write πJ for the crossing count of a curve J.
For points x, y off J — Theorem 2.3 —
`x` and `y` lie in different regions of `ℝ² ∖ J` ↔ `πJ(x) ≠ πJ(y)`,
which is ClosedPolygon.parity_ne_iff_mem_farRegion. Lemma 2.7 gives
πJ₁ + πJ₂ = πC at every point, so subtracting the identity at y from the identity at x
turns "x is separated from y by C" into "x is separated from y by exactly one of
J₁, J₂" — IsPolygonalCrosscut.separates_xor, whose entire proof is sixteen cases of ZMod 2
arithmetic. No case distinction on inside/outside is made anywhere.
The hypotheses, bundled #
IsPolygonalCrosscut C J₁ J₂ K a k y collects the seven hypotheses of the theorem: the two
curves of the split carry the right edges (Schoenflies.SameEdges, from Lemma 2.7), the
crosscut meets C only in points common to both arcs, and the reference point y lies off C
in a region the crosscut does not enter. It is closed under swapping the two arcs
(IsPolygonalCrosscut.symm), which is why every statement below is proved for index 1 only.
Realizing J₁ and J₂ as ClosedPolygons is the consumer's job, exactly as in Lemma 2.7 —
see the note there about the corner field. Nothing in this file inspects corner.
Blueprint #
farRegion,IsSeparating.isRegionPair_farRegion,IsSeparating.farRegion_eq_inside,IsSeparating.farRegion_eq_outside— the blueprint'sΩ,Ω†,VᵢandWᵢnamed as functions of a reference point instead of by an existential.ClosedPolygon.arc— the arcsA₁, A₂of Theorem 2.8, as sets;…vertex_mem_arc,…vertex_add_mem_arc,…endpoints_subset_arc,…endpoints_subset_arc'— the two cut vertices lie on both arcs, which is what "the crosscut meetsConly in its endpoints" has to say to be usable.ClosedPolygon.parity_ne_iff_mem_farRegion— Theorem 2.3 read as a separation criterion.IsPolygonalCrosscut— the hypotheses of Theorem 2.8;IsPolygonalCrosscut.of_endpointsis the constructor a consumer should use, andIsPolygonalCrosscut.symmswaps the two arcs.IsPolygonalCrosscut.separates_xor— Lemma 2.7's "consequently", in the uniform form.IsPolygonalCrosscut.region_eq,…cells_disjoint,…cells_ne,…cell_isComponent₁/₂,…frontier_cell₁/₂,…closure_cell_inter₁/₂— the two cells ofΩ ∖ P.IsPolygonalCrosscut.inside_diff_eq— Theorem 2.8(a).IsPolygonalCrosscut.outside_diff_eq,…inside_exactly_one— Theorem 2.8(b).IsPolygonalCrosscut.compl_eq,…isComponent,…near_isComponent,…cell_isComponent_compl₁/₂,…cell_ne_near₁/₂,…frontier_near— "in either caseℝ² ∖ (C ∪ P)has exactly three regions, with boundariesC, J₁, J₂".polygonal_crosscut— Theorem 2.8, bundled.
The region on the far side of a point #
The blueprint names the four regions in play — Ω, Ω†, Wᵢ, Vᵢ — by their relation to one
another: Ω† is the region of ℝ² ∖ C the crosscut does not enter, and Vᵢ is the region of
ℝ² ∖ Jᵢ on the other side of Jᵢ from Ω†. Fixing a point y ∈ Ω† turns all four into
functions of the data.
The region of ℝ² ∖ C that does not contain y: everything off C except the
component of y. For a separating curve this really is the other region
(IsSeparating.isRegionPair_farRegion); no hypothesis is needed to define it.
Equations
- Schoenflies.farRegion C y = Cᶜ \ connectedComponentIn Cᶜ y
Instances For
Off the curve, being in the far region is exactly being in another component.
The component of y and the far region are the two regions of ℝ² ∖ C.
The three regions of ℝ² ∖ (C ∪ P), abstractly #
Lemma 2.6 places the two cells inside Ω ∖ P; the last paragraph of the proof of Theorem 2.8
places all three regions inside ℝ² ∖ (C ∪ P), and the argument is the same each time: an open
connected set whose frontier misses the ambient open set is a component of it (Lemma 1.7).
The untouched region is a component of ℝ² ∖ (C ∪ P): its frontier is C.
A cell is a component of ℝ² ∖ (C ∪ P): its frontier is J ⊆ C ∪ P.
The arcs of a polygon, and parity as a separation criterion #
The arc of C that leaves vertex a and runs forward through k edges, as a set: the
blueprint's A₁ for k edges and A₂ for the remaining m + 3 - k.
Equations
- C.arc a k = Schoenflies.cover (C.arcPieces a k)
Instances For
A curve of the split occupies its arc together with the crosscut.
The crossing count separates points exactly as the polygon does (Theorem 2.3, read as a
criterion). Two points off the polygon lie in different regions precisely when their crossing
counts differ: equal components force equal counts by Lemma 2.2, and different components are
the bounded and the unbounded one, whose counts are 1 and 0.
The first vertex of a nonempty arc lies on it.
The two cut vertices lie on both arcs. This is what turns the blueprint's "the crosscut
meets C only in its two endpoints" into the hypotheses meets₁ and meets₂.
The hypotheses of Theorem 2.8 #
The setting of Theorem 2.8. K is the edge list of a polygonal crosscut of the polygon
C, cutting it at the vertices a and a + k; J₁ and J₂ are the two closed curves formed
by the crosscut with each of the two arcs; and y is a point of the region of ℝ² ∖ C that the
crosscut does not enter, which is what fixes which side of C the crosscut is on.
The blueprint's "P is a simple arc meeting C exactly in its two endpoints" appears here in
two pieces: meets₁ and meets₂ say that whatever the crosscut has in common with C lies on
both arcs, which for a genuine crosscut is the two cut vertices (ClosedPolygon.vertex_mem_arc,
ClosedPolygon.vertex_add_mem_arc); and simplicity is carried by the assumption that J₁ and
J₂ really are ClosedPolygons. Nothing else about K is assumed — not even that its pieces
are nondegenerate, which follows from edges₁.
The first arc runs forward through at most a full turn.
J₁carries the edges of the first arc together with those of the crosscut.J₂carries the edges of the second arc together with those of the crosscut.The crosscut meets the polygon only in points of the first arc …
… and only in points of the second arc.
- notMem : y ∉ C.carrier
The reference point lies off the polygon …
- avoids : Disjoint (cover K) (connectedComponentIn C.carrierᶜ y)
… and the crosscut does not enter its region.
Instances For
The front door. A crosscut is normally presented by saying that it meets C exactly in
its two endpoints, and that those endpoints are the two cut vertices; meets₁ and meets₂
follow, because both cut vertices lie on both arcs. The bound k ≤ m + 2 says the second arc is
nonempty, as 1 ≤ k says the first one is.
The two arcs may be swapped. Every statement below is therefore proved for J₁ only.
The elementary consequences #
The edges of the crosscut are nondegenerate, because they are edges of J₁.
A ray direction transverse to every edge of C and of the crosscut at once.
The two cells #
Lemma 2.6 applies with Ω = farRegion C.carrier y, Ω' = connectedComponentIn C.carrierᶜ y,
Wᵢ = connectedComponentIn Jᵢ.carrierᶜ y and Vᵢ = farRegion Jᵢ.carrier y. The inclusion
Ω' ⊆ Wᵢ — the blueprint's "being connected it lies in one region of ℝ² ∖ Jᵢ" — is
near_subset₁, and needs no separation hypothesis at all.
The untouched region of ℝ² ∖ C lies in one region of ℝ² ∖ J₁, namely the one of y.
Lemma 2.6(a), first half: the cell lies in Ω ∖ P.
Lemma 2.6(a): the cell is a connected component of Ω ∖ P.
Lemma 2.6(c): the closure of the cell meets the polygon exactly in its arc.
The cell has J₁ as its frontier.
Exhaustion: the crossing counts add up #
This is the whole of Theorem 2.8 beyond Lemma 2.6, and it is one ZMod 2 computation.
A point off C ∪ P is separated from y by C exactly when it is separated from y by
exactly one of J₁, J₂. Lemma 2.7 gives πJ₁ + πJ₂ = πC at every point; evaluating it at x
and at y and subtracting turns the three "different region" statements — which Theorem 2.3
reads off the three crossing counts — into the exclusive disjunction.
Theorem 2.8, the two cells. The region the crosscut enters, with the crosscut removed, is the disjoint union of the two cells.
A cell is not the untouched region: it lies on the other side of C.
The three regions of ℝ² ∖ (C ∪ P) #
The three regions together are the whole of ℝ² ∖ (C ∪ P).
The untouched region is a component of ℝ² ∖ (C ∪ P), with frontier C.
The first cell is a component of ℝ² ∖ (C ∪ P), with frontier J₁.
"ℝ² ∖ (C ∪ P) has exactly three regions." Every component is one of the three named
sets, and each of the three is a component (cell_isComponent_compl₁, …₂,
near_isComponent). Their frontiers are J₁, J₂ and C.
The blueprint's two cases #
Seen from the unbounded region of C, J₁ too has y outside it: otherwise the unbounded
Ext(C) would sit inside the bounded Int(J₁).
Theorem 2.8(a). If the crosscut runs inside C — that is, if the reference point y
lies in Ext(C) — then Int(C) ∖ P is exactly the union of the two bounded regions of J₁ and
J₂, and those two are disjoint.
Theorem 2.8(b). If the crosscut runs outside C — that is, if y ∈ Int(C) — then
Ext(C) ∖ P has exactly the two regions farRegion Jᵢ.carrier y, whose frontiers are J₁ and
J₂ (frontier_cell₁, frontier_cell₂) and which are components of it
(cell_isComponent₁, …₂). Which of the two is Int(Jᵢ) and which Ext(Jᵢ) is settled by
inside_exactly_one.
In case (b), Int(C) lies inside exactly one of J₁, J₂ — the blueprint's "relabel so that
it lies inside J₁".
Theorem 2.8 (two-sided polygonal crosscuts). Let C be a simple closed polygon, K the
edge list of a polygonal crosscut cutting it at the vertices a and a + k, and J₁, J₂ the
two closed polygons formed by the crosscut with the two arcs. Let y be a point of the region
of ℝ² ∖ C that the crosscut does not enter, and write Ω = farRegion C.carrier y for the
other region and Vᵢ = farRegion Jᵢ.carrier y for the region of ℝ² ∖ Jᵢ on the far side from
y. Then
Ω ∖ Pis the disjoint union ofV₁andV₂, which are its two connected components;- their frontiers are
J₁andJ₂, and the closure ofVᵢmeetsCexactly in the arcAᵢ; ℝ² ∖ (C ∪ P)has exactly three regions,V₁,V₂and the region ofy.
Case (a) of the blueprint is IsPolygonalCrosscut.inside_diff_eq, which rewrites Ω as
Int(C) and Vᵢ as Int(Jᵢ); case (b) is IsPolygonalCrosscut.outside_diff_eq.