The constants of a polygonal collar exist #
Schoenflies.StripData names the three numbers the two-sided strip lemma runs on — a cone
radius R, a trim lam and a half-width rho — together with the separation hypotheses they
have to satisfy. Everything in Schoenflies/Strip.lean is stated for a given StripData;
this module produces one, removing that parameter from the resulting theorem.
The recipe is the blueprint's own, in the blueprint's order:
Rfrom three sources — the pairwise vertex separations, the distance from each vertex to each nonincident edge, and the prescribed open set — each an instance of Lemma 1.4, plusR ≤ len iso that a sector cannot run past the far end of an incident edge. The vertex separations are asked for with a factor2of slack, which is what the block-versus-sector estimates ofStrip.leanspend.lam := R / 5, which gives2 * lam < Rand, throughR ≤ len i, also4 * lam < len i.rhofrom the distance of each trimmed edge to every other edge, and from the germ thresholdrho * (1 + |⟪r₁, r₂⟫|) ≤ lam * |det r₁ r₂|at every vertex. The determinant is nonzero at a corner, so the threshold is a positive upper bound onrhoand is met by shrinking;rho < lamis one more shrinking.
Steps 1 and 3 are finite families of positive bounds, combined by
Schoenflies.exists_pos_forall_of_finite.
What simplicity is used for #
Two of the separations are false for a self-touching closed polygonal curve, and each is the
exact point where ClosedPolygon.edges_meet is consumed:
ClosedPolygon.vertex_notMem_edge— a vertex lies on no edge but the two incident to it. This is what makes{vertex i}andedge jdisjoint compact sets.ClosedPolygon.trimmed_disjoint_edge— the trimmed core of an edge misses every other edge. Here the two endpoints allowed byedges_meetare excluded by the trim itself, since a point of the core is at distance at leastlamfrom both.
edges_meet as stated is one-sided (edge i ∩ edge j ⊆ {vertex i, vertex (i + 1)}), but it is
quantified over all ordered pairs, so the symmetric instance is available and both proofs below
use whichever side is convenient. It carries enough simplicity for both statements.
Blueprint #
Schoenflies.exists_stripData_subset— the constants of Lemma 1.8 (Two-sided polygonal strips), chosen inside a prescribed open set containing the curve; this is the "Lemma 1.4 (a) lets all disks and strips be chosen inside the prescribed open set" of the last paragraph of the proof.Schoenflies.exists_stripData— the same without a prescribed open set.Schoenflies.ClosedPolygon.exists_cone_radius,Schoenflies.ClosedPolygon.exists_half_width— steps 1 and 3 of the recipe, which are the instances of Lemma 1.4 that Lemma 1.8 consumes.Schoenflies.StripData.nbhd_subset_thickening— the collar of Lemma 1.8 lies in theR-neighbourhood of the curve, which is how the prescribed open set is honoured.
Compactness of the pieces #
What simplicity gives #
The two statements below are the only consumers of ClosedPolygon.edges_meet in the whole
choice of constants, and neither is true without it.
Simplicity, first form. A vertex lies on no edge but the two edges incident to it.
Without this the "a vertex is 2R away from every nonincident edge" hypothesis of StripData
would be unsatisfiable, since the vertex would sit on one of those edges.
The trimmed core of edge i: the points of the edge at distance at least lam from both
of its endpoints. An edge block of StripData hugs this core.
Instances For
Simplicity, second form. The trimmed core of an edge misses every other edge. The two
common points edges_meet allows are the endpoints of the edge, and the trim removes them: a
core point is at distance at least lam from either endpoint. No lower bound on the edge
length is needed: if the trim eats the whole edge the core is empty.
Where the collar lives #
The collar sits inside the R-neighbourhood of the curve: a sector is inside a ball of radius
R about a point of the curve, and a block is within rho < R of the foot of its
perpendicular, which is on the curve. This is the whole content of "the neighbourhoods may be
chosen inside any prescribed open set containing the curve".
The collar of Strip.lean lies in the R-neighbourhood of the polygon.
Choosing the constants #
Step 1: the cone radius. One positive R that is below every edge length, that
separates the vertices pairwise with a factor 2 to spare, that keeps every vertex 2R away
from every nonincident edge, and whose neighbourhood of the curve stays inside the prescribed
open set.
The germ threshold at a single vertex. The corner condition makes det ≠ 0, so the right
side is positive and the inequality is a genuine upper bound on the half-width.
Step 3: the half-width. One positive rho below lam, separating each trimmed edge
from every other edge with a factor 2 to spare, and meeting the germ threshold at every
vertex. Only 0 < lam is needed: if lam were so large that a trimmed edge came out empty,
its separation clause would be vacuous.
Lemma 1.8, the constants. Every simple closed polygon carries a StripData, and its
collar can be put inside any prescribed open set containing the curve. This is what makes
Schoenflies/Strip.lean with the required constants supplied.
Every simple closed polygon carries a StripData.