Topology and Geometry in OpenCascade-Edge

2023-10-19 07:59

本文主要是介绍Topology and Geometry in OpenCascade-Edge,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么80%的码农都做不了架构师?>>>   hot3.png

Topology and Geometry in OpenCascade-Edge

eryar@163.com

摘要Abstract:本文简要介绍了几何造型中的边界表示法(BRep),并结合程序说明OpenCascade中的边界表示的具体实现,即拓朴与几何的联系。对具有几何信息的拓朴结构顶点(vertex)、边(edge)、面(face)进行了详细说明。本文只对拓朴边数据进行说明,着重介绍了OpenCascade中两个种特别的边缝合边(seam edge)和退化边(degenerated edge)。 

关键字Key Words:OpenCascade、BRep、Topology、Edge、Geometry

一、引言 Introduction

边(Edge)是两个邻面(对正则形体而言)或多个邻面(对非正则形体而言)的交集。边有方向,它由起始顶点和终止顶点来界定;边的形状由边的几何信息来表示,可以是直线,也可以是曲线,曲线边可用一系列控制点或型值点来描述,也可以用显示、隐式或参数方程来描述。 

边(Edge)是边界表示法中的重要结构,因为边界表示法(BRep)是用形体的边界来描述形体的一种方法。BRep认为形体是由有限数量的边界表面(平面或曲面)构成,而每个表面又由若干边界边与顶点构成,所有的单元面构成了形体的边界,形体的边界将形体和周围的环境分隔开来。 

边界表示法不仅详细记录了构成形体的面、边方程的系数和顶点坐标值的几何信息,而且描述了这些几何元素之间的拓朴信息,即体、面、边、顶点的组成关系等。在保证对形体面的定义确定并且无二义性的前提下,它允许根据形体的拓朴结构、面表示的方便性等因素确定一个面是以一个整体表示,还是以几个部分之和进行表示。 

在OpenCascade中边包含了一系列的曲线,其结构如下图所示: 

wps_clip_image-4387

Figure 1.1 BRep_TEdge members 

其中,包含一系列的曲线由下面几种: 

wps_clip_image-601

Figure 1.2 BRep_CurveRepresentation class diagram 

二、边 Edge

边(edge)是对应于一维对象-曲线的拓朴实体。边可以是面的边界(如长方体的12条边之一);也可以只是一条不属于任何面的“悬空”边(floating edge),想像一下在构建锥形体或扫掠体之前的轮廓线;面的边可以被两个或更多面共享,或者只属于一个面。如下图所示: 

wps_clip_image-23008

Figure 2.1 Model used to illustrate Edge 

在上图中用不同的颜色将不同类型的边区别开来: 

l 红色:不属于任何面的悬空边(floating edge); 

l 绿色:只属于一个面的自由边(free edge); 

l 黄色:属于两个或多个面的共享边(shared edge); 

边Edge包含几种几何表示: 

n 三维空间中的曲线C(t),由Geom_Curve实现。这是边的基本表示方式; 

n 曲线P(t)为二维空间的参数曲线,用来表示属于面的边,通常被称为pcurves,由类Geom2d_Curve实现; 

n 多段线(Polygonal)由一组三维点表示,且由类Poly_Polygon3D实现。 

n 多段线(Polygonal)也可由一组三角剖分面上点的索引来表示,且由类Poly_PolygonOnTriangulation实现。 

他们的表示都可以使用前面提到的类BRep_Tool来获取。例如: 

Standard_Real aFirst, aLast, aPFirst, aPLast;
Handle(Geom_Curve) aCurve3d = BRep_Tool::Curve (anEdge, aFirst, aLast);
Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface (anEdge, aFace, aPFirst, aPLast);

边必须有曲面上的参数曲线(pcurves),除了平面以外。边中所有曲线必须一致,即朝向相同。这样边上的点可以使用任意表示方式计算得到,如曲线C(t),可以用[first, last]区间上的t来计算;也可根据u在区间[first1, last1]上取得曲面S1(P1x(u), P1y(u))上的点Pi,这里Pi是曲面Si上的参数曲线pcurve上的一点。 

1. 边的标志位 Edge Flags 

边中的标志位有三种:

static const Standard_Integer ParameterMask       = 1;
static const Standard_Integer RangeMask           = 2;
static const Standard_Integer DegeneratedMask     = 4;

这里对前两种标志位进行说明: 

l RangeMask “same range”:(BRep_Tool::SameRange())取值区间相同,即几何表示的曲线参数取值区间相同; 

l ParameterMask “same parameter”:(BRep_Tool::SameParameter())参数相同,即当C(t)=S1(P1x(t), P1y(t))时,对于同样的参数t,C(t)和曲面S1上的点P1(t)相同。即任何边上的点都对应参数曲线上相同的参数值。 

许多算法假定设置了这两个标志位,因此建议你注意这种情况,一定要设置这些标志位。 

2. 边的容差 Tolerance 

边的容差(Tolerance)是其三维曲线和其他任何表示方式之间的最大偏差。其几何意义就是以容差为半径沿边的一个包含边的三维曲线及其他任何形式表示的管子。如下图所示: 

wps_clip_image-28483

Figure 2.2 Edge Tolerance 

3. 特殊类型的边 Special edge types 

在OpenCascade有两种特别类型的边,他们是: 

l 缝合边(seam edge):即在同一个面上出现两次的边(如:在同一个面上具有2个参数曲线); 

l 退化边(degenerated edge):这种边位于曲面的奇异点处,在三维空间中退化为一个点; 

球面中这两种类型的边都有。缝合边位于经线(U iso-lines),参数为0和2*PI。退化边位于南北极点,对应于纬线(V iso-lines),参数为-PI/2和PI/2。因为球面的参数方程为: 

wps_clip_image-17127

当参数u取0和2*PI时,球面的参数方程计算如下: 

wps_clip_image-5507

从计算结果可以看出,缝合边是位于Dx和Dz所在平面上的半圆弧。

当参数v取-PI/2和PI/2时,球面的参数方程计算如下: 

wps_clip_image-23112

从计算结果可以看出,曲面上的两个边分别退化为两个点。即v取-PI/2和PI/2时球面的两个退化边分别位于南北极点上。如下图所示:

wps_clip_image-9886

Figure 2.3 seam edge and degenerated edge of sphere 

另外例子:环形体(torus)、圆柱体(cylinder)、圆锥体(cone)。环形体torus有两条缝合边(seam edge),对应于它的参数空间的边界;圆柱体(cylinder)有一条缝合边(seam edge)。圆锥(cone)顶点处为退化边(degenerated edge)。 

检查边是否是缝化边或退化边,可以使用函数BRep_Tool::IsClosed()和BRep_Tool::Degenerated()。 

4. 边的朝向 

边的朝向为正向(forward edge orientation)意味着边的逻辑方向与曲线的方向相同。反向(reversed)意味着逻辑方向与曲线方向相反。所以,缝合边(seam-edge)在一个面中总是有两个朝向:一个反向(reversed),一个正向(forward)。 

三、示例程序 Example Code 

以边界表示BRep表示的球面为例,说明其边的类型。程序代码如下所示:

/*
*    Copyright (c) 2013 eryar All Rights Reserved.
*
*        File    : Main.cpp
*        Author  : eryar@163.com
*        Date    : 2013-08-24 16:11
*        Version : 1.0v
*
*    Description : Demonstrate seam edge and degenerated edge of sphere.
*                  
*/#include <iostream>// OpenCascade Library.
#define WNT
#include <TopoDS.hxx>
#include <TopoDS_Edge.hxx>
#include <TopExp_Explorer.hxx>
#include <BRepPrimAPI_MakeSphere.hxx>#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKPrim.lib")
#pragma comment(lib, "TKTopAlgo.lib")/**
* @breif Dump orientation types.
*        Orientation definitaion:
*        enum TopAbs_Orientation {*            TopAbs_FORWARD,*            TopAbs_REVERSED,*            TopAbs_INTERNAL,*            TopAbs_EXTERNAL*        };
*/
std::string dumpOrientation(const TopAbs_Orientation& orient)
{std::string strType;switch (orient){case TopAbs_FORWARD:strType = "TopAbs_FORWARD";break;case TopAbs_REVERSED:strType = "TopAbs_REVERSED";break;case TopAbs_INTERNAL:strType = "TopAbs_INTERNAL";break;case TopAbs_EXTERNAL:strType = "TopAbs_EXTERNAL";break;}return strType;
}/**
* @breif Dump edge information.
*/
void processEdge(const TopoDS_Edge& edge, const TopoDS_Face& face)
{Standard_Real dTolerance = BRep_Tool::Tolerance(edge);Standard_Boolean bIsGeometric = BRep_Tool::IsGeometric(edge);Standard_Boolean bIsSameParameter = BRep_Tool::SameParameter(edge);Standard_Boolean bIsSameRange = BRep_Tool::SameRange(edge);Standard_Boolean bIsDegenerated = BRep_Tool::Degenerated(edge);Standard_Boolean bIsClosed = BRep_Tool::IsClosed(edge, face);TopAbs_Orientation nOrientation = edge.Orientation();// Dump edge info.std::cout<<"====== Edge Info ======="<<std::endl;std::cout<<"Tolerance: "<<dTolerance<<std::endl;std::cout<<"Orientation: "<<dumpOrientation(nOrientation)<<std::endl;std::cout<<"Geometric: "<<(bIsGeometric?"True":"False")<<std::endl;std::cout<<"Same Parameter: "<<(bIsSameParameter?"True":"False")<<std::endl;std::cout<<"Same Range: "<<(bIsSameRange? "True":"False")<<std::endl;std::cout<<"Degenerated edge: "<<(bIsDegenerated?"True":"False")<<std::endl;std::cout<<"Seam edge: "<<(bIsClosed? "True":"False")<<std::endl;// Dump vertex of the edge.for (TopExp_Explorer vertexItr(edge, TopAbs_VERTEX); vertexItr.More(); vertexItr.Next()){const TopoDS_Vertex& aVertex = TopoDS::Vertex(vertexItr.Current());gp_Pnt pnt = BRep_Tool::Pnt(aVertex);std::cout<<"Vertex: ("<<pnt.X()<<", "<<pnt.Y()<<", "<<pnt.Z()<<")"<<std::endl;}
}int main(void)
{Standard_Integer nSphereFaceCount = 0;Standard_Integer nSphereEdgeCount = 0;TopoDS_Shape sphere = BRepPrimAPI_MakeSphere(1.0);for (TopExp_Explorer faceItr(sphere, TopAbs_FACE); faceItr.More(); faceItr.Next()){const TopoDS_Face& aFace = TopoDS::Face(faceItr.Current());++nSphereFaceCount;for (TopExp_Explorer edgeItr(aFace, TopAbs_EDGE); edgeItr.More(); edgeItr.Next()){const TopoDS_Edge& aEdge = TopoDS::Edge(edgeItr.Current());processEdge(aEdge, aFace);++nSphereEdgeCount;}}std::cout<<"Sphere face count: "<<nSphereFaceCount<<std::endl;std::cout<<"Sphere edge count: "<<nSphereEdgeCount<<std::endl;return 0;
}

程序运行结果如下所示:

  ====== Edge Info =======Tolerance: 1e-007Orientation: TopAbs_REVERSEDGeometric: TrueSame Parameter: TrueSame Range: TrueDegenerated edge: TrueSeam edge: FalseVertex: (6.12323e-017, -1.49976e-032, 1)Vertex: (6.12323e-017, -1.49976e-032, 1)====== Edge Info =======Tolerance: 1e-007Orientation: TopAbs_FORWARDGeometric: TrueSame Parameter: TrueSame Range: TrueDegenerated edge: FalseSeam edge: TrueVertex: (6.12323e-017, -1.49976e-032, 1)Vertex: (6.12323e-017, -1.49976e-032, -1)====== Edge Info =======Tolerance: 1e-007Orientation: TopAbs_FORWARDGeometric: TrueSame Parameter: TrueSame Range: TrueDegenerated edge: TrueSeam edge: FalseVertex: (6.12323e-017, -1.49976e-032, -1)Vertex: (6.12323e-017, -1.49976e-032, -1)====== Edge Info =======Tolerance: 1e-007Orientation: TopAbs_REVERSEDGeometric: TrueSame Parameter: TrueSame Range: TrueDegenerated edge: FalseSeam edge: TrueVertex: (6.12323e-017, -1.49976e-032, 1)Vertex: (6.12323e-017, -1.49976e-032, -1)Sphere face count: 1Sphere edge count: 4Press any key to continue . . .

从运行结果可以看,当球的边为退化边时,边的两个顶点的坐标值相同。退化边位于球的南北极点上。缝合边为连接两个退化边的曲线。 

根据遍历顺序, 

第一条边为退化边(degenerated edge),其朝向为反向(reversed); 

第二条边为缝合边(seam-edge),其朝向为正向(forward); 

第三条边为退化边,其朝向为正向(forward); 

第四条边为缝合边,其朝向为反向(reversed)。 

由上可见,缝合边有两个朝向,一个正向一个反向。 

四、结论 Conclusion 

对与几何相关的拓朴边(edge)的类的属性数据进行详细说明。并结合程序代码详细说明边的标志位(myFlags)属性的意义,从参数方程出发,理解缝合边(seam-edge)和退化边(degenerated edge),即标志位中DegeneratedMask的意义。 

五、参考资料 

1. Roman Lygin, OpenCascade notes, opencascade.blogspot.com 

2. 孙家广等. 计算机图形学. 清华大学出版社 

3. OpenCascade source code. 

 

PDF Version: Topology and Geometry in OpenCascade-Edge

转载于:https://my.oschina.net/eryar/blog/347837

这篇关于Topology and Geometry in OpenCascade-Edge的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/238474

相关文章

Edge 100 个好用插件

Microsoft Edge 浏览器自推出以来,凭借其快速、安全和丰富的扩展插件,赢得了许多用户的青睐。以下是一些精选的 Edge 浏览器插件,它们能够显著提升你的浏览体验和生产力。 Tampermonkey:这是一个强大的用户脚本管理器,可以让你自定义网页行为,实现各种自动化操作,如自动填写表单、绕过版权限制等。 Infinity 新标签页 (Pro):这个插件可以让你自定义新标签页,添加

二、Topology的并行度

1、几个概念 Supervisor会监听分配给它那台机器的工作,根据需要启动/关闭工作进程,这个工作进程就是worker。一个topology可能会在一个或者多个工作进程里面执行,每个工作进程执行整个topology的一部分。每一个worker都会占用工作节点的一个端口,这个端口可以在storm.yarm中配置。 每一个Spout和Bolt会被当作很多task在整个集群里面执行。

Edge PDF 关闭 提供支持的应用Adobe Acrobat

Edge 在浏览PDF时启用 Adobe Acrobat支持后,对一些长PDF会出现上下滚动会出现无法正常显示PDF内容的情况。在关闭了Adobe Acrobat计算支持后,问题得到解决。关闭Adobe Acrobat的方式如下: 1. Edge地址栏输入 edge://flags ,进入如下界面。 在搜索框中,输入New PDF Viewer,将该选项设置为disabled,即可。

如何应对日益复杂的网络攻击?Edge SCDN(边缘安全加速)的应用场景探讨

CDN作为提高网站访问速度和内容分发效率的安全与加速产品,它能够有效减少服务器负载、降低网络延迟,从而提升用户体验和网站的可用性。然而,随着互联网技术的发展和网络攻击形式的日益复杂多样,用户对数据安全性和隐私保护的要求不断提高,对网站和应用的要求也不再只停留在加速上。 当传统CDN逐渐没办法满足当前企业对全方位网络攻击防护的需求时,不少安全厂商开始推出新一代CDN产品,开始将安全防护机制融入

【原创】edge-tts与基于mpv的edge-playback,使命令行和Python的Text To Speech唾手可得

最近想用Python脚本写一个TTS的小工具。一顿查找下来,发现AI时代手机端上这么普遍的TTS功能,居然在Web上这么稀有。估计都是被云API厂商拿去赚钱了。幸好Edge浏览器还是比较良心地提供了这个功能,不过又是和浏览器紧密结合的。 最终功夫不负有心人,发现了edge-tts与edge-playback,使命令行和Python脚本的Text To Speech唾手可得。先记录下来,找时间再丰

【ros2】geometry_msgs::msg::TransformStamped 数据类型详解

geometry_msgs::msg::TransformStamped 数据类型详解 1. 数据类型定义 geometry_msgs::msg::TransformStamped 是 ROS 2 中的一个消息类型,用于表示一个时间戳和坐标变换信息。 2. 结构 geometry_msgs::msg::TransformStamped 包含以下字段: struct TransformSt

AI芯片:Edge TPU(谷歌出品)【在边缘(edge)设备上运行的“专用集成芯片”】【量化操作:Edge TPU使用8 位权重进行计算,而通常使用32位权重。所以我们应该将权重从32位转换为8位】

谷歌Edge TPU的价格不足1000人民币,远低于TPU。实际上,Edge TPU基本上就是机器学习的树莓派,它是一个用TPU在边缘进行推理的设备。 一、云vs边缘 1、边缘运行没有网络延迟 Edge TPU显然是在边缘(edge)运行的,但边缘是什么呢?为什么我们不选择在云上运行所有东西呢? 在云中运行代码意味着使用的CPU、GPU和TPU都是通过浏览器提供的。边缘与云相反,即在

[Python图论]在用图nx.shortest_path求解最短路径时,节点之间有多条边edge,会如何处理?

问: 在使用图求最短路径时,如果节点之间有多条路径,shortest_route = nx.shortest_path(G, source=start_node, target=end_node, weight='length')会如何处理,会自动选择最短那条吗? # 输出图G各节点之间有多少条边edge,并给出其长度Edges between 103928 and 25508583:共2条

vscode和edge浏览器等鼠标输入光标变透明

本人是AMD的APU会出现这种情况。它的gpu加速有些问题。 都是要关闭gpu硬件加速功能。edge浏览器好找。vscode是通过以下方法。 要关闭VSCode的硬件加速功能, ‌通过配置文件调整‌: 打开VSCode的设置(通过按下Ctrl+Shift+P或Cmd+Shift+P打开命令面板,然后输入“Configure Runtime Arguments”并选择该命令)。在打开的arg

多场景建模: STAR(Star Topology Adaptive Recommender)

之前,分享了一篇关于多任务学习的文章:多任务学习MTL模型:MMoE、PLE,同样的还有关于多任务学习中的多目标loss优化策略。 这篇文章则开始一个与多任务学习有着紧密联系的系列:多场景建模学习。 前言 首先,讲一下多任务学习和多场景建模的区别: 多任务学习通常是聚焦于单独一个domain(场景、领域)内的不同任务的处理,即不同任务的label空间是不同的;而多场景建模则是关注于多个do