Posted on 2023-09-29 18:45
eryar 閱讀(1007)
評論(0) 編輯 收藏 引用 所屬分類:
2.OpenCASCADE
布爾數(shù)據(jù) 面的相交
eryar@163.com
1 Introduction
OpenCASCADE中對面的相交定義如下圖所示:

三維空間中兩個(gè)帶有Geometry Surface的面Face,當(dāng)兩個(gè)Surface之間的距離小于Face中的容差Tolerance,則認(rèn)為是相交的。一般兩個(gè)面之間相交得到的是交線,還有一些情況得到的是交點(diǎn),如下圖所示:

布爾運(yùn)算中面的相交是相對復(fù)雜的問題,除了考慮上述交線和交點(diǎn)的問題以外,還要考慮有重疊的情況;對于新生成的交線,還要考慮生成PCurve;若面上有開孔,還要將穿過開孔區(qū)域的交線排除等;最后要考慮如何保存面相交的結(jié)果。相交的計(jì)算在函數(shù):

最終是調(diào)用IntTools_FaceFace來計(jì)算兩個(gè)面的相交。并將計(jì)算結(jié)果交線和交點(diǎn),是否重疊等信息保存到BOPDS_InterfFF中:

2 Face Info
類BOPDS_FaceInfo用來存儲以下信息:

注意PBo31和PBSc1,一個(gè)狀態(tài)是On,一個(gè)狀態(tài)是Section。在相交處理類BOPAlgo_PaveFiller中通過函數(shù)BOPAlgo_PaveFiller::UpdateFaceInfo將這些相交的狀態(tài)更新。
3 Tangent Face
從前面的文章關(guān)于檢測邊與邊、邊與面是否有重疊時(shí)采用了固定采樣點(diǎn)來處理的不嚴(yán)謹(jǐn)?shù)倪壿媮砜矗袛嗑€的重疊是個(gè)復(fù)雜的問題,判斷面與面的重疊就相對更復(fù)雜。本文先從簡單入手,先看對于最簡單的兩個(gè)平面重疊的檢測,引出大家對于任意兩個(gè)面重疊區(qū)域檢測的思考。對這種特殊的情況處理在IntTools_FaceFace中的函數(shù)PerformPlanes()中實(shí)現(xiàn)。其中使用二次曲面的幾何求交法進(jìn)行處理,源碼如下:

通過源碼可以看出,若兩個(gè)平面之間的法向夾角小于TolAng及距離小于Tol時(shí),則認(rèn)為兩個(gè)面是一樣的IntAna_Same;當(dāng)距離大于Tol時(shí),則認(rèn)為沒有相交IntAna_Empty。

對于重疊的平面,將theTangentFaces設(shè)置成true表示是重疊的。這里留下一個(gè)問題大家思考:如何判斷自由曲面的重疊情況?
4 Hole
當(dāng)面上有孔洞時(shí),還要對交線進(jìn)行處理,以排除掉孔洞中的交線。當(dāng)使用IntTools_FaceFace來計(jì)算兩個(gè)面的交線時(shí),可以看到交線的范圍不正確,沒有處理孔洞情況,甚至也沒有處理面的邊界。如下圖所示紅色的交線為使用IntTools_FaceFace計(jì)算得到的:

當(dāng)使用BOPAlgo_PaveFiller計(jì)算交線并結(jié)合PaveBlock得到交線顯示如下圖所示:

雖然計(jì)算兩個(gè)面之間的相交處理最終是調(diào)用的IntTools_FaceFace,但是要得到正確的交線需要使用類BOPAlgo_PaveFiller。這里也留下問題供大家思考:為什么IntTools_FaceFace計(jì)算的交線范圍不正確?為什么BOPAlgo_PaveFiller計(jì)算的交線正確?
5 Conclusion
綜上所述,布爾數(shù)據(jù)中面的相交的結(jié)果可能有交線,也可能有交點(diǎn)。將求交結(jié)果保存到FaceInfo中。從簡單的兩個(gè)平面重疊來看,將重疊的狀態(tài)用變量theTangetFaces來保存。那任意兩個(gè)曲面重疊如何判斷呢?面的相交雖然提供類IntTools_FaceFace來計(jì)算,但是沒有正確處理交線的范圍,為什么BOPAlgo_PaveFiller中可以正確處理交線呢?
祝大家中秋國慶節(jié)日快樂!