CCG 03-09:离散对应与曲率计算
本页只解决一个问题
连续曲面公式怎样落到三角网格和数值代码?
本页是原长篇讲义的单概念版本。第一次阅读只追踪本页定义的对象;看见未掌握的前置符号时,先沿链接退回,不要跳过定义硬背结论。
开始前
17. 离散对应
| 连续对象 | 三角网格对象 |
|---|---|
| 黎曼度量 | 每条边长(满足三角不等式) |
| 面积 | 三角形面积或顶点 dual area |
| 高斯曲率 | 角度亏损 |
| Laplace–Beltrami | 余切 stiffness matrix + mass matrix |
| Dirichlet 能量 | |
| 调和映射 | 固定边界后解稀疏线性/非线性系统 |
| 共形因子 | 顶点尺度因子 |
内部顶点的离散曲率:
边界顶点:
求和立即得到离散 Gauss–Bonnet:
18. Python:由参数化计算基本形式和曲率
下面用 SymPy 验证球面的。
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读完必须能回答
- 不看公式,用自己的话回答开头的核心问题。
- 指出本页最重要公式中每个符号的类型:标量、向量、矩阵、映射还是集合。
- 找出定理成立所需的假设,并举一个删除某条假设后可能失败的例子。
- 对最小例子手算一遍;若本页含代码,再比较手算与程序输出。
前后课程
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/ccg/03-09-lesson/
更新于:2026年10月12日