Dihedral-angle equality for congruent-faced convex triangulated realizations
ProvedProofsInTheBook.Ch13Cauchy3D.chapter13_cauchy_rigidity_v2Let D be a finite dart type with decidable equality and let M be a combinatorial map, with permutations alpha and sigma, where alpha is a fixed-point-free involution and the face permutation is . Vertices, edges and faces are the respective sigma-, alpha- and phi-orbits. Assume M is connected in the dart-step sense and its integer Euler characteristic is 2. Assume all face orbits have length 3, there are no loops or parallel edges, and every vertex has at least three incident darts.
Let P and Q be two realizations on this same map. Each assigns a point to every vertex, a representative dart for each face, and the three face vertices in phi-order from that representative. Every edge has distinct endpoint positions and every face triple is affinely independent. Each realization also supplies a point and a normal for each face, satisfying
for every face corner and every vertex, respectively, with strict inequality for every vertex not among that face's three combinatorial corners. For every dart d there must be a positive real lambda such that
All of these data and conditions are supplied by each ConvexEuclideanPolyhedron input. Suppose the lengths of corresponding edges agree in P and Q for every dart.
At any vertex v, construct the two vertex stars from the reverse-sigma cyclic order of neighboring vertices and rotate both by the common adaptive offset specified in the source. This offset is chosen using a dart with nonzero dihedral-difference sign when one exists, and a representative dart otherwise. Write the resulting stars as , with the same number of neighbors and . Then for every ,
Here the angle at index i is the ordinary unoriented angle between the projections of the raw neighbor vectors at indices i and i+2 onto the plane perpendicular to the raw vector at index i+1. The equality uses the natural identification of the two finite index sets.
This is the stated equality of the internal angles of the adaptively rerooted vertex stars. The declaration does not conclude the existence of a global Euclidean isometry taking P to Q, and does not take arbitrary polygon-faced polyhedra as input. Face congruence is encoded by corresponding dart-edge lengths; no separate two-arc cut or vertex-link certificate is an argument of this endpoint.
import Init
import Mathlib
import Mathlib.Analysis.LocallyConvex.Separation
import Mathlib.Analysis.InnerProductSpace.Dual
import Mathlib.Analysis.Convex.Topology
import Mathlib.Analysis.Convex.Combination
import Mathlib.Analysis.InnerProductSpace.PiL2
import Mathlib.Geometry.Euclidean.Angle.Unoriented.Basic
import Mathlib.LinearAlgebra.AffineSpace.Independent
import Mathlib.LinearAlgebra.LinearIndependent.Lemmas
import Mathlib.Data.Fin.Tuple.Reflection
import Mathlib.Data.Fin.Rev
import Mathlib.Geometry.Euclidean.Triangle
import Definitions.Def_P2MAssembly_Chapter13V2
set_option autoImplicit true
set_option autoImplicit true
open scoped Classical RealInnerProductSpace
open ProofsInTheBook.PlanarMap ProofsInTheBook.PlanarMap.CombMap
open ProofsInTheBook.Chapter13
open ProofsInTheBook.Ch13Euclidean
open ProofsInTheBook.Ch13EuclLink
open ProofsInTheBook.Ch13Realization
open ProofsInTheBook.Ch13VertexStar
open ProofsInTheBook.Ch13ArmVertexFull
open ProofsInTheBook.Ch13ArmVertex
open ProofsInTheBook.Ch13SubArc
open ProofsInTheBook.Ch13SubArcWrap
open ProofsInTheBook.Ch13MarkedSphere
open ProofsInTheBook.SphericalKernel
open ProofsInTheBook.Ch13Cauchy3D
variable {D : Type*} [Fintype D] [DecidableEq D]
variable {M : CombMap D}
theorem ProofsInTheBook.Ch13Cauchy3D.chapter13_cauchy_rigidity_v2
(P Q : ConvexEuclideanPolyhedron M)
(hcong : CongruentFaces P.toTri Q.toTri)
(v : M.Vertex)
(i : Fin ((rotatedStarP P.toTri (fun w => P.linkGeomAt w)
(adaptiveOffset P.toTri Q.toTri (fun w => P.linkGeomAt w) (fun w => Q.linkGeomAt w)) v).n - 1)) :
(rotatedStarP P.toTri (fun w => P.linkGeomAt w)
(adaptiveOffset P.toTri Q.toTri (fun w => P.linkGeomAt w) (fun w => Q.linkGeomAt w)) v).dihedral i =
(rotatedStarQ P.toTri Q.toTri (fun w => P.linkGeomAt w) (fun w => Q.linkGeomAt w)
(adaptiveOffset P.toTri Q.toTri (fun w => P.linkGeomAt w) (fun w => Q.linkGeomAt w)) v).dihedral
(Fin.cast (by
change (P.linkGeomAt v).n - 1 = (Q.linkGeomAt v).n - 1
exact congrArg (fun n => n - 1)
(vertexLinkGeometry_n_eq P.toTri Q.toTri
(fun w => P.linkGeomAt w) (fun w => Q.linkGeomAt w) v).symm) i) := by sorry