The arcs of a PrePolygon, and inserting a vertex #
Schoenflies.PrePolygon is Schoenflies.ClosedPolygon without the corner field, so its
vertices may sit anywhere on the curve. This module carries §1 and §2 of the blueprint for such
a presentation: the edge list of an arc, the arc as a set, the two arcs of a splitting, and the
construction that makes the whole thing worth having — a prescribed point of the curve can be
made a vertex.
Everything below is the Schoenflies.ClosedPolygon development of
Schoenflies/PolygonBridge.lean, Schoenflies/ParitySplitting.lean,
Schoenflies/PolygonalCrosscut.lean and Schoenflies/Realization.lean with the structure
changed; every proof uses only vertex_inj and edges_meet, and corner is never mentioned.
Why this module exists #
Schoenflies/Graph/K33Land.lean and Schoenflies/FaceCyclesLand.lean each needed the same
apparatus and each transcribed it, the second under an FC suffix. The two copies were not
alpha-equivalent — insertLast in particular carried an extra hypothesis in one of them — so
the import checker never complained, and there were two of everything. This module is the
single copy; both consumers import it.
The one signature that genuinely differed is Schoenflies.PrePolygon.insertLast. The
FaceCyclesLand copy took, besides hz : z ∈ openSegment ℝ (P.vertex (-1)) (P.vertex 0), a
hypothesis ∀ j, P.vertex j ≠ z saying the new point is not already a vertex. That is not an
extra assumption but a consequence: Schoenflies.PrePolygon.vertex_ne_of_mem_openSegment
derives it from hz. The general form — the one with hz alone — is what survives here.
Inserting a vertex, and why it is the crux #
Schoenflies.PrePolygon.deleteLast removes a vertex at which the curve runs straight (the
blueprint's Lemma 1.8); Schoenflies.PrePolygon.insertLast is the inverse move, and it is the
reason PrePolygon is the right structure for a consumer that needs named points to be
vertices. The vertex is inserted at the end of the list, interior to the last edge, so that the
only edge that changes is the last one, which splits in two;
Schoenflies.PrePolygon.rotate brings any edge there. Simplicity survives because the far end
of the split edge lies on neither half.
Blueprint #
Schoenflies.PrePolygon.vertex_natCast_ne,…edge_meet_earlier— the elementary simplicity facts, §1.Schoenflies.PrePolygon.chain,…mem_chain_iff,…isArcBetween_chain— the union of the firstkedges, and that it is an arc.Schoenflies.PrePolygon.arcPieces,…arcPieces_add,…arcPieces_full,…isChainFrom_arcPieces,…arcPieces_split_perm,…sameEdges_arcPieces_split,…parity_splitting— the edge list of an arc, and Lemma 2.7 for it.Schoenflies.PrePolygon.arc,…arc_union,…arc_inter,…isArcBetween_arc,…arc_not_subset_endpoints,…isCompact_arc— the two arcs of a splitting, §2.Schoenflies.PrePolygon.parity_ne_iff_mem_farRegion—thm:polygonal-jordanread as a separation criterion.Schoenflies.PrePolygon.arcList,…poly_arcList,…isPolygonal_arc— an arc as a polyline, which is how it is glued to a crosscut.Schoenflies.segment_halves_inter,Schoenflies.right_notMem_left_half,Schoenflies.left_notMem_right_half— §1: cutting a segment at an interior point, in order. General-purpose; they belong besideSchoenflies.segment_splitinSchoenflies/SegmentCut.lean.Schoenflies.PrePolygon.insertLast,…carrier_insertLast,Schoenflies.PrePolygon.exists_prePolygon_insert,…exists_prePolygon_vertices— the inverse of the blueprint's "delete redundant vertices" (Lemma 1.8): insert one, anywhere on the curve.Schoenflies.exists_prePolygon_points,…exists_prePolygon_split— §1, the realization theorem with the cut points anywhere on the curve. CompareSchoenflies.exists_closedPolygon_split, which requires them to be corners.
Indices, edges and the elementary simplicity facts #
Verbatim the Schoenflies.ClosedPolygon facts of Schoenflies/PolygonBridge.lean whose proofs
use only vertex_inj and edges_meet.
The chain of the first k edges, and that it is an arc #
The partial chains are arcs. One edge at a time, glued at the vertex they share.
The edge list of an arc #
Schoenflies.ClosedPolygon.arcPieces with the structure changed; every proof below uses only
vertex_inj and edges_meet, so it is the old proof verbatim.
The edge list of the arc of P that leaves vertex a and runs forward through k edges.
Equations
Instances For
Running through all m + 3 edges from vertex 0 is the whole edge list.
An arc is a chain from its first vertex to its last.
The two arcs from a vertex use every edge exactly once.
A curve of the split occupies its arc together with the crosscut.
A point off P and off the crosscut is off J.
Parity splitting (Lemma 2.7) for a polygon presented with redundant vertices.
The arcs as sets #
The arc of P that leaves vertex a and runs forward through k edges, as a set.
Equations
- P.arc a k = Schoenflies.cover (P.arcPieces a k)
Instances For
An arc is compact: it is a finite union of segments.
The first vertex of a nonempty arc lies on it.
An arc of a splitting is an arc between the two cut vertices.
An interior point of the first edge of an arc: a point of the arc that is neither cut vertex, which is what says the arc is more than its two ends.
The crossing count separates points exactly as the polygon does (Theorem 2.3, read as a criterion), for a polygon presented with redundant vertices.
An arc as a polyline #
arc a k is the carrier of the vertex list v a, v (a+1), …, v (a+k); that is how it is seen
to be polygonal, and how it is glued to a crosscut.
Cutting a segment at an interior point, in order #
The two halves of a cut segment meet only at the cut, and neither reaches the far end of the
other. Both are read off Schoenflies/SegmentOrder.lean: along a nondegenerate segment the
distance from one end is a coordinate.
The far end of a cut segment is not on the near half.
The near end of a cut segment is not on the far half.
Inserting a vertex #
Schoenflies.PrePolygon.deleteLast removes a redundant vertex; this is the inverse operation,
and it is what makes PrePolygon the right presentation for a consumer that must cut the curve
at prescribed points. The vertex is inserted at the end of the list, interior to the last edge;
Schoenflies.PrePolygon.rotate brings any edge there.
The last edge, with its second endpoint written as vertex 0.
The vertex family with z appended at the end: the old numerals name the old vertices, and
the one new index names z.
Instances For
The polygon with one extra vertex, interior to its last edge — equivalently, with the last edge split in two at a prescribed interior point.
Equations
- P.insertLast hz = { vertex := P.insVertex z, vertex_inj := ⋯, edges_meet := ⋯ }
Instances For
Inserting a vertex does not move the curve.
The inserted vertex is a vertex.
The old vertices are still vertices.
A named point of the curve becomes a vertex, and the old vertices stay vertices. Either
the point already is a vertex, or it is interior to exactly one edge, and then that edge is
brought to the end of the list by Schoenflies.PrePolygon.rotate and cut by
Schoenflies.PrePolygon.insertLast.
Every point of a finite list on the curve can be made a vertex at once.
A one-edge arc is that edge.
The realization theorem, with the cut points anywhere on the curve #
Schoenflies.exists_closedPolygon_split requires the two cut points to be corners, and by
Schoenflies.ClosedPolygon.isCornerAt_vertex that requirement cannot be dropped while the
realization is a ClosedPolygon. For a PrePolygon there is no such obstruction: a point of the
curve is either already a vertex or interior to an edge, and an edge may be cut.
The realization theorem for PrePolygon, with named points. Any finite list of points of
the curve — corners or not — can be required to be among the vertices.
The realization theorem tracking two named points, for a presentation that may carry
redundant vertices. Unlike Schoenflies.exists_closedPolygon_split this asks nothing of the two
points but that they lie on the curve: a PrePolygon has no corner field to obstruct a vertex
where the curve runs straight.