CCG 03-09:离散对应与曲率计算

本页只解决一个问题

连续曲面公式怎样落到三角网格和数值代码?

本页是原长篇讲义的单概念版本。第一次阅读只追踪本页定义的对象;看见未掌握的前置符号时,先沿链接退回,不要跳过定义硬背结论。

开始前

17. 离散对应

连续对象三角网格对象
黎曼度量gg每条边长lijl_{ij}(满足三角不等式)
面积dAdA三角形面积或顶点 dual area
高斯曲率K,dAK,dA角度亏损2π−∑θ2\pi-\sum\theta
Laplace–Beltrami余切 stiffness matrix + mass matrix
Dirichlet 能量12∑wij(fi−fj)2\frac12\sum w_{ij}(f_i-f_j)^2
调和映射固定边界后解稀疏线性/非线性系统
共形因子uu顶点尺度因子uiu_i

内部顶点的离散曲率:

Ki=2π−∑t∋iθit.K_i=2\pi-\sum_{t\ni i}\theta_i^t.

边界顶点:

Ki=π−∑t∋iθit.K_i=\pi-\sum_{t\ni i}\theta_i^t.

求和立即得到离散 Gauss–Bonnet:

∑iKi=2πχ(M).\sum_iK_i=2\pi\chi(M).

18. Python:由参数化计算基本形式和曲率

下面用 SymPy 验证球面的g,K,Hg,K,H。

import sympy as sp

theta, phi, R = sp.symbols("theta phi R", positive=True)
r = sp.Matrix([
    R * sp.sin(theta) * sp.cos(phi),
    R * sp.sin(theta) * sp.sin(phi),
    R * sp.cos(theta),
])

ru = r.diff(theta)
rv = r.diff(phi)
n = sp.simplify(ru.cross(rv) / sp.sqrt(ru.cross(rv).dot(ru.cross(rv))))

I = sp.Matrix([
    [sp.simplify(ru.dot(ru)), sp.simplify(ru.dot(rv))],
    [sp.simplify(rv.dot(ru)), sp.simplify(rv.dot(rv))],
])
II = sp.Matrix([
    [sp.simplify(r.diff(theta, 2).dot(n)),
     sp.simplify(r.diff(theta, phi).dot(n))],
    [sp.simplify(r.diff(phi, theta).dot(n)),
     sp.simplify(r.diff(phi, 2).dot(n))],
])

shape = sp.simplify(I.inv() * II)
K = sp.simplify(shape.det())
H = sp.simplify(sp.trace(shape) / 2)

print("I =", I)
print("II =", II)
print("K =", K)   # 取决于法向约定,但应为 1/R**2
print("H =", H)   # 符号取决于法向,绝对值为 1/R

读完必须能回答

  1. 不看公式,用自己的话回答开头的核心问题。
  2. 指出本页最重要公式中每个符号的类型:标量、向量、矩阵、映射还是集合。
  3. 找出定理成立所需的假设,并举一个删除某条假设后可能失败的例子。
  4. 对最小例子手算一遍;若本页含代码,再比较手算与程序输出。

前后课程

上一课:调和映射、共形性与等温坐标 | 返回模块目录