首页 > 其他分享 >布尔数据 BOPDS_Iterator

布尔数据 BOPDS_Iterator

时间:2023-09-18 21:14:33浏览次数:41  
标签:const Iterator OBB Standard aPair BOPDS 布尔

布尔数据 BOPDS_Iterator

[email protected]

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周年,落后就要挨打,吾辈仍需努力。

标签:const,Iterator,OBB,Standard,aPair,BOPDS,布尔
From: https://www.cnblogs.com/opencascade/p/BOPDS_Iterator.html

相关文章

  • 设计模式回顾之十二:迭代器模式(Iterator)
    设计模式回顾系列文章:主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。------------------------------------------------迭代器模式(Iterator)提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。适用于:访问一个聚合对象的内容而......
  • #yyds干货盘点#SQL注入之布尔注入原理
    布尔注入定义及原理:所谓盲注就是在服务器没有错误回显的时候完成注入公鸡。盲注分为布尔盲注和时间盲注布尔盲注:boolean根据注入信息返回trueorfales没有任何报错信息时间盲注:界面返回值ture无论输入任何值,返回的情况都是正常的来处。加入特定的时间函数,通过查看web页面返回......
  • 20-布尔值-比较运算符-逻辑运算符-短路问题
            ......
  • Go 语言内置类型全解析:从布尔到字符串的全维度探究
    关注微信公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。本文深入探讨了Go语言的内......
  • github.com/json-iterator/go 详细教程
    最近接触到了github.com/json-iterator/go,是由滴滴开源的第三方json编码库,它同时提供Go和Java两个版本。文中大量内容来自github上的wiki文档,有兴趣的朋友可以直接点击Home跳转到官方文档查阅。本文加了些自己的思考以及相关的详细学习例子,废话不多说了,冲!!!1、基础介......
  • JavaScript中的布尔值
    布尔值代表真或假,开或关,是或否。在这个类型中只有两个值:true和false。JavaScript中的布尔值通常是比较操作的结果。例如:a===4上面的代码测试变量a的值是否等于数字4。如果是,返回true;否则返回false。布尔值在JavaScript的控制结构中经常被使用。例如,在if/else语句中,当布尔值......
  • IteratorPattern-迭代器模式
    在C#中,迭代器模式(IteratorPattern)是一种行为型设计模式,它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露聚合对象的内部表示。迭代器模式有以下几个关键角色:Iterator(迭代器):定义访问和遍历元素的接口。ConcreteIterator(具体迭代器):实现迭代器接口,实现对聚合对象的......
  • 布尔盲注
    盲注:页面没有报错回显,不知道数据库具体返回值的情况下,对数据库中的内容进行拆解,实行SQL注入。盲注分类:布尔盲注、时间盲注、报错盲注布尔盲注:web页面只返回true真,false假两种类型。利用页面返回不同,逐个猜解数据布尔注入的条件?id=1'and1=1---真页面true ?id=1'......
  • JavaScript​​-null 、 undefined和布尔值
    null和undefined 概述 null与undefined都可以表示“没有”,含义非常相似。将一个变量赋值为undefined或null,老实说,语法效果几乎没区别。vara=undefined;//或者vara=null;上面代码中,变量a分别被赋值为undefined和null,这两种写法的效果几乎等价。在if语句中,它们都会被自......
  • burpsuite靶场----SQL注入12----oracle的布尔盲注
    burpsuite靶场----SQL注入12----oracle的布尔盲注靶场地址https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors正式开始1.找到注入点为cookie中的TrackingId2.因为oracle使用||进行连接的所以先判断闭合payload:TrackingId=7zHLwisTii2Zhhp......