Open Cascade 获取面的内外环线

​转载请注明原文链接:https://www.cnblogs.com/mechanicoder/p/16878903.html

1. 简介

在特定应用场景下,需要对于一个拓扑面(TopoDS_Face)其进行补洞或打洞操作,如下图所示。补洞或打洞过程中需要获取面的环线(TopoDS_Wire),本文即介绍如何获取拓扑面的环线及其基本原理。

面补洞、打洞示意图
面补洞、打洞示意图

2.  获取内外环方法

OCC提供直接获取外环线的方法:

// 获取外环线
TopoDS_Wire outer_wire = ShapeAnalysis::OuterWire(face);
//! Returns the outer wire on the face <Face>.
//! This is replacement of the method BRepTools::OuterWire
//! until it works badly.
//! Returns the first wire oriented as outer according to
//! FClass2d_Classifier. If none, last wire is returned.
Standard_EXPORT static TopoDS_Wire OuterWire (const TopoDS_Face& face);

但并未提供直接获取内环线的方法,当然可以根据已获得外环线简介得到所有的内环线。一个思路是:首先获取面上的所有环线的集合以及 “外环线”,然后从所有所有环线集合中去除 “外环线” 即可得到所有的内环线。获取拓扑面内环线方法参考代码如下:

// 获取外环线
TopoDS_Wire outer_wire = ShapeAnalysis::OuterWire(face);

// 获取所有环线
TopTools_IndexedMapOfShape wmap;
TopExp::MapShapes(face, TopAbs_WIRE, wmap);

// 过滤得到内环线
std::vector<TopoDS_Wire> inner_wires;
for (int j = 1; j <= wmap.Extent(); j++)
{
    if (!wmap(j).IsSame(outer_wire))
    {
        // 保留与外环不相等的环,即内环线
        inner_wires.emplace_back(wmap(j));
    }
}

其中用到拓扑模型遍历时常用的方法 TopExp::MapShapes,遍历拓扑模型中指定类型的子拓扑类型,并将其存储在关联容器 M 中,如下所示。

//! Tool to explore a topological data structure.
//! Stores in the map <M> all  the sub-shapes of <S>
//! of type <T>.
//!
//! Warning: The map is not cleared at first.
Standard_EXPORT static void MapShapes (const TopoDS_Shape& S, const TopAbs_ShapeEnum T, TopTools_IndexedMapOfShape& M);

3. OCC获取外环线基本原理

3.1. 如何区分内外环

对于拓扑面而言,在计算几何以及OCC的拓扑表达中,定义面的内部、外部以及环线的方向是有一定准则的,即在面的参数域内,沿着环线正方向前进左侧为面内、右侧为面外。如下示意图所示:

在参数域内,空间拓扑面环线对应的参数曲线

 逆时针方向的环线为外环线,顺时针方向的环线为内环线

3.2. 算法流程

浏览OCC源码,探究获取模型外环的原理。

获取外环算法-基本原理流程图

其中的 “计算多边形有向面积totcross” 以及判断 “totcross>0”,其原理是:基于向量叉乘算法可得,在平面上,逆时针方向的多边形面积为正、顺时针方向的多边形面积为负。可参考博文多边形面积计算

对应的OCC算法调用步骤为:

ShapeAnalysis::OuterWire();
    ShapeAnalysis::IsOuterBound();
        ShapeAnalysis::TotCross2D();
            totcross > 0

以上主要针对一个合法有效的拓扑面模型而言,实际算法中还包括特殊异常处理,感兴趣可进一步深挖。

4. 参考资料

1. Open Cascade 7.7.0 Beta: ShapeAnalysis.cxxShapeAnalysis_Curve.cxxBRep_Tool.cxx

2. 多边形面积计算:多边形面积计算_GISVertex的博客-CSDN博客_多边形面积计算

​​

转载请注明原文链接:https://www.cnblogs.com/mechanicoder/p/16878903.html

posted @ 2022-11-10 21:43  Me伟  阅读(433)  评论(0编辑  收藏  举报