CCG 01-08:三角剖分与 Euler 示性数——第一次把拓扑算出来
本课只解决一个问题
只数网格中的顶点、边和面,为什么就能得到一个不随重新剖分改变的拓扑数?
1. 单纯形
低维单纯形是:
- -单纯形:顶点;
- -单纯形:边;
- -单纯形:三角形;
- -单纯形:四面体。
三角网格是许多-单纯形按公共面拼起来的单纯复形。
2. 为什么不能随便拼三角形
单纯复形要求:
- 一个单纯形的每个面也包含在复形中;
- 两个单纯形的交若非空,必须是双方共同的完整面。
因此两个三角形不能只在一条边的半段重叠,也不能彼此穿过却不添加交点。
3. 组合结构与几何结构
网格有两层信息:
| 层 | 数据 | 说明 |
|---|---|---|
| 组合结构 | 顶点编号、边、面邻接 | 谁与谁连接 |
| 几何结构 | 坐标或边长 | 有多长、什么角度 |
Euler 示性数只依赖组合结构。把顶点坐标移动得再远,只要连接关系不变, 不变。
4. Euler 示性数
对有限二维三角复形,定义
其中 分别为顶点、无向边、三角形数量。
单个三角形
所以
它与圆盘同胚,圆盘的 Euler 示性数为。
5. 细分为什么不改变
在一个三角形内部加入新顶点,并连接到三个旧顶点:
- ;
- ;
- 原来一个面变三个面,所以。
于是
边中点细分也可逐步验证 不变。一般三角剖分之间可通过保持拓扑的局部操作联系,因此 是拓扑不变量。
6. 闭可定向曲面的分类公式
亏格 是“把手数”。对闭、连通、可定向曲面:
| 曲面 | ||
|---|---|---|
| 球面 | 0 | 2 |
| 环面 | 1 | 0 |
| 双环面 | 2 | -2 |
若有 个边界分支:
圆盘,故;圆柱,故。
7. 四面体表面例子
四面体表面有
所以
这与球面一致。四面体表面虽然有尖角,但拓扑上是球面。
8. 怎样正确数边
面数组中每个三角形列出三条边,但内部边被两个面重复列出。必须将端点排序后去重:
def unique_edges(faces):
edges = set()
for i, j, k in faces:
edges.add(tuple(sorted((i, j))))
edges.add(tuple(sorted((j, k))))
edges.add(tuple(sorted((k, i))))
return edges直接使用 会把内部边算两次,得到错误的。
9. Euler 数能做什么,不能做什么
它适合:
- 快速发现漏面、重复面或意外边界;
- 在已知可定向、连通、边界数时反推亏格;
- 检查切割前后拓扑变化。
它不能单独区分所有空间;不同拓扑空间可能拥有相同。还需结合边界、可定向性、基本群或同调。
10. 常见误区
- 边必须按无向边去重后再计数。
- 对非流形或不完整数据仍能算出数,但未必能套用曲面分类公式。
- 不自动证明输入就是正常球面,还需检查连通、闭合和流形性。
- 几何上有凹陷不等于拓扑上多了洞。
11. 自测与答案
题 1。 两个三角形沿一条边拼成方形,求。
答案。,所以,与圆盘一致。
题 2。 闭可定向曲面若,亏格是多少?
答案。,所以。
题 3。 圆环区域 的 是多少?
答案。。
前后课程
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/ccg/01-08-triangulation-euler/
更新于:2026年10月12日