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博客_多边形面积计算

原文地址:http://www.cnblogs.com/mechanicoder/p/16878903.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性