Open CASCADE学习|用点分割边

news2025/1/19 20:30:41

在Open CASCADE Technology(OCCT)中,几何模型是由拓扑(Topology)和几何(Geometry)两部分组成的。拓扑部分描述了形状的拓扑结构,比如边、面、体等,而几何部分则定义了这些拓扑元素的形状。TopoDS_Edge 是拓扑边的一个类,它代表了模型中的一个边界。

TopoDS_Edge 的底层数据是 Geom_Curve,这意味着 TopoDS_Edge 的几何形状是由一个 Geom_Curve 对象来描述的。Geom_Curve 是一个抽象基类,它代表了一个几何曲线,可以是直线、圆弧、二次曲线等。

当你想要截取 TopoDS_Edge 的一部分时,你实际上是在操作其底层的 Geom_Curve。你可以通过指定 Geom_Curve 的参数区间来截取曲线的一部分。参数区间通常是由两个参数值定义的,一个起始参数和一个结束参数,这两个参数都在曲线的参数范围内。曲线的参数范围通常是从0到1,但也可能有不同的范围,具体取决于曲线的类型。

#include <Geom_BezierCurve.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <TopoDS_Edge.hxx>
#include <BRep_Tool.hxx>
#include <BRepLib.hxx>
#include <GeomAPI_ProjectPointOnCurve.hxx>
​
#include"Viewer.h"
​
int main(int argc, char* argv[])
{
    //Non Rational B-Spline
​
    gp_Pnt points1[8] = {
    gp_Pnt(0.0,-100.0,0.0),
    gp_Pnt(10.0,10.0,0.0),
    gp_Pnt(30.0,-100.0,0.0),
    gp_Pnt(100.0,0.0,0.0),
    gp_Pnt(150.0,50.0,0.0),
    gp_Pnt(200.0,0.0,0.0),
    gp_Pnt(400.0,200.0,0.0),
    gp_Pnt(450.0,0.0,0.0)
    };
​
    NCollection_Array1<gp_Pnt> points(points1[0], 1, 8);//Control points
    Standard_Real realsWeight[8] = { 1.0,1.0,1.0,1.0,1.0,1.0,10.0,1.0 };
    NCollection_Array1<Standard_Real> weight(realsWeight[0], 1, 8);//权系数,倒数第二个点的权系数是其他的10倍。
    Geom_BezierCurve bezier(points); //Non-Rational
​
    Handle(Geom_BezierCurve) bezier1 = &bezier;
    TopoDS_Edge E = BRepBuilderAPI_MakeEdge(bezier1);
    gp_Pnt pnt = gp_Pnt(150.0, 50.0, 0.0);
    TopoDS_Edge E1, E2;
    Standard_Real startParam(0.), endParam(0.);
    Handle(Geom_Curve) c = BRep_Tool::Curve(E, startParam, endParam);//得到底层曲线
    //有时底层曲线没有创建,要手动创建
    if (c.IsNull())
    {
        BRepLib::BuildCurves3d(E, 1.0e-5, GeomAbs_C1);//创建曲线
        c = BRep_Tool::Curve(E, startParam, endParam);
    }
    if (!c.IsNull())
    {
        //投影点到曲线上,并获取投影点处的参数
        GeomAPI_ProjectPointOnCurve ppc(pnt, c);
        Standard_Real param = ppc.LowerDistanceParameter();
        //如果投影点参数小于起始参数或大于终止参数,则分割失败  
​
        if (startParam - param > 0.00001 || param - endParam > 0.00001)
            return false;
​
        //如果正好等于起始参数或等于终止参数,则一边是原始边,另一边为NULL
        else if (Abs(param - startParam) <= Precision::Confusion())
            E1 = E;
        else if (Abs(param - endParam) <= Precision::Confusion())
            E2 = E;
​
        //处于起始和终止参数中间,则构建两个新边
        else
        {
            E1 = BRepBuilderAPI_MakeEdge(c, startParam, param);
            E1.Orientation(E.Orientation());//同向
            E2 = BRepBuilderAPI_MakeEdge(c, param, endParam);
            E2.Orientation(E.Orientation());//同向
            if (E.Orientation() == TopAbs_REVERSED)
            {
                TopoDS_Edge e = E1;
                E1 = E2;
                E2 = e;
            }
        }
    }
    Viewer vout(50, 50, 500, 500);
    vout << E;
    vout << E1;
    vout << E2;
    vout.StartMessageLoop();
    return 0;
}

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

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

相关文章

快速排序(2)——快速排序的优化

因为Hoare的快速排序写起来容易出错&#xff0c;并且有很多地方不太合适&#xff0c;于是&#xff0c;就有了一下几种优化。 基准值的优化 如果我们一直选取一组数据的第一个数据为基准值&#xff0c;如果遇到重复少的值的化&#xff0c;没什么问题。但是如果重复的值比较多的…

对称密钥的分配、公钥的分配

目录 密钥分配 1 对称密钥的分配 KDC 对会话密钥 KAB 的分配 对称密钥分配协议&#xff1a;Kerberos 2 公钥的分配 认证中心 CA (Certification Authority) 数字证书 (digital certificate) 已签名的 B 的数字证书的产生过程 X.509 数字证书 认证系统 证书链 证书…

2024.2.18 C++QT 作业

思维导图 练习题 1>定义一个基类 Animal&#xff0c;其中有一个虛函数perform&#xff08;)&#xff0c;用于在子类中实现不同的表演行为。 #include <iostream>using namespace std;class Animal { public:virtual void perform() {cout << "这是一个动…

红队攻防之office文件钓鱼制作ppt钓鱼

为众人抱薪者&#xff0c;不可使其冻毙于风雪&#xff1b;为自由开路者&#xff0c;不可使其困顿于荆棘。 PPT手势触发 这种攻击则利用的是鼠标轨迹来进行操作&#xff0c;比如鼠标点击、鼠标移动等。 首先&#xff0c;创建一个普通的PPTX文件&#xff0c;随便填入一些内容&…

《白话C++》第10章 STL和boost,Page74 10.4.4 std::unique_ptr

std::unique_ptr可以同时处理普通指针和指向数组的指针&#xff1a; unique_ptr像是auto_ptr的功能改良版 第一个改进就是可以管理指向单一对象的指针&#xff0c;也可以管理指向连续对象&#xff08;数组&#xff09;的指针。 第二个&#xff0c;unique_ptr改进的是&#xf…

huggingface入门玩耍LLM Starter

huggingface入门玩耍LLM Starter huggingface-cli 下载model 下载 本人macos系统&#xff0c;以下可参考 huggingface-cli 下载 brew install huggingface-climodel 下载 以 chatglm-6b 为例 huggingface-cli download --token hf_*** --resume-download THUDM/chatglm-6b-i…

C/C++ BM7 链表中环的入口结点

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 BM6里面使用了双指针法和哈希的方式来查找环&#xff0c;BM7相对于BM6只多了一个查找第一个重复地址的过程。个人认为是用哈希是最简单&#xff0c;C11标准的set或者map。 题目 给…

洛谷 P1150 Peter 的烟

参考代码and代码解读 #include<iostream> using namespace std; int main() { int n,k,nonu; //n烟的数量&#xff0c;k需要多少根烟头换一支烟&#xff0c;nonu记录烟头的个数 cin>>n>>k; int sumn; //一开始就能吸n支烟 nonusum; …

C++友元->全局函数做友元、类做友元、成员函数做友元

全局函数做友元代码&#xff1a; #include<iostream> using namespace std; #include<string> //建筑物类 class Building { //告诉编译器 goodGay全局函数 是 Building类的好朋友&#xff0c;可以访问类中的私有内容 friend void goodGay(Building * bu…

linux kernel 内存踩踏之KASAN_HW_TAGS(MTE)(三)

一、背景 linux kernel 内存踩踏之KASAN&#xff08;一&#xff09;_kasan版本跟hasan版本区别-CSDN博客 linux kernel 内存踩踏之KASAN_SW_TAGS&#xff08;二&#xff09;-CSDN博客 最后来介绍一下KASAN_HW_TAGS&#xff0c;ARM64上就是MTE&#xff0c;这个特性在ARMv8.5支…

python in Vscode

背景 对于后端的语言选择&#xff1a; python&#xff0c;java&#xff0c;JavaScript备选。 选择Python 原因&#xff1a;可能是非IT专业的人中&#xff0c;会Python的人比较多。 目的 之前使用的IDE是VSCODE&#xff0c;在WSL的环境下使用。现在需要在在WSL的VSCODE下使…

分享几个丝滑oled代码

最近一段业余时间在捣鼓esp32&#xff0c;发现对于一个搞diy的来说&#xff0c;它的生态&#xff0c;不管是开发环境、氛围还是可玩度都是独一挡的&#xff0c;国内外基于此的扩展真是太多了&#xff0c;找了几个通过按键/旋钮进行0.96寸OLED控制的案例&#xff0c;超级丝滑&am…

【论文解读】Latency-Aware Collaborative Perception

Latency-Aware Collaborative Perception 摘要引言方法SystemSyncNet 实验 摘要 协作感知最近显示出提高单智能体感知感知能力的巨大潜力。现有的协同感知方法通常考虑理想的通信环境。然而&#xff0c;在实践中&#xff0c;通信系统不可避免地存在延迟问题&#xff0c;导致安…

2月16日openai又出了什么大招呢?

2024年2月16日通过google trends可以发现“sora”被大量的搜索与关注。那么什么是“sora”呢&#xff1f; Sora是OpenAI发布的一款文本到视频的AI模型&#xff0c;它能够根据文本指令生成逼真和富有想象力的场景。Sora 可以创建长达 60 秒的视频&#xff0c;其中包含高度详细的…

后端扫盲系列 - vue入门指南

vue特点 组件化&#xff1a;用户界面分解为可重用的组件&#xff0c;这些组件可以使开发的页面更加模块化和可维护双向数据绑定&#xff1a;vue提供了一种轻松绑定数据和DOM元素之间的机制&#xff0c;意味着数据发送变化时&#xff0c;视图会自动更新&#xff0c;反之亦然虚拟…

糟糕,接口被刷了,怎么办?

前言 在面试时&#xff0c;经常会被问一个问题&#xff1a;如何防止别人恶意刷接口&#xff1f; 这是一个非常有意思的问题&#xff0c;防范措施挺多的。今天这篇文章专门跟大家一起聊聊&#xff0c;希望对你会有所帮助。 1 防火墙 防火墙是网络安全中最基本的安全设备之一&…

每周AI新闻(2024年第7周)OpenAI发布视频生成模型Sora | 谷歌推出Gemini 1.5 | 英伟达公开超级计算机

这里是陌小北&#xff0c;一个正在研究硅基生命的碳基生命。正在努力成为写代码的里面背诗最多的&#xff0c;背诗的里面最会写段子的&#xff0c;写段子的里面代码写得最好的…厨子。 每周日解读每周AI大事件。 这一周&#xff0c;国外各厂真是不让我们消停儿过年呐&#xf…

抑郁症测试丨焦虑症测试小程序源码

这是一个考验智力,心里上面的一个测试游戏 支持多种测试方法比如有: 智商测试丨情商测试 性格测试丨爱情测试 抑郁症测试丨焦虑症测试 心理压力测试丨生活满意度测试 通过不同的测试,来检查你的智力,情商等等 通过发行自己的不住来弥补自己的不足所以这就是为什么小编会…

Linux系统——防火墙Firewalld

目录 一、firewalld介绍 1.归入zone顺序 2.firewalld zone分类 3.预定义服务 二、图形化操作 1.打开firewalld图形化界面 2.以http服务为例&#xff0c;打开httpd服务 3.修改端口号 三、命令行配置 1.基础配置 2.查看现有firewalld设置 3.设置查看默认区 4.添加源…

Java集合篇之深度解析Queue,单端队列、双端队列、优先级队列、阻塞队列

写在开头 队列是Java中的一个集合接口&#xff0c;之前的文章已经讲解了List和Set&#xff0c;那么今天就来唠一唠它吧。队列的特点&#xff1a;存储的元素是有序的、可重复的。 队列的两大接口Queue vs Deque Queue 是单端队列&#xff0c;只能从一端插入元素&#xff0c;另…