原文链接:https://blog.csdn.net/shang_jia/article/details/38760089?locationNum=7&fps=1

二维三角剖分技术已经非常成熟,而且网上现成的实现代码也很多;下面说一下三维曲面的三角剖分:

曲面剖分通常有两种方法,其一是将点投影到某一平面,运用平面的三角剖分算法完成剖分,而三维点问连接关系不变,这种方法将三维问题转化为平面问题,可称为平面投影法;其二是直接由三维点来构造剖分,称为直接剖分法.三角剖分通常有两种类型,第一类是三角剖分的顶点就是所给点集P,不改变原点集的拓扑结构,实质是对P的线性插值;另外一类是在一定的误差范围内用剖分来逼近曲面,这时的顶点在数量和位置上均不同于原点集。

1,平面投影法

平面投影法就是将三维点投影到某平面,如x—y平面,然后对投影点集作平面域的三角剖分,最终形成的曲面三角剖分的点间连接关系与相应的投影点间的连接关系相同,这种方法的实质是平面域的三角剖分.近几年来在剖分研究方向、具体算法等方面有了很大的进展.当平面4点形成凸四边形时将有两种剖分,对采用哪一种三角剖分可以提出不同的选择原则,最常用的有最小内角最大化、边的总长度最小化即最小权等.

2,直接剖分算法

与平面投影法不同,直接剖分算法是直接根据三维散乱点构造三角剖分.实用的直接剖分算法很少,1988年Choi提出的一种增量算法[3是较好的一种方法,得到广泛的应用.Choi算法有下述几个重要概念:

(1)顶点、边、三角形、法矢散乱点集中的每一点在剖分中为三角形的顶点;3个顶点V1、V2、V3,如果满足det(V1、V2、V3)≠0 则这3点形成一个三角形;从原点看去,按逆 时针方向依次连接三角形顶点,相邻两点形成的有向边称为剖分的边;由上述有向边按右手准则来确定三角形的单位法矢.

(2)可见边

对于边AB,任一顶点P与它的关系有如下3种:

如果det(A,B,P)<0,则P.Right.AB;

如果det(A,B,P)=0,则P.On.AB;

如果det(A,B,P)>0,则P.Left.AB

若顶点(P.Right.AB),则称边AB相对点P可见,顶点A、B称为P的可见点.

(3)凸顶点、凸多边形

若一系列三维点形成的边封闭,三角形不相交,则这些点形成一个多边形.P、Q、R是按逆时针方向依次连接的3个点,若det(Q,R,P)>=0,则称Q是一个凸点;若det(Q,R,P)>0,则称Q为严格凸点.若多边形所有点都是严格凸点,则该多边形为严格凸多边形.

(4)轨迹生成

在工程应用中,曲面内部某些散乱点可能属于特定的轨迹线,如截面线、特征线等,为了准确地反映曲面形状,剖分中必须将这些点相互连接,以得到相应的轨迹线.

如下图所示,V1、V2为轨迹线上的点,按照轨迹生成算法,V1、V2必须连接,同时去掉与其相交的边.方法是首先判断、是否已经相连,若已相连则停止,否则搜索与相交的边e,对包含e的四边形交换对角线即去掉了边e.

(5)边界剪裁

边界剪裁就是要从剖分中删去外边界环之外和内边界环之内“不合法”的三角形,对下图中的例子,

首先用轨迹生成算法获得满足要求的剖分,如下图中(a)所示,然后进行边界剪裁,去掉下图(a)中标号为1、2、3的3个三角形,最终获得正确的剖分如下图(b)所示.

Choi算法的简要步骤如下:

第1步预处理

①找到一个点Pc,使得从Pc点能够看到所有的散乱点,并作一过Pc的轴U;

②对所有的点做变换Pi—>Vi,Vi=Pi-Pc;

③按Vi与U的夹角大小,将Vi升序排列.

第2步三角剖分

①初始三角剖分

最初的剖分是从V1、V2开始,首先得到边V1V2,接着从V3开始逐点搜索,若共面则继续搜索,直至一不与前面点共面的顶点,连接此点与前面所有点从而构成初始剖分.如下图所示:

②剖分主过程

(a)下一个新N插入时,搜索N的所有可见点,并确定最左可见点LVN(V3)和最右可见点RVN(V4);

(b)构造一个三角形,它的顶点是N、LVN和LVN的下一点;

(c)若此时边界非凸,则继续从此非凸点开始与其下一点N构造三角形,并从TBL中删去该非凸点,直至边界为凸;

(d)处理完一个点,则将此点从点集中删除,若点集为空,则停止,否则转步骤(a).

第3步 轨迹生成.

第4步 边界剪裁.

Choi算法实际上仅仅是二维三角剖分的一种扩展,它要求以点云中的一点为原点的极坐标系,所有点对角度变量为一一映射,这样就极大的限制了它的使用范围。

曲面剖分优化准则

优化准则的选取直接影响到剖分结果.当剖分的两个三角形形成一个凸四边形时,存在两种剖分形式,这时须依据一定的准则来确定.曲面剖分常用的优化准则有外接曲面拟圆准则、标量积最大、空间形状优化准则以及光顺准则等,其中外接曲面拟圆准则是单侧性准则和模拟圆准则的广义形式,它和标量积最大准则只单纯考虑形成凸四边形的两个三角形之间的关系,而空间形状优化准则以及光顺准则则考虑两个三角形周围的4个三角形对剖分的影响.

1,外接曲面拟圆准则

外接曲面拟圆准则是二维剖分中的外接圆准则(Delaunay)和三维的外接球准则在曲面剖分中的推广形式,也是单侧性准则和模拟圆准则的广义形式.

单侧性准则称:曲面剖分的三角形的一侧不含有点集中的任一点,则称该三角形为局部最优;

模拟圆准则称:若三角形的一侧没有满足如下条件的点:在点集中且向三角形平面的投影落在该三角形的外接圆内,则称该三角形为局部最优.

由于这两个准则与外接圆准则(Delaunay)和三维的外接球准则不能统一描述,且在避免病态三角形方面尚有不足,因此资料1提出了外接曲面拟圆准则.

外接曲面拟圆:给定曲面 E上不共线的3 点P1、P2 、P3 , 它们确定的平面的单位法矢为n,以三角形△P1P2P3的外接圆圆心为起点沿n方向可以确定一射线,该射线与E的交点为C ( 若有多个交点则取最远处的点) ,以C 为中心,以C P1为半径的球与E的交称为△P1P2P3关于 E的外接曲面拟圆.
外接曲面拟圆准则:曲面上3 点组成三角形,若外接曲面拟圆区域内没有内环且不含有点集中任意点,则称该三角形局部最优 .
资料1同时还证明了以下两个结论:
( 1 ) 满足外接曲面拟圆准则必满足模拟圆准则;
( 2 ) 外接曲面拟圆准则等价于单侧性准则.

2,标量积最大准则

标量积最大准则是指对剖分形成的凸四边形,存在的两种剖分,计算每一剖分两个三角形单位法矢的标量积,取最大的一个剖分.标量积最大也就是形成剖分的两个三角形平面夹角最大,更趋于平坦.

3,空间形状优化准则

空间形状优化准则是指剖分形成的两个三角形有5条棱边,根据周围4个相邻的三角形判断各棱边的凹凸性,凸者边值为1,凹者边值为一1,共面时边值为0,计算两种情形下的5条边边值之和的绝对值K,取K值大的一种为最优剖分.具体下图所示,图中lij表示三角形i与三角形j的公共棱边的凹凸,公共棱边为凸时,其边值为1;公共棱边为凹时,其值为一1;两个三角形共面时,其值为0.接着分别计算K

Ka=abs(zl2+z25+z26+z14+z13)

Kb=abs(zl2+z25+z26+zl4+zl3)

比较它们的大小,取K 值较大的那种剖分线性插值的保凸性和光顺性会直接影响插值曲面保凸和光顺的程度,空间形状优化准则的出发点就是由剖分生成各类连续曲面时,生成的曲面比较光顺.

4,光顺准则

光顺准则是Choi算法中采用的剖分准则,剖分中两个三角形形成的凸四边形的每条边为两个三角形所共有,分别计算这两个三角形单位法矢标量积,这样对应每一种剖分就有4个标量积值,计算4个标量积的最小值,取最小值最大的一种剖分作为最优剖分.

另外,三维剖分的难点还有对边界的处理,包括边界闭合的情况。

目前有几篇论文是针对这类课题的,主要描述如下:

先需要几个基本概念:

定义1. 边界边.在三角划分过程中,位于已划分区域和未划分区域之间的三角形边称为边界边(如下图所示,边1~11为边界边).
定义2. 边界环.在三角划分过程中,由边界边按逆时针或顺时针方向依次首尾相连构成的环称为边界环(如下图所示,边1~11按逆时针方向构成边界环).


定义3. 最优顶点.设点P为未划分区域离散点集中的任意一点,若点P与某边界边AB构成的三角形最接近正三角形,则称点P为边界边AB的最优顶点. 
定义4. 可见顶点.设点P为未划分区域对应测量点集中的任意一点,且点P为某边界边AB的最优顶点.若点P与另一边界边BC构成的三角形不与已划分区域折叠,并且最大内角不超过θ,则称点P为边界边BC的可见顶点.如下图所示,点P为边AJ和边BC的可见顶点,而不是边CD,DE,EF等的可见顶点.

下面则是针对边界问题的重点:

边界环的裂变与融合

在3D 空间对离散数据进行三角划分的基本思想是:由初始三角形开始,从已划分区域边界向未划分区域逐步扩展形成新的三角形,直至三角网格覆盖整张曲面.三角网格在3D 空间随着离散数据点的分布而扩展,不需要将数据点向二维平面投影,复杂曲面也不需要分片投影.在算法实现的过程中,发现三角网格并不是简单地扩展,还会出现已划分区域隔离和相遇的情况.因此,在基本算法的基础上,又提出了边界环裂变和边界环融合的新概念,以使算法能够适应各种形态的曲面.下面我们通过对非封闭曲面、封闭曲面和多连通封闭曲面划分情况的分析来引出这两个概念

1,非封闭曲面

从非封闭曲面的离散点集中取出3个点,构成初始三角形,此时的边界边为初始三角形的三条边.由初始三角形开始,为每一条边界边寻找最优顶点,向未划分区域扩展生成新的三角形,直到已划分区域覆盖整张曲面.由于曲面是非封闭的,在三角网格向未划分区域扩展的过程中,一个已划分区域与另一个已划分区域不会相遇.

2,简单封闭曲面

封闭曲面由于没有边界,在三角网格向未划分区域扩展的过程中,会出现已划分区域相遇的情形,需要将相遇的已划分区域缝合起来,使得三角网格也是封闭的.如下图所示,三角划分最终形成边界环L0.

(1)  若 L0 的边界边数( 记为bedge_num)>4,则为边界环L0 中的每一条边界边寻找最优顶点.当为边界环L0 中的一条边界边E1寻找最优顶点时,首先遍历L0中的每一个结点V1…Vn,发现有结点Vi 与边界边E1能构成较优三角形,则连接Vi与E1的两端点,构成三角形T.此时三角形T将边界环L0分裂成两个边界环L1和L2,再对边界环L1和L2分别处理.若L0中未发现有任何结点能与边界边E1构成较优三角形,则在未划分区域的离散数据点中为边界边E1寻找最优顶点.这种因为三角网格缝合而产生的一个边界环分裂成两个边界环的过程就称为边界环的裂变;

(2) 若L0的bedge_num=4(如图3中的边界环L1),则连接四边形的对角线生成两个三角形,边界环封闭;

(3)  若L0的bedge_num=3,就由此3条边界边构成一个三角形,边界环封闭.所有的边界环最终都会收缩为bedge_num=4或bedge_num=3的情形.当所有的边界环处理完毕时,封闭曲面的三角划分结束,从而得到一张封闭的三角网格.

3,多连通封闭曲面

与简单封闭的曲面三角化过程一样,在三角网格向未划分区域扩展的过程中,多连通封闭曲面(如图6中的零件表面)的边界环也会发生裂变,且由于多连通封闭曲面的法矢变化复杂,在三角划分过程中还会发生两个边界环融合形成一个边界环的情况,如图4所示.在三角划分过程中,有两个边界环L1,L2.当为边界环L1中的某一条边界边E1寻找最优顶点时,遍历L2中的每一个结点V1…Vn,发现有结点Vi 与边界边E1能构成较优三角形,则连接Vi 与E1的两端点,构成三角形T.此时三角形T将边界环L1,L2连接成一个边界环L,再对边界环L进行处理,继续向未划分区域扩展.这种因为三角网格缝合而产生的两个边界环合并成一个边界环的过程称为边界环的融合.

以上蓝字部分皆引用自参考资料2,文中的算法或许仅仅对边界有用,对稍微复杂点的曲面以及不太均匀的点云分布则是无能为力的!

但是目前为止,复杂的三维三角剖分还是一个未解决的问题,也就是说,目前的已有算法只能针对相对规则的图形(接近严格凸集),以及点云均匀分布的情况。

我尝试用函数拟合去处理点云分布不太均匀的情况,剖分出来的模型可以在形状上趋近于真实图形,可是会发生大量的三角面片相交的情况。见下图(远处的为点云,近处的是用线性函数拟合剖分的结果):

主要是因为严格的三角抛分是需要回溯的(类似于动态规划),也就是经常需要对已经抛分的面片重新调整 ,针对三维的这个回溯过程我暂时还没有实现,希望能有老师为我指点迷津。

已经有不少文献提出将点云进行分层,然后再三维重建来间接的进行三角剖分。 针对这样的思路我将做一些工作,希望能有比较好的结果吧。

参考资料:

1,孔德慧,陈其明,汪叔淳.一种新的曲面剖分优化准则 [ J ] .工程图学学报,1995 ,16 (1):28 ~34 .

2,肖双九,邱泽阳,张树生,杨海成.多连通曲面离散点集的3D三角划分算法研究 .软件学报,2002,13(4).

3,张永春 ,达飞鹏, 宋文忠.三维散乱点集的曲面三角剖分.中国图象图形学报,2013年12月

【算法分析】三维曲面的三角剖分算法分析相关推荐

  1. 基于图像的三维物体重建:在深度学习时代的最新技术和趋势综述之三维曲面解码...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1.三维曲面解码 基于体积表示的方法在计算上非常浪费,因为信息只在三维形状的表面或其附近丰富.直接处理 ...

  2. 导出txt文件宏_利用solidwords二次开发导出三维曲面方阵点坐标方法

    本文介绍了利用solidwords二次开发(API Application Program Interface,应用程序接口)实现三维曲面基于基准平面上的矩阵点投影到三维曲面上点的坐标值导出方法:利用 ...

  3. python绘制三维曲面图-python中Matplotlib实现绘制3D图的示例代码

    Matplotlib 也可以绘制 3D 图像,与二维图像不同的是,绘制三维图像主要通过 mplot3d 模块实现.但是,使用 Matplotlib 绘制三维图像实际上是在二维画布上展示,所以一般绘制三 ...

  4. 4.5 matlab三维曲面(mesh、fmesh、meshc、meshz、surf、fsurf、surfc、surfl)

    1.平面网格数据的生成 (1)利用矩阵运算生成 (2)利用meshgrid函数生成 [X,Y]=meshgrid(x, y); 其中,参数x.y为向量,存储网格点坐标的X.Y为矩阵. %方法1 x = ...

  5. MATLAB三维曲面绘图你不得不知道的...

    三维曲面图,可以用surf(有阴影)或mesh(没阴影)命令,如: xx=linspace(-1,1,50);%以上两句的意思是 yy=linspace(-2,2,100);%创建一个xy坐标平面前建 ...

  6. 知道坐标matlab三维作图,已知点坐标,要求根据坐标作出三维曲面图

    已知400个点的X,Y,Z坐标,分别为下面矩阵,如何作出三维曲面图? X=[0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0. ...

  7. matlab 三维核密度图_Matlab精彩画图示例:三维网状图和三维曲面图

    接上篇:Matlab精彩画图示例:绘制图上图 这篇介绍两个绘制三维图的命令: mesh - 绘制三维网状图 surf - 绘制三维曲面图 matlab代码如下: 绘制三维图的matlab代码示例 程序 ...

  8. matlab 三维点 边界曲面,不用matlab如何从散点数据绘制极坐标三维曲面图?

    [ 在 OSN10 (老洪) 的大作中提到: ] : 标  题: Re: 不用matlab如何从散点数据绘制极坐标三维曲面图? : 发信站: 水木社区 (Sat Dec 15 20:47:17 201 ...

  9. 【matlab】三维曲面

    [matlab]三维曲面 三维曲面用到了surf()函数 语法: surf(X,Y,Z): 先来看一个例子: >> [X Y]=meshgrid(-2:0.5:2); >> Z ...

最新文章

  1. Datawhale来浙大啦!
  2. Java程序 实验小全
  3. 【C++】语法小知识
  4. 部署gradle_使用Gradle消除开发重新部署
  5. 实体与属性间的划分原则
  6. DBackup环境部署linux,linux_BackupPC 安装部署
  7. python 字符串排序 偶数位交换_在Python中将字符串列表转换为整数排序列表
  8. 都是打工的,为啥职场中存在着那么多勾引斗角?
  9. twig php代碼,有没有办法在wordpress的.twig文件中编写php代码?我试图使用.twig模板文件中的表单值发送邮件...
  10. 面试题3二维数组中的查找
  11. 简单好玩的手机编程代码
  12. 计算机电气工程论文,计算机在电气工程自动化控制的作用
  13. jQuery推箱子小游戏
  14. 计算机裸机的功能,计算机中裸机是指什么
  15. 已知线段上某点与起点的距离,求该点的坐标
  16. ubuntu网络检查服务器端口是否开放
  17. excel表格公式出现#REF是什么意思
  18. 【解决方案】Microsoft Edge 浏览器 出现“无法访问该页面”问题
  19. 西门子数控系统的机床数据采集
  20. Elasticsearch快速初始化数据

热门文章

  1. ApiDoc json格式提交参数
  2. python海龟库教学
  3. 穿越时空的回响:华为欧洲创新日的蝴蝶振翅
  4. matlab trapz无穷,trapz(matlab中trapz函数用法)
  5. 3.2 Matplotlib Bar 柱状图
  6. rdp协议编程java_关于Java RDP协议实现远程桌面连接的开源项目properjavardp | 学步园...
  7. “鼠标屏幕取词”技术
  8. 【观察】AWE 2019:三组关键词前瞻未来智慧家庭
  9. Android应用程序安装过程浅析
  10. 【数据结构之排序】-详解希尔排序