VC+OpenGL实现空间三维Delaunay三角剖分

 

    三维建模和等值面的绘制过程中,需要经常使用三角形网格对数据体进行构面。而三角形的生成基于Delaunay三角剖分的算法实现的。前段时间一直在考虑数据体的任意剖面切割该怎么做,但是一直被两个问题所困扰,一个就是交点问题,然后就是对所求交点进行绘制问题(三角形网格面构造)。终于在半个月后有了一点收获。

1 Delaunay三角剖分原理

     三角剖分算法可以分为针对二维的局部剖分和三维的全局剖分算法。在二维情况下建立的基于简单的三角形构面的方式,而三维情况下则是需要建立基于四面体的方式构造空间曲面。在遇到三维空间散乱点的构面问题时,可以直接采用三维Delaunay剖分,亦可先将三维坐标预处理转换到二维坐标系中,间接的采用二维Delaunay剖分算法。想着用最简单的方式实现功能的时候,就选择了第二种方式。

    关于二维的Delaunay三角剖分原理,文献资料相当多,随便一搜就是一大堆,网上也有很不错的介绍:

Delaunay三角剖分(Delaunay Triangulation)相关知识:http://www.cnblogs.com/soroman/archive/2007/05/17/750430.html

[图形算法]Delaunay三角剖分算法 :http://www.cnblogs.com/renliqq/archive/2008/02/06/1065399.html 

关于生成三角形网格的算法也是很多,我选择了稍微老套点的生长法,实现起来还算是思路清晰。

2 三维空间散乱点Delaunay三角剖分程序实现

     这个过程中,我们首先需要实现的就是三维坐标向二维坐标的转换。参数化的方程组求解可以参考:

http://z.baidu.com/question/81807904.html?fr=qrl&cid=1071&index=4&fr2=query 其中需要我们注意的就是自己需要投影的平面方程了。比如需要制作剖切面,找到它的法向以后,中间还需要再加上一个步骤,那就是实现空间三维点投影到另外的一个空间平面上的过程,然后再接着进行向二维坐标的转换。任意方向剖切面的算法实现步骤:
Step1 求取空间任意方向剖切面的方程。(利用三点确定平面原理+点法式平面方程);
Step2 求取剖切面与三维数据体的交点;
Step3 根据得到的交点数据集进行坐标投影,将三维坐标点投影到剖切面上;
Step4 再将完成投影后的三维数据点集进行二维直角坐标系的参数化求解(投影到(U,V)二维坐标系中);
            可以首先确定一个向量U,选为第一个点到距离第一个点最远的另一点的向量;
            然后确定另一个向量V,选为垂直于U和剖切面发向量的方向向量;
Step5 进行针对处理后的二维数据点集的Delaunay三角剖分;
Step6 将数据还原为三维坐标。
程序实现代码(VC++):




3 三维空间任意剖面实现



本文引用地址: http://www.sciencenet.cn/m/user_content.aspx?id=256392

你可能感兴趣的:(算法,网格,query,图形)