欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。
点云三角化定义
原文
说人话:
一个二维平面点集P三角化结果是一个满足以下条件的三角形集合:
1 所有三角形的并集刚好是P的凸包。
2 所有三角形顶集的并集正好是P。
3 对于三角化中任意两个三角形,要么有一个公共点(在P中),要么有一条公共边,否则完全不相接。
下图是一个三角化
根据上述定义可出三角化的一些基本性质:
1 三角化的外壳是一个凸包。
2 三角化中所有边没有相交(定义3可以保证)
3 三角化结果是一个平面图(planar graph)
三角化边数与点数的关系
引理:对于一个有n个点的二维点集P的任意三角化,正好有3n-h-3条边,h是P的凸包边界的边数。
以上图为例,点数一共是n=10, 凸包上边数h = 6, 总边数 e = 21
满足 e= 3*10-6-3
面的数量
对上述用例,如果只计算三角面12个面。
如果是一般的面,那么是13个面(外面的无限面也算一个)。
可以理解为一开始什么都没有的时候,是一个无限大的平面,计数为1。
当在平面上加入点并进行三角剖分时,总面数就是三角面数再加1。
最外围的无限面的边就是凸包的边。
上图中由橙色线转成的红色虚线区域就是一个往外无限扩张的无限面。与内部三角面一起组成了整个平面。
这种形式的划分以下称为大平面划分。
证明
设T是根据P三角化对大平面的划分。
设E为划分T的所有边集合,F为划分T的面集合(包含外围的无限面)。
在半边数据结构中,一条边是被两个面共享。
接下来我们用不同方式表示半边的数量,计算出边与面的关系,再结合欧拉公式证明命题。
半边集合 J = { ( e , f ) ∈ E × F , e 是某一条边 , f 是某个面 } 半边集合 J = \{(e,f)\in E \times F, e是某一条边, f是某个面\} 半边集合J={(e,f)∈E×F,e是某一条边,f是某个面}
一条边会被与该边相接的两个面共享,生成2个半边,那么 |J| = 2*|E|.
同时,从面的角度来计算半边,一个三角面会有3个半边(一共有|F|-1个三角面),最外边无限半边数量就是凸包边数(h)。
那么 |J| = 3*(|F|-1)+h。
组合一下就是 2*|E| = 3*(|F|-1)+h。
又根据欧拉公式有 3n - 3|E| + 3|F| = 6。
结合一下,得到|E|=3n -h -3。
命题得证。
本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。创作不易,帮忙点击公众号的链接。