三角剖分

来源:互联网 发布:c语言 乘法 溢出 编辑:程序博客网 时间:2024/04/29 06:25
一、凸包:对于一个平面点集V,包含V内所有点的一个最小凸多边形,就是该点集V的一个凸包。
二、Delaunay三角剖分:只包含Delaunay边的三角剖分。
三、Delaunay边:
1、定义:具有空圆特性的边。空圆特性:存在一个圆经过点集V内两点a、b,圆上至多3点,圆内不包含点集V内任何其他点,则边ab是Delaunay边。
2、必要条件(准则):
(1)空圆特性;(二维)
(2)最大化最小角。(二维,三维)
3、特性:
(1)最近性;
(2)唯一性;
(3)最优性;
(4)最规则;
(5)区域性;
(6)具有凸多边形外壳。
4、构造(优化处理):
LOP处理(局部优化过程)。
5、算法:  
(1)lawson算法;
(2)bowyer-watson算法。
四、论文摘记:
1、《efficiently triangulation of a simple polygons》
算法:向最大多边形中的两端点间递归地插入对角线。
耗时O(n^2)。
2、《基于激光雷达的典型三维地面目标识别技术研究—刘瑶》(三维)
Delaunay三角剖分步骤:
  • (1)遍历三维点云,寻找Z值最大点,作为种子点;
  • (2)种子点为起点,寻找最近点,生成种子边;
  • (3)遍历三维点云,寻找能与种子边满足最大化最小值原则的第三点,构成种子三角形,并放入delaunay三角形链表;
  • (4)依次以种子三角形中各边为扩展边,重复步骤3;
  • (5)以步骤四中的新三角形为起点,重复步骤4,直到所有点云插入完毕。
3、http://www.cnblogs.com/zhiyishou/p/4430017.html(二维)
Delaunay三角剖分算法伪代码:
优化后算法伪代码:
1
input : 顶点列表(vertices)   // 外部生成的随机或乱序顶点列表
2
output: 以确定的三角形列表(triangles)
3
    初始化顶点列表
4
    创建索引列表(indices = new Array(vertices.length))    
5
               // indices 数组中的值为0,1,2,……,vertices.length-1
6
    基于vertices中的顶点x的坐标对indices进行sort
7
               // sort后的indices值顺序为顶点坐标x从小到大排序(也可对其他坐标)
8
    确定超级三角形
9
    将超级三角形保存至未确定三角形列表(temp triangle)
10
    将超级三角形push到triangles列表
11
    遍历基于indices顺序的vertices中的每一个点   // 顶点是由x从大到小出现
12
        初始化边缓存数组(edge buffer)
13
        遍历temp triangles中的每一个三角形
14
            计算该三角形的圆心和半径
15
            如果该点在外接圆的右侧
16
                则该三角形为delaunay三角形,保存至triangles
17
                并在temp中除掉
18
                跳过
19
            如果该点在外接圆外(即也不是外接圆右侧)
20
                则该三角形不确定
21
                跳过
22
            如果该点在外接圆内
23
                则该三角形不为delaunay三角形
24
                将三边保存至edge buffer
25
                在temp中除掉该三角形
26
        对edge buffer进行去重
27
        将edge buffer中的边与当前的点进行组合成若干三角形并保存至temp triangles中
28
    将triangles与temp triangles进行合并
29
    除去与超级三角形有关的额三角形
30
end
4、《一种快速三维散乱点云的三角剖分算法》
常规三维三角剖分算法:
原算法是基于生长法剖分过程,其基本思想是首先生成
一个满足条件的三角形;然后以该三角形三条边为基础应用
边的扩展准则,向三个不同方向寻找满足条件的点,生长成
新的三角形;再以新三角形为基础向四周生长,直至循环扩
展完所有三角形。在进行边的扩展时主要是引入了空间离
散点集三角剖分的5条准则:
1)异侧准则
寻找点与待扩展三角形的第三点分置扩展边两侧,不能
位于待扩展边或其延长线上。为了使扩展后的曲面保持连
续平滑的特性,在扩展每一条边时,都应在与三角形第三点
相反方向上寻找符合条件的点。扩展之后新三角形的法向
量与原三角形的法向量方向相反。
2)法向量夹角最大准则(Anglesbetweennormals)
由于曲面具有光滑连续性,因而构成三角形时应使新三
角形与原三角形所构成的曲面尽量光滑,才会保证重构之后
的效果好。
3)阈值距离准则(Thresholddistancecriterion)
阈值距离将寻找点与待扩展边中点之间的距离限制在
一个阈值距离之内,使得边扩展时可以在一定范围内进行候
选点的比较。
4)最小内角最大准则(Max-minanglecriterion)
当按照法向量夹角最大准则和阈值距离准则进行点的
搜索时,还会遇到这样一种情况,对于边AB来说,空间中两
个点P和P′均在阈值距离之内,且它们与待扩展边AB两个
端点共面,即■ ABP和■ ABP′与■ ABC的法向量夹角相等,
在这种情况下,需要判断哪个点与AB所构成的三角形是最
优。算法规定最小内角最大准则,即新构成的三角形的最小
内角是所有可能构成的三角形最小内角中的最大值。
5)边的最大使用次数准则
为了保证在剖分过程中不出现三角形之间交叉重叠的
现象,限定每一条扩展边最多只能被两个三角形所共用,即
每一条边最大使用次数为2。
5、《三维散乱点集的曲面三角剖分
对于三维空间散乱点云的曲面三角剖分方法,主要为平面投影法和直接剖分法。

五、三维三角剖分算法总结
算法伪代码:
1
input : vertices
2
output: edges
3
寻找Z值最大点,作为种子点,d;
4
寻找最近点,d1,构成种子边,edges[0]={d, d1}
5
遍历edges中的每条边edges[i]
6
    min=180
7
    遍历vertices中的每个点vertices[j]
8
        求该点与该边所形成三角形的最小角a;
9
        if a<min
10
            min=a;k=j;
11
    endfor
12
    把该点存入edges,edges[i+1]={d, vertices[k]}, edges[i+1]={d1, vertices[k]};
13
endfor
14
将edges中的各边在三维坐标系中进行绘制;
六、改进算法
仔细分析原算法发现,其核心在于对每一待扩展边的扩
展。而原算法边的扩展大部分cpu时间都花在待扩展点的
搜索上,由于它在全局范围内搜索,很难进行快速的三角剖
分。特别是当点云数据逐渐增大时,此算法的复杂度成几何
级数增长。而实际上,很容易知道侯选的最优点通常在待扩
展边的邻域内,如果能仅对待扩展边邻域内的点进行搜索比
较而不是搜索整个点云空间将会极大的提高剖分效率。因
此,引入八叉树搜索的思想,对数据进行空间划分[8],从而把
对数据点的操作限制在邻域内,划分按以下步骤进行:
步骤1:计算散乱数据点的最小长方体包围盒,得到min
 x,max x,min y,max y,min z和max z的值。
步骤2:将包围盒分为number x,number y和number z
个小立方栅格,分别对应x,y,z3个坐标轴方向。计算如下,
number x= (max x-min x)/edge
number y= (max y-min y)/edge
number z= (max z-min z)/edge (1)
其中edge为立方栅格的边长。
步骤3:以(x,y,z)为序,对立方栅格进行编号,划分得网
格如图1。
 对散乱数据进行局部三角剖分,应首先读入数据点,建
立数据点及其邻近点之间的空间位置关系。为此,需要建立
数据点与立方栅格之间的相互对应关系。对任一数据点可
以用Hash函数方法求其所在的立方栅格号:
cell index=(xi/edge)+(yi/edge)×number x+
(zi/edge×number x×number y+ 1) (2)
即根据搜索目标的索引值,计算上下左右共26个栅格
邻域内的点。这种方法能够大大加快搜索速度,所要查找的
对象集的规模越大,该方法的优势越明显。
改进算法通过以下步骤来寻找某一数据点的临近点集:
1)由该点的序号通过Hash函数计算出该点所在立方
栅格序号。
2)根据立方栅格的编码方案,计算出其上下左右与之相
邻的共26个立方栅格的序号。
3)根据该立方栅格及其周围26个立方栅格的序号,由
立方栅格的存储结构通过指针运算查找到所有立方栅格内
的数据点,其集合除去该点本身即为该点的邻近点集。
其数据结构见表1。
 优化后的算法流程图如下:
 改进后的三维三角剖分算法。可同时保证实时性和准确性。
原创粉丝点击