The anchored square mesh #
The geometric core of Proposition prop:anchored-square-mesh, in vocabulary that exists today:
Part II's cellulations, V_boundary and fresh points u(𝒜) are not built here, so the mesh is
stated as a finite plane graph with a straight-line drawing, with the clauses of the
proposition as separate theorems about it.
The construction #
squareMesh δ fresh anchors is meshCount δ concentric ring frames of radii
1/N, 2/N, …, 1 inside Q = [-1,1]², together with one full-length radial spoke
[z, N⁻¹ • z] at each fresh boundary point z. The list of segments is handed to
overlayGraph (Lemma 3.7), which subdivides at every crossing; the anchors are added to the
cut points, which is what makes each of them a vertex.
This is not literally the blueprint's construction, and the difference is deliberate. The
blueprint has one collar λ ≤ ‖x‖∞ ≤ 1 plus a rectangular grid filling λQ. Here the collar
is repeated N times and there is no grid at all: the innermost square N⁻¹ Q is a single
cell, of diameter 2√2/N < δ. That removes the "choose fine enough horizontal and vertical
coordinates, including the four corners and all the points λ z_i" step entirely, and makes
the whole mesh radial, so that one estimate — ‖tz - sw‖ ≤ t‖z - w‖ + |t - s|‖w‖, the
blueprint's own — covers every cell. Nothing downstream can tell the difference: the clauses
are the interface.
The blueprint's cyclic ordering of the fresh points is likewise gone. Where it says "choose
z_0, …, z_{m-1} in cyclic order so that each boundary arc between consecutive ones has
diameter < δ/4", this module takes the order-free consequence as a hypothesis,
FreshDense fresh δ: every connected subset of S avoiding all the fresh points has diameter
at most δ/2. A set-level statement needs no ordering, and it is exactly what the blueprint's
own argument (parametrize S by a circle, cut it into small arcs, put one fresh point inside
each) produces.
What is proved, and what is not #
The clauses about faces, anchors, edges reaching S and connectedness of |T| ∖ S are proved
in full. Two gaps, both stated plainly:
- The outer cycle is proved only as a point set.
squareMesh_cover_outerEdgessays the edges whose segments lie onSoccupy exactlyS. That these edges form a cycle of the graph is not proved: it needs the fresh points, the anchors and the four corners put in cyclic order alongS, which is precisely the ordering this construction was designed to avoid. A later module wanting the outer cycle must build it. - 2-connectivity is not proved at all. It is not present as a hypothesis either — a
hypothesis restating the goal would be worthless. The route is the blueprint's: the innermost
ring is a cycle, and each annulus between consecutive rings is added one rectangle at a time
by
Graph.IsTwoConnected.union, each added cycle sharing at least two vertices with what is already there. Nothing in this module obstructs it.
Connectedness of |T| ∖ S needs at least one fresh point (hz₀ : z₀ ∈ fresh): with no spokes
the rings are disjoint frames.
Blueprint #
ringSet,ringPieces,spokePiece,meshSegments— the mesh as a list of segments.meshGraph,squareMesh— Proposition "Anchored square mesh", the construction itself.FreshDense— the order-free form of "consecutive fresh points bound an arc of diameter< δ/4".squareMesh_face_small— clause 1: every bounded 2-cell has diameter< δ, and lies inQ.squareMesh_anchor_mem_vertexSet— clause 2: every boundary vertex survives.squareMesh_inner_edge_at_fresh,squareMesh_unique_inner_edge— clauses 3 and 4: a new internal edge meetingSends at a fresh point, and exactly one such edge is incident with each fresh point.squareMesh_cover_outerEdges— the point-set half of "Sis the outer cycle" (see above).squareMesh_isConnected_diff— clause 6:|T| ∖ Sis connected.radial_diam_bound— the blueprint's radial estimate, isolated from all graph language.subdivide_covers_source,subdivide_end_of_mem— two general facts aboutsubdividethat belong inSchoenflies/Subdivide.lean.
Rings: the frame of a square about the origin #
The frame of the square of radius r about the origin. For r = 1 this is definitionally
modelCurve.
Equations
- Schoenflies.ringSet r = {x : Schoenflies.Plane | x.supNorm = r}
Instances For
The four sides of the square of radius r, as a list of pieces.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The four sides of the square of radius r occupy exactly its frame.
A ring of positive radius has nondegenerate sides.
Radial segments #
Every point of a segment between two multiples of z is itself a multiple of z, with the
coefficient running through the corresponding real segment. This is the only fact about spokes
the whole module uses: along a spoke the coefficient — equivalently, by
supNorm_smul_of_mem_modelCurve, the sup norm — is a faithful coordinate.
Spokes #
A spoke meets the model curve exactly at its outer end.
A spoke lies inside the closed square.
Two more facts about subdivide #
Both are general and belong beside the others in Schoenflies/Subdivide.lean; they are here
because that module is on main.
subdivide_covers_source refines subdivide_cover: a point of a named source piece lies on
a piece of the subdivision inside that source. Without the "inside that source" clause one
cannot tell, of a point where two sources cross, which of them the piece through it came from
— and the whole description of the mesh's edges is by their source.
subdivide_end_of_mem is the converse of subdivide_avoids: a cut point that lies on a source
piece is not merely absent from every interior, it is an endpoint of a piece inside that
source. That is what makes a prescribed point a vertex of the overlay graph.
Enlarging the list of cut points #
Both cut-point conditions ask only that certain points be in the list, so both survive adding more. That is what lets the mesh prescribe extra vertices — the anchors — on top of the cut points the overlay itself needs.
The mesh, as a list of segments #
N concentric ring frames of radii 1/N, 2/N, …, 1, and one full-length radial spoke at each
fresh boundary point. There is no rectangular grid: the innermost region is the square of
radius 1/N, which is a single cell of diameter 2√2/N, so filling it is unnecessary once N
is large. That is the one deviation from the blueprint's construction, and it removes the whole
"choose horizontal and vertical coordinates" step.
The radii of the N concentric rings, 1/N, 2/N, …, 1.
Equations
- Schoenflies.meshRadii N = List.map (fun (j : ℕ) => (↑j + 1) / ↑N) (List.range N)
Instances For
The mesh: the four sides of each ring, and one radial spoke at each fresh point.
Equations
- Schoenflies.meshSegments N fresh = List.flatMap Schoenflies.ringPieces (Schoenflies.meshRadii N) ++ List.map (Schoenflies.spokePiece N) fresh
Instances For
A side of a ring lies on that ring.
Every mesh segment lies inside the closed square.
The mesh as a plane graph #
The cut points are the ones exists_cut_points supplies for the mesh segments, together with
the prescribed anchors. Enlarging the list is harmless — EndsAreCut.mono and
MeetsAreCut.mono — and it is what makes each anchor a vertex.
Cut points for the mesh segments, as produced by exists_cut_points.
Equations
- Schoenflies.meshCutPoints N fresh = ⋯.choose
Instances For
The cut points of the mesh: what the overlay needs, plus the prescribed anchors.
Equations
- Schoenflies.meshPoints N fresh anchors = anchors ++ Schoenflies.meshCutPoints N fresh
Instances For
The mesh graph.
Equations
- Schoenflies.meshGraph N fresh anchors = Schoenflies.overlayGraph (Schoenflies.meshSegments N fresh) (Schoenflies.meshPoints N fresh anchors)
Instances For
A side of the outer ring is a mesh segment.
Every prescribed anchor on S is a vertex of the mesh. This is what the list of
anchors is for: subdivide_end_of_mem turns "is a cut point on a segment" into "is an
endpoint of a piece", and an endpoint of a piece is a vertex of the overlay graph.
Clause 3: the outer edges occupy exactly S #
The blueprint asks for S to be the union of the edge arcs of a cycle. What is proved here
is the point-set half: the edges whose arcs lie on S occupy exactly S. See the module
docstring.
The edges of the mesh that lie on the model curve.
Equations
- Schoenflies.outerEdges N fresh anchors = {P : Schoenflies.Piece | P ∈ (Schoenflies.meshGraph N fresh anchors).edgeSet ∧ P.seg ⊆ Schoenflies.modelCurve}
Instances For
The outer edges occupy exactly the model curve.
Clause 4: the edges that reach S from inside #
An edge of the mesh that meets S without lying on it is a subsegment of a spoke, and it
touches S at that spoke's fresh point only.
An edge that meets S but does not lie on it is a piece of a spoke, and it meets S
exactly at that spoke's fresh point, which is one of its endpoints.
A nondegenerate subsegment of a spoke having the spoke's outer end z as an endpoint runs
from z inwards: its interior is {t • z : t₀ < t < 1} for some t₀ < 1. This is the whole
of "only one edge leaves S at a fresh point" — two such edges would overlap near z.
Uniqueness for clause 4: exactly one edge leaves S at a fresh point.
Clause 1: every bounded face is small #
The estimate is the blueprint's, in radial coordinates. A connected set missing the mesh
misses every ring, so its sup norm — continuous, hence with a preconnected image in ℝ —
stays inside one open interval (k/N, (k+1)/N) between consecutive ring radii. Inside the
innermost square that is already the whole bound; outside it the radial projection
x ↦ ‖x‖∞⁻¹ • x maps the set into S, connectedly, and away from every fresh point, because
a point projecting to a fresh point lies on that point's spoke. The blueprint's
‖x - y‖ ≤ ‖tz - tw‖ + ‖tw - sw‖ < δ/4 + δ/4 + δ/4
is then t‖z - w‖ + |t - s|‖w‖, with ‖z - w‖ controlled by FreshDense and |t - s| by
one ring thickness.
The fresh points are δ-dense on S: every connected piece of S that avoids all of them
has diameter at most δ/2.
This is the hypothesis the blueprint discharges by "parametrize S by a circle, use uniform
continuity to cut it into arcs of diameter < δ/8, and pick one fresh point in the relative
interior of each". Stated as a property of a set rather than of a cyclic order, it needs no
ordering of the fresh points along S — which is what makes the whole mesh order-free.
Equations
- Schoenflies.FreshDense fresh δ = ∀ A ⊆ Schoenflies.modelCurve \ {x : Schoenflies.Plane | x ∈ fresh}, IsPreconnected A → ∀ x ∈ A, ∀ y ∈ A, dist x y ≤ δ / 2
Instances For
The radial estimate. A connected set missing the mesh stays inside the open square and
has diameter at most δ/2 + √2/N.
The mesh occupies a subset of the closed square.
Clause 1. Every bounded face of the mesh lies in the open square and has diameter
< δ.
Clause 5: the mesh minus S is connected #
The inner rings and the spokes-minus-their-outer-endpoint are each connected, every inner ring
meets every spoke, and every spoke meets the innermost ring. So a single point of the innermost
ring reaches everything, which is what isPreconnected_of_forall asks for. At least one fresh
point is needed: with no spokes the rings are disjoint circles.
The frame of a square is connected: four segments in a cycle, meeting at the corners.
Clause 5. The mesh with S removed is connected.
The mesh of a given size #
meshCount δ rings make both the innermost square and one ring thickness small compared with
δ; 2 √2 < δ N is the single inequality the whole diameter estimate rests on.
The anchored square mesh: meshCount δ concentric ring frames inside Q = [-1,1]²,
one radial spoke at each fresh boundary point, and the anchors inserted as extra vertices of
the outer ring.
Equations
- Schoenflies.squareMesh δ fresh anchors = Schoenflies.meshGraph (Schoenflies.meshCount δ) fresh anchors
Instances For
The mesh is a plane graph, drawn with straight edges.
The whole model curve is part of the mesh.
The mesh occupies a subset of Q.
Clause 1. Every bounded face lies in the open square and has diameter < δ.
Clause 2. Every anchor lying on S is a vertex.
Clause 4, first half. An edge meeting S without lying on it meets it in a single
fresh point, which is one of its endpoints.
Clause 5. The mesh minus S is connected.