布尔数据 面的相交
布尔数据 面的相交
1 Introduction
OpenCASCADE中对面的相交定义如下图所示:
三维空间中两个带有Geometry Surface的面Face,当两个Surface之间的距离小于Face中的容差Tolerance,则认为是相交的。一般两个面之间相交得到的是交线,还有一些情况得到的是交点,如下图所示:
布尔运算中面的相交是相对复杂的问题,除了考虑上述交线和交点的问题以外,还要考虑有重叠的情况;对于新生成的交线,还要考虑生成PCurve;若面上有开孔,还要将穿过开孔区域的交线排除等;最后要考虑如何保存面相交的结果。相交的计算在函数:
最终是调用IntTools_FaceFace来计算两个面的相交。并将计算结果交线和交点,是否重叠等信息保存到BOPDS_InterfFF中:
2 Face Info
类BOPDS_FaceInfo用来存储以下信息:
注意PBo31和PBSc1,一个状态是On,一个状态是Section。在相交处理类BOPAlgo_PaveFiller中通过函数BOPAlgo_PaveFiller::UpdateFaceInfo将这些相交的状态更新。
3 Tangent Face
从前面的文章关于检测边与边、边与面是否有重叠时采用了固定采样点来处理的不严谨的逻辑来看,判断线的重叠是个复杂的问题,判断面与面的重叠就相对更复杂。本文先从简单入手,先看对于最简单的两个平面重叠的检测,引出大家对于任意两个面重叠区域检测的思考。对这种特殊的情况处理在IntTools_FaceFace中的函数PerformPlanes()中实现。其中使用二次曲面的几何求交法进行处理,源码如下:
通过源码可以看出,若两个平面之间的法向夹角小于TolAng及距离小于Tol时,则认为两个面是一样的IntAna_Same;当距离大于Tol时,则认为没有相交IntAna_Empty。
对于重叠的平面,将theTangentFaces设置成true表示是重叠的。这里留下一个问题大家思考:如何判断自由曲面的重叠情况?
4 Hole
当面上有孔洞时,还要对交线进行处理,以排除掉孔洞中的交线。当使用IntTools_FaceFace来计算两个面的交线时,可以看到交线的范围不正确,没有处理孔洞情况,甚至也没有处理面的边界。如下图所示红色的交线为使用IntTools_FaceFace计算得到的:
当使用BOPAlgo_PaveFiller计算交线并结合PaveBlock得到交线显示如下图所示:
虽然计算两个面之间的相交处理最终是调用的IntTools_FaceFace,但是要得到正确的交线需要使用类BOPAlgo_PaveFiller。这里也留下问题供大家思考:为什么IntTools_FaceFace计算的交线范围不正确?为什么BOPAlgo_PaveFiller计算的交线正确?
5 Conclusion
综上所述,布尔数据中面的相交的结果可能有交线,也可能有交点。将求交结果保存到FaceInfo中。从简单的两个平面重叠来看,将重叠的状态用变量theTangetFaces来保存。那任意两个曲面重叠如何判断呢?面的相交虽然提供类IntTools_FaceFace来计算,但是没有正确处理交线的范围,为什么BOPAlgo_PaveFiller中可以正确处理交线呢?
祝大家中秋国庆节日快乐!