Open CASCADE学习|提取面的内外环线

在Open CASCADE中,区分内环和外环主要基于面的参数域内环线方向的定义。具体来说,在面的参数域内,沿着环线正方向前进时,如果左侧为面内、右侧为面外,那么该环线被视为外环;反之,如果左侧为面外、右侧为面内,那么该环线被视为内环。

这种定义方式有助于在拓扑面中进行准确的几何计算和分析,特别是在处理复杂的三维模型时。通过正确区分内环和外环,可以确保在进行布尔运算、求交、裁剪等操作时获得正确的结果。

在Open CASCADE中,获取面的内外环线通常涉及以下步骤:

获取面上的所有环线:首先,需要从拓扑面(TopoDS_Face)中获取其所有的环线(TopoDS_Wire)。这些环线是构成面的边界。

识别外环线:在获取到所有环线后,需要识别出哪些环线是外环线。这通常基于环线的方向进行判断。在参数域内,如果环线是逆时针方向的,那么它被认为是外环线。

计算有向面积:为了更准确地判断环线的内外,可以使用向量叉乘算法计算环线的有向面积。在平面上,逆时针方向的环线面积为正,而顺时针方向的环线面积为负。通过比较环线面积的正负,可以确定环线是外环还是内环。

去除外环线:一旦识别出外环线,就可以从所有环线集合中去除外环线,从而得到所有的内环线。

#include <gp_Circ.hxx>#include <gp_Pln.hxx>#include <GC_MakeCircle.hxx>#include <BRepBuilderAPI_MakeEdge.hxx>#include <TopoDS_Wire.hxx>#include <BRepBuilderAPI_MakeWire.hxx>#include <TopoDS_Face.hxx>#include <BRepBuilderAPI_MakeFace.hxx>#include <BRepAlgoAPI_Cut.hxx>#include <ShapeAnalysis.hxx>#include <TopoDS.hxx>#include <TopTools_IndexedMapOfShape.hxx>#include <TopExp.hxx>#include"Viewer.h"int main(int argc, char* argv[]){    gp_Pln aPlane;    gp_Circ aCircle1(gp::XOY(), 1.0);    gp_Circ aCircle2(gp::XOY(), 1.0);    gp_Circ aCircle3(gp::XOY(), 1.0);    aCircle1.SetLocation(gp_Pnt(3.0, 3.0, 0.0));    aCircle2.SetLocation(gp_Pnt(7.0, 3.0, 0.0));    aCircle3.SetLocation(gp_Pnt(3.0, 7.0, 0.0));    BRepBuilderAPI_MakeEdge anEdgeMaker1(aCircle1);    BRepBuilderAPI_MakeEdge anEdgeMaker2(aCircle2);    BRepBuilderAPI_MakeEdge anEdgeMaker3(aCircle3);    BRepBuilderAPI_MakeWire aWireMaker1(anEdgeMaker1.Edge());    BRepBuilderAPI_MakeWire aWireMaker2(anEdgeMaker2.Edge());    BRepBuilderAPI_MakeWire aWireMaker3(anEdgeMaker3.Edge());    BRepBuilderAPI_MakeFace aFaceMaker(aPlane, 0.0, 10.0, 0.0, 10.0);    if (aWireMaker1.IsDone())    {        TopoDS_Wire aWire1 = aWireMaker1.Wire();        aWire1.Reverse();        aFaceMaker.Add(aWire1);    }    if (aWireMaker2.IsDone())    {        TopoDS_Wire aWire2 = aWireMaker2.Wire();        aWire2.Reverse();        aFaceMaker.Add(aWire2);    }    if (aWireMaker3.IsDone())    {        TopoDS_Wire aWire3 = aWireMaker3.Wire();        aWire3.Reverse();        aFaceMaker.Add(aWire3);    }    // 获取外环线    TopoDS_Face myf = BRepBuilderAPI_MakeFace(aFaceMaker);    TopoDS_Wire outer_wire = ShapeAnalysis::OuterWire(myf);    // 获取所有环线    TopTools_IndexedMapOfShape wmap;    TopExp::MapShapes(myf, 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(TopoDS::Wire(wmap(j)));        }    }    Viewer vout(50, 50, 500, 500);    vout << myf;    vout << outer_wire;    vout << inner_wires[0];    vout << inner_wires[1];    vout << inner_wires[2];    vout.StartMessageLoop();    return 0;}

最后,有个报错的问题

此语句报错

inner_wires.emplace_back(wmap(j));

修改为下面的语句后解决

inner_wires.emplace_back(TopoDS::Wire(wmap(j)));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2809677.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

k8s Pod基础(概念,容器功能及分类,镜像拉取和容器重启策略)

目录 pod概念 Kubernetes设计Pod概念和特殊组成结构的用意 Pod内部结构&#xff1a; 网络共享&#xff1a; 存储共享&#xff1a; pause容器主要功能 pod创建方式 pod使用方式 pod分类 pod的容器分类 基础容器&#xff08;infrastructure container&#xff09;&…

【文生视频】Diffusion Transformer:OpenAI Sora 原理、Stable Diffusion 3 同源技术

文生视频 Diffusion Transformer&#xff1a;Sora 核心架构、Stable Diffusion 3 同源技术 提出背景输入输出生成流程变换器的引入Diffusion Transformer (DiT)架构Diffusion Transformer (DiT)总结 OpenAI Sora 设计思路阶段1: 数据准备和预处理阶段2: 架构设计阶段3: 输入数据…

Spring定时任务--手动执行定时任务(替代@Scheduled)

原文网址&#xff1a;Spring定时任务--手动执行定时任务&#xff08;替代Scheduled&#xff09; 简介 本文介绍SpringBoot如何手动执行定时任务。 之前此文已经介绍过&#xff0c;直接用Scheduled即可使用Spring的定时任务&#xff0c;但有时需要手动去提交定时任务&#xf…

springboot项目打成含crud操作的sdk集成到springboot启动引擎项目

一 sdk配置操作 1.1 结构 sdk项目目录中只有基础的service类以及mybatis操作数据库的相关文件&#xff0c;service类中包含查询数据库的方法。 说明&#xff1a; 1.2 sdk的pom打包配置 作为公共项目打成jar供其他项目引用&#xff0c;注意被引入的项目不能使用默认的maven…

随机分布模型

目录 前言 一、离散型随机变量 1.1 0-1分布 1.2 二项分布 1.3 帕斯卡分布 1.4 几何分布 1.5 超几何分布 1.6 泊松分布 二、连续型随机变量 2.1 均匀分布 2.2 指数分布 2.3 高斯分布/正态分布 2.4 分布&#xff08;抽样分布&#xff09; 2.5 t分布&#xff08;抽样…

Vue | (六)使用Vue脚手架(下)| 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;Vue 中的自定义事件&#x1f407;使用方法&#x1f407;案例练习&#x1f407;TodoList案例优化 &#x1f4da;全局事件总线&#x1f407;使用方法&#x1f407;案例练习&#x1f407;TodoList案例优化 &#x1f4da;消息订阅与发布&#x1f407;使用方法…

React18源码: Fiber树的初次创建过程图文详解

fiber树构造&#xff08;初次创建&#xff09; fiber树构造的2种情况&#xff1a; 1.初次创建 在React应用首次启动时&#xff0c;界面还没有渲染此时并不会进入对比过程&#xff0c;相当于直接构造一棵全新的树 2.对比更新 React应用启动后&#xff0c;界面已经渲染如果再次发…

微信小程序 --- 分包加载

分包加载 1. 什么是分包加载 什么是分包加载 ❓ 小程序的代码通常是由许多页面、组件以及资源等组成&#xff0c;随着小程序功能的增加&#xff0c;代码量也会逐渐增加&#xff0c;体积过大就会导致用户打开速度变慢&#xff0c;影响用户的使用体验。 分包加载是一种小程序…

遗传算法(Genetic Algorithm,GA)求解不闭合多旅行商问题(提供MATLAB代码)

一、遗传算法&#xff08;GA&#xff09;介绍 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种模拟自然界生物进化过程的优化算法。它通过模拟生物的遗传、变异和选择等机制&#xff0c;来搜索问题的最优解。 遗传算法的基本思想是通过对候选解进行编…

stable diffusion学习笔记 手部修复

图片手部修复原理 某张图片在生成后&#xff0c;仅有手部表现不符合预期&#xff08;多指&#xff0c;畸形等&#xff09;。这种情况下我们通常使用【局部重绘】的方式对该图片的手部进行【图生图】操作&#xff0c;重新绘制手部区域。 但是仅采用重绘的方式也很难保证生成的…

笔记本如何录屏?很简单,我来告诉你

“最近遇到了一些工作上的问题&#xff0c;需要录制一些会议和讨论的内容&#xff0c;以便于后续的整理和回顾。但是&#xff0c;我没有使用过笔记本进行录屏&#xff0c;不知道该如何操作。大家有没有简单易懂的笔记本录屏指南&#xff0c;教教我&#xff01;” 在当今数字化…

选择VR全景行业,需要了解哪些内容?

近年来&#xff0c;随着虚拟现实、增强现实等技术的持续发展&#xff0c;VR全景消费市场得以稳步扩张。其次&#xff0c;元宇宙行业的高速发展&#xff0c;也在进一步拉动VR全景技术的持续进步&#xff0c;带动VR产业的高质量发展。作为一种战略性的新兴产业&#xff0c;国家和…

多重网格(Multigrid Method)-4

代数多重网格法简介&#xff08;Algebraic Multigrid&#xff09; 可以理解为对细网格上的方程&#xff0c;先使用光滑方法&#xff08;Gm&#xff09;进行迭代得到一个初始解&#xff0c;然后将这个初始解的残差乘限制算子转化到粗网格上得到粗网格的右端向量&#xff0c;再在…

流浪动物救助平台:Java开发的实践与思考

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

03_第三章 JavaScript(数据类型和运算符,流程控制和函数,JS的对象和JSON,事件的绑定,BOM编程,DOM编程,正则表达式)

文章目录 第三章 JavaScript一 JS简介1.1 JS起源JavaScript是一种基于对象的脚本语言&#xff0c;它不仅可以创建对象&#xff0c;也能使用现有的对象。但是面向对象的三大特性&#xff1a;『封装』、『继承』、『多态』中&#xff0c;JavaScript能够实现封装&#xff0c;可以模…

第十篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:Microsoft Azure开发语音翻译应用程序经典案例

传奇开心果博文系列 系列博文目录Python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、Azure多语种支持示例代码四、Azure实时对话模式示例代码五、Azure自定义翻译模型示例代码六、Azure语音合成示例代码七、Azure用户界面优化示…

多输入回归预测|WOA-CNN|鲸鱼算法优化的卷积神经网络回归预测(Matlab)

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整程序数据下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb平台编译…

【摸鱼日常】使用Docker部署2048小游戏

一、本次实践介绍 ​1. 本次实践简介 本次实践部署环境为个人测试环境&#xff0c;快速使用docker部署2048小游戏。 rootWellDone:/home/goodjob# uname -aLinux WellDone 6.5.0-14-generic #14~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 20 18:15:30 UTC 2 x86_64 x86_64…

python自动化管理和zabbix监控网络设备(有线网络配置部分)

目录 一、拓扑图 二、core-sw1 三、core-sw2 四、sum-sw1 五、sum-sw2 一、拓扑图 二、core-sw1 sys sysname core-sw1 vlan batch 10 20 30 40 50 60 100 vlan batch 200 210 220 230 240 250 stp region-configuration region-name huawei revision-level 1 instance…

【深度学习】CIFAR10图像分类

案例3&#xff1a;PyTorch实战: CIFAR10图像分类 1 任务目标 1.1 用多层感知机(MLP)和卷积网络(ConvNet)完成CIFAR10分类 使用PyTorch分别实现多层感知机(MLP)和卷积网络(ConvNet)&#xff0c;并完成CIFAR10数据集&#xff08;http://www.cs.toronto.edu/~kriz/cifar.html&a…