三维数据体的布尔运算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xs1997/article/details/86507468

布尔运算介绍

布尔运算是英国数学家布尔在1847年发明的处理二值关系的逻辑数学计算法,主要包括联合(Union),相交(Intersection),相减(subtraction)。直接用图说明,及时逻辑运算并交差。后续会贴上vtk运行代码。

布尔运算的步骤:
布尔运算的实现步骤主要如下:
(1)求取两个模型的相交线;
(2)根据交线分割含有交线的三角形;
(3)根据布尔运算的种类(并集,差集,或者交集),取舍两个模型上的三
角面元,形成最终的结果模型。
(1)求相交线 

第一步需要求两个模型的相交线。这涉及到求一个三角面片模型上每一个的三角面元与另一个模型上所有面元的交线。对meshA上的一个三角面片来说,meshB上一般只有非常少量的面片可能与它相交,所以为了剔除许多不必要的三角面片的相交判断,VTK对每个三角面片模型均建立一个空间复合OBBTree[301。OBB(Oriented Bounding Box)是指层次包围盒,他由Gottschalk,Lin:和Manocha在计算层级表示算法中用到‘14]。它把空间分为大小不同的层次包围盒,通过建立OBB Tree,可以实现空间中点、面元的快速定位。使用VTK中提供的vtkOBBTree对象,对meshA和meshB各建立一个vtkOBBTree对象。在做三角面元的相交判断时,只对有相交部分的包围盒中的三角面元做相交测试,这样就去除了很多不必要的判断。

第一步:计算T1和T2的法向量,在封闭模型中,法向所指向的是模型的外部。
第二步:判断T1上所有顶点与T2所在平面的位置关系:假设p1是T1上的一点,p2是T2上的一点,计算从pl指向p2的向量面,计算这个向量与T2的法向量砸的关系,如果p21与菘的角度大于90度,则定义pl在T2的外部,p1到T2的有符号距离为负值,反之如果面与菘的角度小于90度,则定义pl在T2的内部,到T2的有符号距离为正值。最后,如果面与冱垂直,则p2在T2所在平面内,距离为0。同样的方法计算T2上所有顶点到Tl所在平面的有符号距离。
第三步:如果Tl或者T2的所有顶点的有符号距离都是同号,则一个三角形
在另一个三角形的同侧,不存在相交。
第四步:计算Tl上顶点到T2平面的有符号距离的准确值
第五步:取出一对有符号距离的符号不同的点
第六步:在计算出三条边与另一个三角形的相交情况后,我们会得到两个交点。把这两个点相连,截取这个连线在三角形内部的位置。
(2)重新剖分三角面元
在计算出交线后,根据交线重新分割有交线的三角形。这一步可以利用
Delaunay三角剖分来实现。前苏联数学家Delaunay在1934年提出Delaunay三角
剖分,它是平面上点集的最优三角剖分,尽量避免了过于狭长和尖锐的三角形的
出现,即所有的三角形都满足“最大一最小角”优化准则。标准的Delaunay三角剖
分算法已经发展很成熟,代表性的有:分割一归并算法,三角网格生长算法等等。
在本文的应用情形下,需要带有约束边的Delaunay三角网格剖分。
VTK提供vtkDelaunay2D实现三角形的重新剖分。首先将一个三角面元
vtkCell旋转到XY平面,然后利用一个vtkDelaunay2D对象进行处理
(3)三角面元的取舍
在经过前面的步骤处理后,对于meshA或者meshB上的任何三角面元,它
要么完全在另一个模型的内部,要么完全在外部。根据布尔操作的类型,要过滤
出最终结果需要的三角面元,组成一个新的模型。

(1)在布尔操作Union(并集)中,取出属于meshA并且在meshB外部的
所有三角面元,和属于meshB并且在MeshA外部的所有三角面元
(2)在布尔操作Intersection(交集)中,取出属于meshA并且在meshB内
部的三角面元,和属于meshB并且在meshA内部的三角面元
(3)如果进行meshA—meshB的布尔操作,则取出属于meshA并且在meshB
外部的三角面元,和属于meshB并且在meshA内部的三角面元
在VTK发布的布尔操作代码中,对于一个三角面元的内外判断是通过判断
该三角形的重心是否在另一个模型内/J't-来实现的

猜你喜欢

转载自blog.csdn.net/xs1997/article/details/86507468