Local structure of a polygonal skeleton #
Close enough to any of its points, a finite union of segments and points looks like a star: the point itself together with finitely many radial segments leaving it, one per local branch. This module proves that, and hands the accessibility argument the form it needs.
What is exported, and why in this shape #
The data is Schoenflies.localDirs S x, the set of unit vectors d such that some initial
segment [x, x + ε • d] lies in S. It is defined for an arbitrary set, with no choices in
it: nothing about a segment decomposition of S enters the definition, so no consumer has to
carry one. "Pairwise distinct directions" is then not a clause to be proved but the meaning of
the word set, and the blueprint's real content becomes localDirs_finite.
The radius is the one genuinely existential ingredient — there is no canonical r₀ — so it is
named by a predicate rather than returned inside an ∃-packaged bundle of properties:
Schoenflies.IsLocalRadius S x r : 0 < r, and every point within r of x lies in S
exactly when it is x itself or leaves x in a local direction.
That single membership criterion is equivalent to the blueprint's picture and implies all of
its parts, each proved here as a lemma about IsLocalRadius and hence available at every
radius below the one produced: the closed-disk formula
(IsLocalRadius.closedBall_inter), the open disk minus S as a cone over the complement of
the local rays (IsLocalRadius.ball_diff_eq_cone), and the star-shapedness that the
accessibility lemma actually cites (IsLocalRadius.openSegment_subset_ball_diff).
What the consumer (lem:polygonal-side-accessibility) needs #
That lemma takes y in a face F inside the disk, and wants a polygonal arc from x into
F. IsLocalRadius.openSegment_subset_ball_diff gives (x, y) ⊆ B(x, r) \ S directly, and
openSegment ℝ x y ∪ {y} is connected and disjoint from the skeleton — which is everything
the blueprint's "pick the sector containing y, then a short segment from x into it" is used
for. The decomposition of the punctured disk into its individual sectors, one per pair of
cyclically adjacent local directions, is therefore not proved here: it needs a cyclic
order on directions, and no consumer needs it. IsLocalRadius.ball_diff_eq_cone records the
sectors in aggregate — as one Plane.cone over all free directions at once.
Blueprint #
Schoenflies.localDirs,Schoenflies.localDirs_finite— the finitely many local branch directions atxof Lemma "Local structure of a polygonal skeleton" (lem:local-skeleton-structure).Schoenflies.IsLocalRadius,Schoenflies.exists_isLocalRadius,Schoenflies.IsLocalRadius.closedBall_inter— the radiusr₀, and "for every0 < r ≤ r₀the closed disk meets|G|exactly in finitely many straight segments fromxwith pairwise distinct directions" (same lemma).Schoenflies.IsLocalRadius.ball_diff_eq_cone— "consequentlyB(x,r) \ |G|is a finite union of open circular sectors" (same lemma), in aggregate form.Schoenflies.IsLocalRadius.openSegment_subset_ball_diff— the formlem:polygonal-side-accessibilitycites: a short straight segment fromxtowards any point of the punctured disk misses the skeleton.Graph.IsDrawing.exists_cover,Graph.IsDrawing.exists_isLocalRadius,Graph.IsDrawing.finite_localDirs— the same statements for a finite plane graph all of whose edges are polygonal.Graph.IsDrawing.openSegment_subset_face— the access arc oflem:polygonal-side-accessibility, assembled: a straight segment fromxto a point of the exterior inside a local disk lies, minusx, in that point's face.
Radial segments #
segment ℝ x (x + r • d) with d a unit vector is the closed radius of length r leaving
x in the direction d. Two facts run the whole module: a point lies on it exactly when it
is near enough and points the right way (mem_radial_iff), and cutting a longer radius by a
smaller ball leaves the shorter radius (radial_inter_closedBall).
The unit vector along a positive multiple of a unit vector is that vector.
A radius of length r lies in the closed disk of radius r.
Inside a disk too small to reach c, the segment [x, c] is exactly a radius. This is
the one geometric step behind the whole module: it turns each straight piece through x into
one or two radial segments.
The local directions of a set #
The local directions of S at x: the unit vectors along which S contains an initial
segment issuing from x.
Choice-free and stated for an arbitrary set, so that a consumer never has to name a segment
decomposition of S. Being a set of unit vectors, its members are automatically pairwise
distinct — the blueprint's "with pairwise distinct directions".
Equations
Instances For
The pieces through a point #
Everything is now bookkeeping over a finite list of segments and a finite set of stray points.
GoodRadius x P r collects what a radius must avoid on account of one piece: pieces missing
x must stay outside the disk, and pieces through x must not end inside it.
At a good radius, the pieces meet the closed disk only in x and the radii.
The membership criterion #
r is a local radius for S at x: within distance r of x, the set S consists
of x together with the rays leaving x in the local directions.
This one criterion is the whole local picture; the disk formula, the sector description and
the star-shapedness are all derived from it below, and each therefore holds at every positive
radius below a local radius (IsLocalRadius.mono).
Equations
- Schoenflies.IsLocalRadius S x r = (0 < r ∧ ∀ (z : Schoenflies.Plane), dist z x ≤ r → (z ∈ S ↔ z = x ∨ (z - x).dir ∈ Schoenflies.localDirs S x))
Instances For
A local radius exists #
The construction: choose a radius good for every piece and strictly below the distance to
every stray point other than x.
The membership criterion, phrased with the auxiliary pieceDirs.
Conversely, at a good radius every local direction comes from a piece. This is where the
germ hypothesis in localDirs is cashed in: a short segment in S leaving x lands in a
piece, and that piece must pass through x.
The local directions of a finite union of segments and points are finitely many. This
is the blueprint's "finitely many straight segments from x with pairwise distinct
directions": distinctness is automatic for a set, finiteness is the content.
A local radius exists. Lemma "Local structure of a polygonal skeleton", for a set presented as finitely many points together with finitely many segments.
What a local radius gives #
The closed disk meets S exactly in the radial segments. The blueprint's "the closed
disk B(x,r) meets |G| exactly in finitely many straight segments from x with pairwise
distinct directions".
The punctured disk is a union of open sectors, in aggregate: B(x,r) \ S is the open
cone over the directions that are not local directions.
The individual sectors — one per cyclically adjacent pair of local directions — are not separated out; see the module docstring.
The punctured disk is star-shaped about x. This is the form
lem:polygonal-side-accessibility cites: a straight segment from x towards any point of the
disk that misses S misses S all the way.
Together with connectedness of openSegment ℝ x y ∪ {y} it replaces the blueprint's "pick the
sector containing y, then a short segment from x into it".
Some direction at x is free, so the punctured disk is nonempty.
Finite polygonal plane graphs #
The point set of a finite plane graph with polygonal edges is its vertex set together with finitely many straight segments. The blueprint's "write every edge as a finite union of straight segments".
A finite polygonal plane graph without isolated vertices is carried exactly by finitely
many nondegenerate straight segments. The incidence hypothesis removes the isolated-vertex
term from IsDrawing.exists_cover: every vertex already belongs to the segment cover.
Local structure of a polygonal skeleton (lem:local-skeleton-structure): a point of a
finite polygonal plane graph has a local radius, hence a disk in which the graph is exactly
finitely many radial segments.
The local branches of a finite polygonal plane graph at a point are finitely many.
The access arc. A point of the exterior inside a local disk about x is joined to x
by a straight segment lying, except for x itself, in that point's own face.
This is lem:polygonal-side-accessibility with everything but the choice of y discharged:
the consumer picks y in the face it cares about (possible because the face accumulates at
x), shrinks the radius with IsLocalRadius.mono until the disk also misses whatever else it
must avoid, and reads off a polygonal access arc. No sector has to be named: the half-open
segment does the work the blueprint's sector does.