§4.6, p. 63 — the cotangent weights are intrinsic: (cot ∠uqv + cot ∠upv)/2 = Σ (−ℓ²_uv + ℓ²_vq + ℓ²_uq)/(8 a_uvq), Heron areas
ProvedGeomDL.Cotangent.intrinsic_cotangent_weightsLet be the faces of a manifold triangular mesh on the nodes , embedded by points of a Euclidean space, with metric . Let be an interior edge shared by exactly two faces, and , both non-degenerate triangles. Write
for Heron's area (and likewise ). Then
and the cotangent weight (25), with , equals the right-hand side divided by .
The right-hand side involves only the edge lengths , so the cotangent weights, defined in (25) through angles, depend only on the metric of the mesh: they are intrinsic.
Formalization Note The printed display reads with exactly this right-hand side. The right-hand side equals , which is for the of (25): the display omits (25)'s factor . The theorem states both readings: the identity for , and of (25) as the right-hand side over . Here is computed from the geometric face areas; Heron's formula (a separate milestone) makes it intrinsic as well. Non-degeneracy of the two faces is required because Lean's is at the angles and and the Heron area of a degenerate triangle is .
import Mathlib import Definitions.Def_GeomDL_Cotangent_Defs open EuclideanGeometry
namespace GeomDL.Cotangent
variable {V P : Type*} [NormedAddCommGroup V] [InnerProductSpace ℝ V] [MetricSpace P]
[NormedAddTorsor V P]
/-- §4.6, p. 63 (corrected normalisation): for an interior edge `(u, v)` shared by the
non-degenerate faces `(u, q, v)` and `(u, p, v)` of a manifold mesh,
`(cot ∠uqv + cot ∠upv)/2 = (−ℓ²_uv + ℓ²_vq + ℓ²_uq)/(8 a_uvq) + (−ℓ²_uv + ℓ²_vp + ℓ²_up)/(8 a_uvp)`
with the areas given by Heron's formula in the lengths `ℓ`, and the weight `w_uv` of (25)
is that right-hand side divided by `a_u`. The printed display omits (25)'s `1/a_u`. -/
theorem intrinsic_cotangent_weights {n : ℕ} (M : TriMesh n) (x : Fin n → P) {u v q p : Fin n}
(hmesh : IsManifoldMesh M) (hedge : IsInteriorEdge M u v q p)
(hq : AffineIndependent ℝ ![x u, x v, x q]) (hp : AffineIndependent ℝ ![x u, x v, x p]) :
(Real.cot (∠ (x u) (x q) (x v)) + Real.cot (∠ (x u) (x p) (x v))) / 2 =
(-(edgeLength x u v) ^ 2 + (edgeLength x v q) ^ 2 + (edgeLength x u q) ^ 2) /
(8 * heron (edgeLength x u v) (edgeLength x v q) (edgeLength x u q)) +
(-(edgeLength x u v) ^ 2 + (edgeLength x v p) ^ 2 + (edgeLength x u p) ^ 2) /
(8 * heron (edgeLength x u v) (edgeLength x v p) (edgeLength x u p)) ∧
cotWeight M x u v =
((-(edgeLength x u v) ^ 2 + (edgeLength x v q) ^ 2 + (edgeLength x u q) ^ 2) /
(8 * heron (edgeLength x u v) (edgeLength x v q) (edgeLength x u q)) +
(-(edgeLength x u v) ^ 2 + (edgeLength x v p) ^ 2 + (edgeLength x u p) ^ 2) /
(8 * heron (edgeLength x u v) (edgeLength x v p) (edgeLength x u p))) /
vertexArea M x u := by sorry
end GeomDL.Cotangent
Confirmed by the mission captain (proposal self-audit).
Confirmed by the moderator at approval.