Posted on 2023-05-21 20:21
eryar 阅读(577)
评论(0) 编辑 收藏 引用 所属分类:
2.OpenCASCADE
OpenCASCADE曲面求交之网格离散法2
eryar@163.com
1 Introduction
由朱心雄等著《自由曲线曲面造型技术》书中对曲面求交之网格离散法描述如下:该法的基本思想是先将曲面离散为由小平面片组成的网格,当网格足够密时,可以认为已经非常接近真实曲面,对分别表示不同曲面的两张网格,利用平面片求交法求得的交线,并以此交线近似代表曲面间的交线。这种方法原理简明,便于实现,适用范围广,任意参数曲面均可利用该法求交。但为获取精确地交线,则必须生成非常细密的网格,这将导致占用内存多,计算花费大。因此,实际工作中很少单一使用离散网格法,而常将其与其他方法结合使用。
OpenCASCADE中对于曲面求交也提供离散网格法,其中曲面的离散网格由类IntPatch_Polyhedron表示,两个网格面求交使用类IntPatch_InterferencePolyhedron。本文主要介绍曲面的网格求交类IntPatch_InterferencePolyhedron。
2 Polyhedron Interference
OpenCASCADE中计算两个三角网格交线的类是IntPatch_InterferencePolyhedron,这个类还可以用来计算一个网格的自交情况。目前是简单计算两个网格中所有三角形的相交情况,时间复杂度为O(nm)或O(n^2),对于网格三角形数量大的情况效率很低。为了稍微提高一些性能,引入Bnd_BoundSortBox来加速过滤掉包围盒不相交的三角形,减少两个三角形相交计算。
其中函数Intersect()就是用来计算两个三角形的相交情况。关于两个三角形的快速求交计算,很多网格处理库都使用了Tomas Moller’s 1997 triangle intersection routine,如
http://geometry-central.net/surface/algorithms/intersection/ 中也提供两个网格求交函数:
在使用较广泛的网格处理库CGAL中也有相关计算函数:
感兴趣的同学可以对比一下这三个库关于两个网格求交的性能,看谁的性能最好,使用了什么技术。这里只是将OpenCASCADE中计算的求交结果输出,首先是面的自相交情况:
其中红色部分为交线,可以看出在计算自相交时,会生成多余的交线。其中蓝色部分是有重叠三角形的情况。
当计算两个网格交线时,总体上是正确的,不过也会有多余的交线产生。
3 Conclusion
综上所述,两个网格相交计算最直接的算法就是两两三角形进行求交计算,但是对于大网格会有性能问题。OpenCASCADE中两个网格求交计算会得到多余的交线,目前网格离散求交只是用于B样条曲面的求交计算的前处理IntPatch_PrmPrmIntersection,从OpenCASCADE计算两个曲面交线结果来看,离散网格计算中多余的交线没有影响最终的计算结果。大家可以带着这个问题“离散网格计算得到多余的交线对最终结果有影响么?”来理解IntPatch_PrmPrmIntersection中曲面求交的实现原理。