布尔数据 面的相交

布尔数据 面的相交

eryar@163.com

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中可以正确处理交线呢?

 

祝大家中秋国庆节日快乐!

 

posted @ 2023-09-29 18:23  opencascade  阅读(728)  评论(0编辑  收藏  举报