Documentation

LeanPool.MovingSofa.Development.Geometry.Applications.Development001

Moving sofa: related mathematical developments #

Moving sofa: related mathematical developments #

The middle part of the niche #

capMiddle_area_lower_bound bounds the area of the part of a special cap's niche outside both distinguished tail half-planes from below by the three signed areas of the middle fan: the two wedge triangles and the inner-corner arc.

The geometry is that of the paper's proof. Writing φ for the right distinguished angle, l = π/2 - φ for the left one and k = tan φ, the two distinguished tail support lines are X = w - k y and X = z + k y, where w and z are the horizontal coordinates of the two fan points W and Z; the inner corner runs from the first line to the second through the open cone between them, with strictly decreasing horizontal coordinate. Adding a base line y = -h strictly below the arc turns the arc together with the two side segments into a strictly monotone three-piece roof over that base line, and the region under the roof exceeds the base trapezoid by the asserted three signed areas. Every point of the open region above the trapezoid lies in the niche, because the roof point vertically above it exhibits a time whose open inward quadrant contains it.

The middle area bound obtained from cap area, endpoint segments and the corner-path integral.

Equations
  • One or more equations did not get rendered due to their size.
Instances For

    Arithmetic of a side segment of the middle cone #

    The two side segments of the four-piece loop run along the two tail support lines, so their displacements (Δ₀, Δ₁) satisfy Δ₀ cos = Δ₁ sin for the relevant frame angle. The two lemmas below are the resulting sign computations for a point δ below such a segment.

    The cone between the two distinguished tail support lines #

    The niche contains the open region above the base trapezoid #

    The lower estimate #

    Moving sofa: related mathematical developments #

    Area / Mamikon / Properties #

    noncomputable def MovingSofa.mamikonOffset (K : ConvexBody Point) {a b : ℝ} (z : ContinuousBVPaths a b) (t : ℝ) :

    The tangential displacement from an exposed-edge endpoint to the path, extended by zero.

    Equations
    Instances For
      theorem MovingSofa.sqIntegral_quadratic_convex {α : Type u_1} {Ω : Type u_2} [MeasurableSpace Ω] (c : ↑unitInterval → α → α → α) (μ : MeasureTheory.Measure Ω) [MeasureTheory.IsFiniteMeasure μ] (g : α → Ω → ℝ) (hmeas : ∀ (x : α), Measurable (g x)) (hbdd : ∀ (x : α), ∃ (C : ℝ), ∀ (ω : Ω), |g x ω| ≤ C) (hlin : ∀ (s : ↑unitInterval) (x y : α) (ω : Ω), g (c s x y) ω = (1 - ↑s) * g x ω + ↑s * g y ω) (f : α → ℝ) (hf : ∀ (x : α), f x = (∫ (ω : Ω), g x ω ^ 2 ∂μ) / 2) :

      Half the square integral of a bounded measurable family of integrands that is pointwise convex-linear in its parameter is a quadratic and convex functional of that parameter.

      The Mamikon offset is convex-linear in the body along a convex-linear family of paths.

      theorem MovingSofa.mamikon_integral (K : ConvexBody Point) (a b : ℝ) (hab : a < b) (hba : b < a + Real.pi) (z : ContinuousBVPaths a b) (hz : ∀ (t : ↑(Set.Icc a b)), ↑z t ∈ (supportingLineHalfPlane ↑K ↑↑t).1) :
      Measurable (mamikonOffset K z) ∧ (∃ (C : ℝ), ∀ (t : ℝ), |mamikonOffset K z t| ≤ C) ∧ (∀ (t : ↑(Set.Icc a b)), ↑z t = (edgeVertices K ↑↑t).1 + mamikonOffset K z ↑t • tangentVector ↑↑t) ∧ mamikonFunctional K a b hab hba z hz = (∫ (t : ℝ) in Set.Icc a b, mamikonOffset K z t ^ 2) / 2
      theorem MovingSofa.mamikon_quadratic_convex (a b : ℝ) (hab : a < b) (hba : b < a + Real.pi) (F : ConvexBody Point → ContinuousBVPaths a b) (hF : ∀ (K : ConvexBody Point) (t : ↑(Set.Icc a b)), ↑(F K) t ∈ (supportingLineHalfPlane ↑K ↑↑t).1) (hlinear : IsConvexLinear convexBodyCombination bvPathCombination F) :

      Moving sofa: related mathematical developments #

      Area / Mamikon / Tails #

      noncomputable def MovingSofa.tangentMamikonValue (K : ConvexBody Point) (a b : ℝ) :

      The signed area between a convex boundary arc and its endpoint tangent segments.

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For

        The Mamikon value of the right tail on its Gerver angle interval.

        Equations
        Instances For

          The Mamikon value of the left tail on its Gerver angle interval.

          Equations
          Instances For

            Bundle the right and left tail Mamikon functionals.

            Equations
            Instances For
              theorem MovingSofa.tailFanPoint_identities (K : RightAngleCapSpace) (B D : ConvexBody Point) {r l : ℝ} (hr : r ∈ Set.Ioo 0 (Real.pi / 2)) (hl : l ∈ Set.Ioo 0 (Real.pi / 2)) (hB1 : supportValue ↑B ↑(Real.pi + r) = 1 - supportValue ↑↑K ↑r) (hB2 : supportValue ↑B ↑(3 * Real.pi / 2) = 0) (hD1 : supportValue ↑D ↑(3 * Real.pi / 2) = 0) (hD2 : supportValue ↑D ↑(3 * Real.pi / 2 + l) = 1 - supportValue ↑↑K ↑(Real.pi / 2 + l)) :

              The support and endpoint identities of a cap-tail triple, in segment-area form.

              Moving sofa: related mathematical developments #

              Cap / Polyline Boundary #

              noncomputable def MovingSofa.capBAffine {Θ : AngleSet} (K : PolygonCapSpace Θ) (t : ℝ) :

              The slope and intercept of the inner B-wall line at angle t.

              Equations
              Instances For
                noncomputable def MovingSofa.capDAffine {Θ : AngleSet} (K : PolygonCapSpace Θ) (t : ℝ) :

                The slope and intercept of the inner D-wall line at angle t.

                Equations
                Instances For
                  noncomputable def MovingSofa.fanAffine (ω : ℝ) :

                  The slope and zero intercept of the slanted fan boundary.

                  Equations
                  Instances For
                    noncomputable def MovingSofa.capBoundaryHeight {Θ : AngleSet} (K : PolygonCapSpace Θ) (x : ℝ) :

                    The lower boundary height of a polygon cap after removing its niche.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For

                      The fan outside the polygon niche is the epigraph of its boundary height.

                      The cap outside its polygon niche is closed, with frontier the boundary graph.

                      Every compact interval of the polygon-cap boundary graph is a finite polyline.

                      theorem MovingSofa.capVertices_zero_snd_eq {Θ : AngleSet} (K : PolygonCapSpace Θ) :
                      (capVertices (↑K) 0).1.2 = supportValue (↑↑↑K) 0 • normalVector 0

                      The lower endpoint of the zero-angle cap face lies on the horizontal axis.

                      The terminal positive cap contact lies on the lower fan ray.

                      theorem MovingSofa.polygonCap_left_x_lt_right_x {Θ : AngleSet} (K : PolygonCapSpace Θ) :
                      (capVertices (↑K) Θ.angle).2.1.ofLp 0 < (capVertices (↑K) 0).1.2.ofLp 0

                      The terminal cap contacts occur in strictly increasing horizontal order.

                      The right cap contact lies on the boundary graph.

                      The left cap contact lies on the boundary graph.

                      The open ray to the right of a polygon-cap boundary is the right graph tail.

                      The open ray to the left of a polygon-cap boundary is the left graph tail.

                      Cap / Polyline Definition #

                      The open ray starting at p in direction v, excluding its initial point.

                      Equations
                      Instances For

                        The polyline and two disjoint endpoint rays describe the fan-minus-niche frontier.

                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For

                          Cap / Polyline #

                          A chosen monotone polyline describing the polygonal cap’s niche boundary.

                          Equations
                          Instances For
                            noncomputable def MovingSofa.polygonCapPolylineLength {Θ : AngleSet} (K : PolygonCapSpace Θ) (t : ↑(angleDomain Θ)) :

                            Sum the lengths of polyline edges perpendicular to a prescribed wall direction.

                            Equations
                            • One or more equations did not get rendered due to their size.
                            Instances For

                              The cap’s surface measure at each wall direction equals the corresponding polyline length.

                              Equations
                              Instances For

                                Cap / Upper Boundary / Polygon #

                                theorem MovingSofa.PolygonCapSpace.capVertices_fst_bounds {Θ : AngleSet} (K : PolygonCapSpace Θ) {q : Point} (hq : q ∈ ↑↑↑K) :
                                (capVertices (↑K) Θ.angle).2.1.ofLp 0 ≤ q.ofLp 0 ∧ q.ofLp 0 ≤ (capVertices (↑K) 0).1.2.ofLp 0

                                The terminal cap contacts bound every horizontal coordinate of a polygon cap.

                                The sine-weighted exposed-face lengths equal the horizontal separation of cap contacts.

                                Moving sofa: related mathematical developments #

                                Soundness of the contact evaluator #

                                GerverAreaCert.evalZ s z kind evaluates one of the five phase formulas of Gerver's sofa, and one of its four contact curves, on an interval of rotation angles. This module proves that it encloses the analytic value: gerverBranch_eq identifies the branch that the piecewise vendor definitions GerverSofa.Romik.path and GerverSofa.PartC.alphaBetaAt select, the five per-stage lemmas verify the phase formulas and the two velocity coefficients against GerverSofa.Romik.path1 … path5 and GerverSofa.Romik.alphaBeta1 … alphaBeta5, and evalZ_sound assembles them through the coordinate dictionary fromPlane_paperGerverContacts. contactZ_sound and evalZ_interval_sound specialise this to a grid angle and to a whole grid subinterval.

                                The contact evaluator #

                                On a grid angle of stage s both piecewise definitions select branch s.

                                theorem MovingSofa.evalZ_zero_sound (s : ℕ) (hs1 : 1 ≤ s) (hs5 : s ≤ 5) {z : GerverAreaCert.SI} {x : ℝ} (hz : z.Contains x) (hsin : (GerverAreaCert.trigZ z).1.Contains (Real.sin x)) (hcos : (GerverAreaCert.trigZ z).2.Contains (Real.cos x)) :

                                Per-stage soundness of the phase-map evaluation, i.e. of the kind = 0 output. Pure interval arithmetic against GerverSofa.Romik.path1 … path5: five cases, each a chain of SI.contains_* applications on top of contains_params, hsin and hcos.

                                Per-stage soundness of the B and D offsets, i.e. of the two velocity coefficients α and β against GerverSofa.Romik.alphaBeta1 … alphaBeta5. Note evalZ s z 1 = evalZ s z 2 shifted by (cos x, sin x) and evalZ s z 3 = evalZ s z 4 shifted by (-sin x, cos x), so the remaining two kinds need no separate stage analysis.

                                theorem MovingSofa.evalZ_sound (s : ℕ) (hs1 : 1 ≤ s) (hs5 : s ≤ 5) {z : GerverAreaCert.SI} {x : ℝ} (hz : z.Contains x) (hx0 : 0 ≤ x) (hxT : x ≤ Real.pi / 2) (hxhi : x ≤ gerverStageTime s) (hxlo : 2 ≤ s → gerverStageTime (s - 1) < x) (kind : ℕ) (hk : kind ≤ 4) :

                                Soundness of the executable phase/contact evaluator: on the branch that the piecewise definitions select, the interval evaluation encloses both coordinates of the selected curve. Reduces to gerverBranch_eq, evalZ_zero_sound, evalZ_offset_sound, trigZ_sound and the coordinate dictionary fromPlane_paperGerverContacts (GerverSofa.u t = (cos t, sin t), GerverSofa.v t = (-sin t, cos t)).

                                The left endpoint of the branch selected at the right end of a grid subinterval does not exceed the left end of that subinterval.

                                The evaluator at a grid angle.

                                theorem MovingSofa.evalZ_interval_sound (m : ℕ) (hm : m + 1 ≤ 5 * GerverAreaCert.NN) (kind : ℕ) (hk : kind ≤ 4) {x : ℝ} (hx : x ∈ Set.Ioc (gerverGridTime m) (gerverGridTime (m + 1))) :

                                The evaluator over a whole grid subinterval, on the branch selected at its right endpoint (which is the branch of every angle in the half-open subinterval).

                                The support-contact fan of the Gerver outer cap #

                                The literal Gerver outer cap is a compact convex subset of the plane lying in the closed quadrant above the fan anchor L = C (π / 2), which sits on the wall. The 640 listed contacts A (t) and C (t) at the grid angles attain the cap support at the strictly increasing normals t and t + π / 2 of [0, π), so supportContact_fan_area bounds the cap area below by half the shoelace sum of the fan over the anchor. The certificate encloses that sum (capDoubledZ_sound), and its kernel-checked numeric conclusion GerverAreaCert.capOK_true turns the enclosure into 28609 / 10000 ≤ |K₀|.

                                Elementary geometry of the outer cap #

                                The paper path starts at the origin.

                                The outer cap written as an intersection of closed half-planes.

                                The outer cap is closed, being an intersection of closed half-spaces.

                                The outer cap is convex, being an intersection of half-spaces.

                                The outer cap is contained in an explicit coordinate rectangle.

                                The outer cap is compact: it is closed and contained in a coordinate rectangle.

                                The support-contact fan and the cap lower bound #

                                The fan anchor L = C (π / 2).

                                Equations
                                Instances For

                                  A t attains the cap support at normal t.

                                  C t attains the cap support at normal t + π / 2.

                                  The anchor sits on the wall.

                                  The cap lies in the closed quadrant above the anchor.

                                  The listed support normals are strictly increasing.

                                  The listed support normals lie in [0, π).

                                  Every listed contact lies in the cap.

                                  Every listed contact attains the cap support at its listed normal.

                                  The rectangle cover of the literal Gerver niche #

                                  The literal niche is the union of the strict vertical fills under the three pieces of its roof (gerver_niche_vertical_fills). Each piece is traversed with monotone horizontal coordinate, so subdividing the seven monotone roof stretches at the grid angles covers the niche by 7 * NN coordinate rectangles whose widths and heights the certificate encloses (gerverNicheRect_covers). The kernel-checked numeric conclusion GerverAreaCert.nicheOK_true bounds the total rectangle area, hence |N₀| ≤ 3301 / 5000.

                                  The literal niche is Borel measurable: it is a closed half-plane intersected with a countable union of open sets.

                                  The rectangle cover and the niche upper bound #

                                  The covering rectangle of the j-th subinterval of roof piece r.

                                  Equations
                                  • One or more equations did not get rendered due to their size.
                                  Instances For
                                    theorem MovingSofa.strictVerticalFill_Icc_union {f : ℝ → Point} {a b c : ℝ} (hab : a ≤ b) (hbc : b ≤ c) :

                                    A strict vertical fill splits along a subdivision of its parameter interval.

                                    Each covering rectangle contains the strict vertical fill of its subinterval.

                                    The 7 * NN rectangles cover the literal niche.

                                    The certificate bounds the total rectangle volume.

                                    Rational area bounds for the canonical Gerver sofa #

                                    The canonical Gerver sofa is the paper's literal set (gerver_canonical_paper_literal), the difference of the literal outer cap and the literal niche. The cap and the niche are Borel of finite area with 28609 / 10000 ≤ |K₀| and |N₀| ≤ 3301 / 5000 (gerver_geometric_area_bounds), both numeric bounds coming from the kernel-checked certificate MovingSofa.Gerver.AreaCertificate through the fan bound of MovingSofa.Gerver.Area.CapFan and the rectangle cover of MovingSofa.Gerver.Area.NicheCover. Subadditivity of area then gives 11 / 5 ≤ |G| (gerver_area_lower_bound).

                                    Moving sofa: related mathematical developments #

                                    Gerver / Cap Identification #

                                    Gerver / Niche / Identification #

                                    Surface densities of the certified Gerver cap #

                                    The certified Gerver cap carries the two envelope densities GerverSofa.PartC.Stage2.rhoA and rhoC of the vendor development: its surface-area measure is rhoA (t) dt on the angular arc [0, π/2) and rhoC (t - π/2) dt on (π/2, π].

                                    The argument is stage by stage. On each of the five closed stages the selected (positive) vertex of the cap is a globally analytic branch of the certified phase curves, with derivative rhoA t • v t for the first contact and -rhoC t • u t for the third, so surfaceAreaMeasure_angleImage_eq_withDensity_of_hasDerivAt identifies the surface measure with the exact Lebesgue density on that stage. The stages are then glued with measure_angleImage_eq_of_union; only the last rhoA stage needs an interior exhaustion, because the positive vertex jumps at π/2.

                                    The same stagewise phase curves describe the two inner contacts, because B = A - u and D = C - v differ from the outer contacts by a frame vector (paperGerverContacts_one_eq_sub, paperGerverContacts_three_eq_sub). Subtracting the frame vector from a phase curve therefore produces a globally differentiable branch curve for B on the last two stages and for D on the first two, with the nonnegative speeds 1 - rhoA and 1 - rhoC (exists_branch_paperGerverContacts_one, exists_branch_paperGerverContacts_three); the two speed bounds are again coarse box bounds on the certified parameters.

                                    Coordinate transport of derivatives #

                                    The certified switching angles #

                                    The contact curves as transported certified phase curves #

                                    Contact derivatives on the open stages #

                                    theorem MovingSofa.hasDerivAt_of_eqOn_stage {G F w : ℝ → Point} {i : Fin 5} (hF : ∀ (s : ℝ), HasDerivAt F (w s) s) (hGF : ∀ t ∈ gerverStageIntervals i, G t = F t) {t : ℝ} (ht : t ∈ Set.Ioo (gerverStageTimes i.castSucc) (gerverStageTimes i.succ)) :
                                    HasDerivAt G (w t) t

                                    A branch curve agreeing with a global curve on a closed stage computes the global derivative at every interior parameter of that stage.

                                    Singleton faces have no surface atom #

                                    Measurability and boundedness of the two envelope densities #

                                    Elementary facts about the stage endpoints and the frame #

                                    Almost every parameter lies in an open stage #

                                    theorem MovingSofa.mem_openStage_of_mem_Ico {t : ℝ} (ht : t ∈ Set.Ico 0 (Real.pi / 2)) (hne : ∀ (k : Fin 6), t ≠ gerverStageTimes k) :

                                    A parameter of the rotation interval that is none of the six stage times lies in an open stage.

                                    Almost every parameter of a measurable subset of the shifted rotation interval lies in a shifted open stage.

                                    Branch curves for the two inner contacts #

                                    The second contact B = x + α v is the first contact A = x + α v + u translated by -u, and the fourth contact D = x - β u is the third contact C = x - β u + v translated by -v. So subtracting a frame vector from the transported phase curve of a stage produces a globally differentiable branch curve for B and for D, whose speed against the frame is 1 - rhoA resp. 1 - rhoC. Both are nonnegative exactly where the inner contact is a genuine contact: after the third stage time for B and before the second for D.

                                    The second contact curve is the first one translated by -u_t.

                                    The fourth contact curve is the third one translated by -v_t.

                                    theorem MovingSofa.exists_branch_paperGerverContacts_one {i : Fin 5} (hi : i = 3 ∨ i = 4) :
                                    ∃ (F : ℝ → Point) (g : ℝ → ℝ), (∀ (s : ℝ), HasDerivAt F (-g s • tangentVector ↑s) s) ∧ Continuous g ∧ (∀ t ∈ Set.Ioc (gerverStageTimes i.castSucc) (gerverStageTimes i.succ), 0 ≤ g t) ∧ ∀ t ∈ gerverStageIntervals i, paperGerverContacts t 1 = F t

                                    On each of the last two stages the second contact curve agrees with a globally differentiable branch curve whose derivative is -(g t) • v_t for a continuous factor g that is nonnegative on the stage.

                                    theorem MovingSofa.exists_branch_paperGerverContacts_three {i : Fin 5} (hi : i = 0 ∨ i = 1) :
                                    ∃ (F : ℝ → Point) (g : ℝ → ℝ), (∀ (s : ℝ), HasDerivAt F (g s • normalVector ↑s) s) ∧ Continuous g ∧ (∀ t ∈ Set.Ioc (gerverStageTimes i.castSucc) (gerverStageTimes i.succ), 0 ≤ g t) ∧ ∀ t ∈ gerverStageIntervals i, paperGerverContacts t 3 = F t

                                    On each of the first two stages the fourth contact curve agrees with a globally differentiable branch curve whose derivative is g t • u_t for a continuous factor g that is nonnegative on the stage.

                                    The certified cap witness and its positive vertex curves #

                                    The stagewise density identities #

                                    Exhausting the last stage of the first arc from inside #

                                    Gluing two adjacent arcs #

                                    The density identity on each full arc #

                                    theorem MovingSofa.gerver_surface_densities :
                                    ∃ (K : RightAngleCapSpace), ↑↑K = capOfSofa paperGerverSofa (Real.pi / 2) ∧ ∃ (r : ℝ → NNReal) (s : ℝ → NNReal), HasCapDensities K r s ∧ (∃ (M : ℝ), ∀ t ∈ Set.Icc 0 (Real.pi / 2), ↑(r t) ≤ M ∧ ↑(s t) ≤ M) ∧ ∀ (i : Fin 5), ∀ t ∈ Set.Ioo (gerverStageTimes i.castSucc) (gerverStageTimes i.succ), HasDerivAt (fun (u : ℝ) => paperGerverContacts u 0) (↑(r t) • tangentVector ↑t) t ∧ HasDerivAt (fun (u : ℝ) => paperGerverContacts u 2) (-↑(s t) • normalVector ↑t) t

                                    Gerver / Velocity And Cap Area #

                                    The tangential velocity component is nonpositive on the whole closed rotation interval: the strict inequality of gerver_strict_velocity holds on the open interval, and the component is continuous, so the closed condition propagates to the two endpoints.

                                    The normal velocity component is nonnegative on the whole closed rotation interval; see paperGerverVelocityComponents_fst_nonpos for the argument.

                                    Moving sofa: related mathematical developments #

                                    Polygon / Balanced Containment #

                                    theorem MovingSofa.polygonCapPolyline_inner_le_of_balanced {Θ : AngleSet} (K : PolygonCapSpace Θ) (hK : IsBalancedPolygonCap K) (D : Finset ℝ) (hD : ↑D = angleDomain Θ) (s : ℝ) {q : Point} (hq : q ∈ (polygonCapPolyline K).carrier) :
                                    inner ℝ q (normalVector ↑s) ≤ inner ℝ (capVertices (↑K) 0).1.2 (normalVector ↑s) + ∑ u ∈ D, ((surfaceAreaMeasure ↑↑K) {↑u}).toReal * max (Real.sin (s - u)) 0

                                    Balance bounds the polyline projections by the surface-area atoms.

                                    A balanced polygon cap bounds every upper-normal projection of its polyline.

                                    The polyline of a balanced polygon cap lies inside the cap.

                                    theorem MovingSofa.polygonNiche_subset_of_polyline_subset {Θ : AngleSet} (K : PolygonCapSpace Θ) (hpoly : (polygonCapPolyline K).carrier ⊆ ↑↑↑K) :
                                    polygonNiche Θ ↑K ⊆ ↑↑↑K

                                    A polygon niche lies in its cap whenever its upper boundary polyline does.

                                    Every balanced polygon cap contains its polygon niche.

                                    Polygon / Polyline / Length / Basic #

                                    noncomputable def MovingSofa.polygonPolylineLengthAt {Θ : AngleSet} (K : PolygonCapSpace Θ) (t : ℝ) :

                                    Extend the directional polyline-length function by zero outside the angle domain.

                                    Equations
                                    Instances For
                                      noncomputable def MovingSofa.nicheBoundaryLength {Θ : AngleSet} (K : PolygonCapSpace Θ) (S : Set Point) :

                                      The one-dimensional Hausdorff measure of the niche frontier inside a specified set.

                                      Equations
                                      Instances For

                                        Polygon / Polyline / Length / Boundary #

                                        The fan clipping the niche is closed.

                                        The inward quadrant of a supporting hallway is open.

                                        The niche trace on a fan line is the lower face length minus polyline length.

                                        Inner-wall and inner-ray niche lengths agree with the corresponding polyline lengths.

                                        Polygon / Polyline / Length #

                                        Polygon / Balancing / Coefficients #

                                        A convex body's frontier on a supporting line is its exposed edge.

                                        The surface-area atom is the length of the frontier on its supporting line.

                                        An endpoint cap's lower wall has the surface-area atom of the opposite normal.

                                        Away from endpoint normals, the niche boundary on the lower wall has polyline length.

                                        At an endpoint normal, the lower-wall niche length is the opposite-face length minus the polyline length.

                                        Polygon / Balancing / Estimate #

                                        theorem MovingSofa.polygonCap_balancing_estimate_of_not_endpoint {Θ : AngleSet} (K : PolygonCapSpace Θ) (t : ↑(angleDomain Θ)) (ht : ↑t ∉ {Θ.angle, Real.pi / 2}) :
                                        ∃ (C : ℝ) (eta : ℝ), 0 ≤ C ∧ 0 < eta ∧ ∀ (varepsilon : ℝ), 0 ≤ varepsilon → varepsilon ≤ eta → |polygonHeightArea (raisedPolygonSupport K t varepsilon) - polygonHeightArea (raisedPolygonSupport K t 0) - (((surfaceAreaMeasure ↑↑K) {↑↑t}).toReal - polygonCapPolylineLength K t) * varepsilon| ≤ C * varepsilon ^ 2

                                        The balancing area estimate when the perturbed normal is not an endpoint.

                                        theorem MovingSofa.polygonCap_balancing_estimate_of_endpoint {Θ : AngleSet} (K : PolygonCapSpace Θ) (t : ↑(angleDomain Θ)) (ht : ↑t ∈ {Θ.angle, Real.pi / 2}) :
                                        ∃ (C : ℝ) (eta : ℝ), 0 ≤ C ∧ 0 < eta ∧ ∀ (varepsilon : ℝ), 0 ≤ varepsilon → varepsilon ≤ eta → |polygonHeightArea (raisedPolygonSupport K t varepsilon) - polygonHeightArea (raisedPolygonSupport K t 0) - (((surfaceAreaMeasure ↑↑K) {↑↑t}).toReal - polygonCapPolylineLength K t) * varepsilon| ≤ C * varepsilon ^ 2

                                        The balancing area estimate for a simultaneous endpoint-wall displacement.

                                        Polygon / Balancing #

                                        theorem MovingSofa.polygonCap_balancing_estimate {Θ : AngleSet} (K : PolygonCapSpace Θ) (t : ↑(angleDomain Θ)) :
                                        ∃ (C : ℝ) (η : ℝ), 0 ≤ C ∧ 0 < η ∧ ∀ (ε : ℝ), 0 ≤ ε → ε ≤ η → |polygonHeightArea (raisedPolygonSupport K t ε) - polygonHeightArea (raisedPolygonSupport K t 0) - (((surfaceAreaMeasure ↑↑K) {↑↑t}).toReal - polygonCapPolylineLength K t) * ε| ≤ C * ε ^ 2

                                        A support-height increment has the balancing first-order area term.

                                        A maximum polygon cap has balanced boundary coefficients.

                                        Edge normals and contact vertices of a finite half-plane intersection #

                                        A convex body presented as a finite intersection of closed half-planes has only finitely many possible contact points and only finitely many possible proper edge normals. This file records both facts in the form used by the discrete estimates on polygon caps:

                                        theorem MovingSofa.exists_active_constraint_of_mem_notMem_interior (C : Set (Real.Angle × ℝ)) (hC : C.Finite) (S : Set Point) (hS : S = ⋂ c ∈ C, normalHalfPlane c.1 c.2 false false) {x : Point} (hxS : x ∈ S) (hxint : x ∉ interior S) :
                                        ∃ c ∈ C, inner ℝ x (normalVector c.1) = c.2

                                        A point of a finite half-plane intersection off its interior lies on an active constraint.

                                        theorem MovingSofa.properEdgeNormal_eq_constraint_or_add_pi (K : ConvexBody Point) (C : Set (Real.Angle × ℝ)) (hC : C.Finite) (hK : ↑K = ⋂ c ∈ C, normalHalfPlane c.1 c.2 false false) (t : Real.Angle) (ht : (edgeVertices K t).1 ≠ (edgeVertices K t).2) :
                                        ∃ c ∈ C, t = c.1 ∨ t = c.1 + ↑Real.pi

                                        A nondegenerate exposed edge has the normal angle of one of the constraints, up to half a turn.

                                        theorem MovingSofa.exists_active_constraint_of_forall_notMem_add_smul (C : Set (Real.Angle × ℝ)) (hC : C.Finite) (S : Set Point) (hS : S = ⋂ c ∈ C, normalHalfPlane c.1 c.2 false false) {x w : Point} (hxS : x ∈ S) (hw : ∀ (r : ℝ), 0 < r → x + r • w ∉ S) :
                                        ∃ c ∈ C, inner ℝ x (normalVector c.1) = c.2 ∧ 0 < inner ℝ w (normalVector c.1)

                                        If a direction immediately leaves a finite intersection of closed half-planes at a point of it, some constraint is active there and increases along that direction.

                                        theorem MovingSofa.properEdgeNormal_eq_constraint (K : ConvexBody Point) (C : Set (Real.Angle × ℝ)) (hC : C.Finite) (hK : ↑K = ⋂ c ∈ C, normalHalfPlane c.1 c.2 false false) (t : Real.Angle) (ht : (edgeVertices K t).1 ≠ (edgeVertices K t).2) :
                                        ∃ c ∈ C, t = c.1

                                        The normal of a nondegenerate exposed edge of a finite intersection of closed half-planes is itself a constraint normal.

                                        The allowed normal set of a polygon cap is finite.

                                        theorem MovingSofa.PolygonCapSpace.properEdgeNormal_mem_allowed_or_antipodal {Θ : AngleSet} (K : PolygonCapSpace Θ) (t : Real.Angle) (ht : (edgeVertices (↑↑K) t).1 ≠ (edgeVertices (↑↑K) t).2) :
                                        t ∈ (fun (r : ℝ) => ↑r) '' angleDomain Θ ∪ capLowerNormals Θ.angle ∪ (fun (u : Real.Angle) => u + ↑Real.pi) '' ((fun (r : ℝ) => ↑r) '' angleDomain Θ ∪ capLowerNormals Θ.angle)

                                        Every nondegenerate exposed edge of a polygon cap has an allowed or antipodal normal.

                                        theorem MovingSofa.PolygonCapSpace.properEdgeNormal_mem_allowed {Θ : AngleSet} (K : PolygonCapSpace Θ) (t : Real.Angle) (ht : (edgeVertices (↑↑K) t).1 ≠ (edgeVertices (↑↑K) t).2) :
                                        t ∈ (fun (r : ℝ) => ↑r) '' angleDomain Θ ∪ capLowerNormals Θ.angle

                                        Every proper edge normal of a polygon cap is an allowed normal.

                                        The finitely many transversal intersection points of a finite constraint family.

                                        Equations
                                        Instances For

                                          A finite constraint family has finitely many transversal intersection points.

                                          A singleton exposed edge of a finite half-plane intersection is a constraint vertex.

                                          The transversal constraint vertices form a one-dimensional null set.

                                          Surface measure of a finite intersection of closed half-planes is carried by its proper edge normals.

                                          Surface measure of a polygon cap is carried by its proper edge normals.