• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            布爾數據 BOPDS_Iterator

            Posted on 2023-09-18 21:13 eryar 閱讀(789) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            布爾數據 BOPDS_Iterator

            eryar@163.com

            1 Introduction

            OpenCASCADE中新的布爾工具TKBO相對已經廢棄的TKBool代碼更規范,更易于理解。與ModelingData和ModelingAlgorithms大的模塊組織一樣,主要也是數據結構Data Structure+算法Algorithm的組織形式。

            其中BOPDS為布爾中的數據結構部分,BOPAlgo為布爾中的算法部分。理解算法的前提是先理解數據結構DS(Data Structure),所以先從數據結構入手,來深入理解布爾操作。本文先從簡單的數據結構BOPDS_Iterator開始對源碼進行分析。

             

            2 BOPDS_Iterator

            從類的注釋可以看出,迭代器BOPDS_Iterator有以下兩個功能:

            - 找出包圍盒相交的Shape;

            - 遍歷相交的一對Shape;

            //! The class BOPDS_Iterator is
            //! 1.to compute intersections between BRep sub-shapes
            //! of arguments of an operation (see the class BOPDS_DS)
            //! in terms of theirs bounding boxes
            //! 2.provides interface to iterate the pairs of
            //! intersected sub-shapes of given type
            class BOPDS_Iterator 
            {
            public:

            其中核心的算法在函數Intersect()中,代碼如下所示:

            //=======================================================================
            // function: Intersect
            // purpose: 
            //=======================================================================
            void BOPDS_Iterator::Intersect(const Handle(IntTools_Context)& theCtx,
                                           const Standard_Boolean theCheckOBB,
                                           const Standard_Real theFuzzyValue)
            {
              const Standard_Integer aNb = myDS->NbSourceShapes();
              // Prepare BVH
              BOPTools_BoxTree aBoxTree;
              aBoxTree.SetSize (aNb);
              for (Standard_Integer i = 0; i < aNb; ++i)
              {
                const BOPDS_ShapeInfo& aSI = myDS->ShapeInfo(i);
                if (!aSI.HasBRep())
                  continue;
                const Bnd_Box& aBox = aSI.Box();
                aBoxTree.Add (i, Bnd_Tools::Bnd2BVH (aBox));
              }
              // Build BVH
              aBoxTree.Build();
              // Select pairs of shapes with interfering bounding boxes
              BOPTools_BoxPairSelector aPairSelector;
              aPairSelector.SetBVHSets (&aBoxTree, &aBoxTree);
              aPairSelector.SetSame (Standard_True);
              aPairSelector.Select();
              aPairSelector.Sort();
              // Treat the selected pairs
              const std::vector<BOPTools_BoxPairSelector::PairIDs>& aPairs = aPairSelector.Pairs();
              const Standard_Integer aNbPairs = static_cast<Standard_Integer> (aPairs.size());
              Standard_Integer iPair = 0;
              const Standard_Integer aNbR = myDS->NbRanges();
              for (Standard_Integer iR = 0; iR < aNbR; ++iR)
              {
                const BOPDS_IndexRange& aRange = myDS->Range(iR);
                for (; iPair < aNbPairs; ++iPair)
                {
                  const BOPTools_BoxPairSelector::PairIDs& aPair = aPairs[iPair];
                  if (!aRange.Contains (aPair.ID1))
                    // Go to the next range
                    break;
                  if (aRange.Contains (aPair.ID2))
                    // Go to the next pair
                    continue;
                  const BOPDS_ShapeInfo& aSI1 = myDS->ShapeInfo (aPair.ID1);
                  const BOPDS_ShapeInfo& aSI2 = myDS->ShapeInfo (aPair.ID2);
                  const TopAbs_ShapeEnum aType1 = aSI1.ShapeType();
                  const TopAbs_ShapeEnum aType2 = aSI2.ShapeType();
                  Standard_Integer iType1 = BOPDS_Tools::TypeToInteger (aType1);
                  Standard_Integer iType2 = BOPDS_Tools::TypeToInteger (aType2);
                  // avoid interfering of the shape with its sub-shapes
                  if (((iType1 < iType2) && aSI1.HasSubShape (aPair.ID2)) ||
                      ((iType1 > iType2) && aSI2.HasSubShape (aPair.ID1)))
                    continue;
                  if (theCheckOBB)
                  {
                    // Check intersection of Oriented bounding boxes of the shapes
                    const Bnd_OBB& anOBB1 = theCtx->OBB (aSI1.Shape(), theFuzzyValue);
                    const Bnd_OBB& anOBB2 = theCtx->OBB (aSI2.Shape(), theFuzzyValue);
                    if (anOBB1.IsOut (anOBB2))
                      continue;
                  }
                  Standard_Integer iX = BOPDS_Tools::TypeToInteger (aType1, aType2);
                  myLists(iX).Append (BOPDS_Pair (Min (aPair.ID1, aPair.ID2),
                                                  Max (aPair.ID1, aPair.ID2)));
                }
              }
            }

            在求交函數Intersect中使用BVH快速找出包圍盒有相交的每對Shape,并以索引的形式記錄下來。從這個函數中可以看出布爾操作是否使用OBB的選項的作用:當不使用OBB時,只以AABB包圍盒來檢測相交的Shape;當使用OBB時,在AABB的基礎上進一步使用包圍更緊密的OBB來檢測相交,可以排除部分。當相交的模型中以AABB檢測就能檢測出來的,再打開OBB選項,不會提高性能,反而會有所降低。為了減少這個影響,在IntTools_Context中緩存Caching這些OBB,避免構造OBB帶來的性能損失。

            3 Conclusion

            布爾迭代器BOPDS_Iterator通過BVH找出求交的模型中每對包圍盒有相交的模型并提供遍歷每對包圍盒相交的模型的功能,為后面求交作準備。從其代碼實現可以看出布爾選項使用OBB對性能提高是有限的,當使用AABB能檢測出來的,再使用OBB會降低性能。當使用AABB檢測出來相交,但OBB不相交的場景對性能提升明顯。

            今日是“九一八事變”92周年,落后就要挨打,吾輩仍需努力。

            亚洲国产成人精品女人久久久 | 久久久久国色AV免费看图片| 天天躁日日躁狠狠久久| 亚洲狠狠婷婷综合久久蜜芽| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 少妇无套内谢久久久久| 国产精品久久久久影院色| 久久久中文字幕日本| 99久久国产热无码精品免费| 久久综合精品国产一区二区三区| 少妇被又大又粗又爽毛片久久黑人| 国产精品中文久久久久久久| 99久久777色| 亚洲精品第一综合99久久| 国产精品久久自在自线观看| 久久综合狠狠综合久久97色| jizzjizz国产精品久久| 99久久这里只精品国产免费| 久久se精品一区二区| 久久久噜噜噜久久熟女AA片| 国产精品中文久久久久久久| 色综合合久久天天综合绕视看 | 久久精品国产亚洲AV不卡| 蜜臀av性久久久久蜜臀aⅴ麻豆| 日韩久久无码免费毛片软件| 久久久久久亚洲精品成人 | 久久精品国产亚洲AV久| 久久久99精品成人片中文字幕 | 久久久久亚洲AV综合波多野结衣 | 欧美无乱码久久久免费午夜一区二区三区中文字幕| 久久久久波多野结衣高潮| 久久精品夜色噜噜亚洲A∨| 国产美女久久久| 精品国产福利久久久| 无码超乳爆乳中文字幕久久| 97精品依人久久久大香线蕉97 | 久久精品国产WWW456C0M| 久久久中文字幕| 欧美伊香蕉久久综合类网站| 久久精品无码一区二区三区| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 |