1. 简介
在特定应用场景下,需要对于一个拓扑面(TopoDS_Face)其进行补洞或打洞操作,如下图所示。补洞或打洞过程中需要获取面的环线(TopoDS_Wire),本文即介绍如何获取拓扑面的环线及其基本原理。
![面补洞、打洞示意图](/i/l/?n=22&i=blog/954362/202211/954362-20221110213459941-490123934.png)
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);
![](/i/l/?n=22&i=blog/954362/202211/954362-20221110213343825-1507642081.gif)
但并未提供直接获取内环线的方法,当然可以根据已获得外环线简介得到所有的内环线。一个思路是:首先获取面上的所有环线的集合以及 “外环线”,然后从所有所有环线集合中去除 “外环线” 即可得到所有的内环线。获取拓扑面内环线方法参考代码如下:
// 获取外环线
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的拓扑表达中,定义面的内部、外部以及环线的方向是有一定准则的,即在面的参数域内,沿着环线正方向前进左侧为面内、右侧为面外。如下示意图所示:
![](/i/l/?n=22&i=blog/954362/202211/954362-20221110213553001-65232154.png)
逆时针方向的环线为外环线,顺时针方向的环线为内环线。
3.2. 算法流程
浏览OCC源码,探究获取模型外环的原理。
![](/i/l/?n=22&i=blog/954362/202211/954362-20221110213612412-281968204.png)
其中的 “计算多边形有向面积totcross” 以及判断 “totcross>0”,其原理是:基于向量叉乘算法可得,在平面上,逆时针方向的多边形面积为正、顺时针方向的多边形面积为负。可参考博文多边形面积计算。
对应的OCC算法调用步骤为:
ShapeAnalysis::OuterWire();
ShapeAnalysis::IsOuterBound();
ShapeAnalysis::TotCross2D();
totcross > 0
以上主要针对一个合法有效的拓扑面模型而言,实际算法中还包括特殊异常处理,感兴趣可进一步深挖。
4. 参考资料
1. Open Cascade 7.7.0 Beta: ShapeAnalysis.cxx, ShapeAnalysis_Curve.cxx, BRep_Tool.cxx
2. 多边形面积计算:多边形面积计算_GISVertex的博客-CSDN博客_多边形面积计算
标签:获取,拓扑,ShapeAnalysis,环线,Cascade,外环线,Open,TopoDS From: https://www.cnblogs.com/mechanicoder/p/16878903.html