Open CASCADE学习|点和曲线的相互转化

目录

1、把曲线离散成点

1.1按数量离散

1.2按长度离散

1.3按弦高离散

2、由点合成曲线

2.1B样条插值

2.2B样条近似


1、把曲线离散成点

计算机图形学中绘制曲线,无论是绘制参数曲线还是非参数曲线,都需要先将参数曲线进行离散化,通过离散化得到一组离散化的点集,然后再将点集发送给图形渲染管线进行处理,最终生成我们想要的曲线。

OpenCASCADE中提供了GCPnts包。利用GCPnts包中提供的类,我们可以很方便的将三维曲线进行离散化。

1.1按数量离散

#include <Geom_CylindricalSurface.hxx>#include <gp_Ax3.hxx>#include <GeomAPI_Interpolate.hxx>#include <BRepAdaptor_Curve.hxx>#include <BRepBuilderAPI_MakeEdge.hxx>#include <Geom2d_TrimmedCurve.hxx>#include <GCE2d_MakeSegment.hxx>#include <GeomAPI_PointsToBSpline.hxx>#include <BRepBuilderAPI_MakeFace.hxx>#include <GC_MakeCircle.hxx>#include <BRepBuilderAPI_MakeWire.hxx>#include <BRepOffsetAPI_MakePipe.hxx>#include <GC_MakeArcOfCircle.hxx>#include <BRepAlgoAPI_Fuse.hxx>#include <gp_GTrsf.hxx>#include <BRepBuilderAPI_MakeVertex.hxx>#include"Viewer.h"#include <BRepAdaptor_CompCurve.hxx>#include <GCPnts_UniformAbscissa.hxx>int main(int argc, char* argv[]){    gp_Dir  Z(0.0, 0.0, 1.0);    gp_Pnt center(0, 0, 0.0);    gp_Pnt xr(0.5, 0, 0.0);    gp_Pnt yr(0.0, 1.0, 0.0);    gp_Pnt zr(0.0, 0.0, 7.0);    gp_Ax2  wb(center, Z);    gp_Circ  wbcircle(wb, 0.125 / 2);    TopoDS_Edge wbe = BRepBuilderAPI_MakeEdge(wbcircle);    TopoDS_Wire te = BRepBuilderAPI_MakeWire(wbe);    BRepAdaptor_CompCurve compCurve(te);    GCPnts_UniformAbscissa uniAbs(compCurve, 100, -1);    gp_Pnt p;    Viewer vout(50, 50, 500, 500);    vout << te;    if (uniAbs.IsDone())    {        for (Standard_Integer i = 1; i <= uniAbs.NbPoints(); ++i)        {            Standard_Real u = uniAbs.Parameter(i);            compCurve.D0(u, p);//获取每个离散点            TopoDS_Vertex verti = BRepBuilderAPI_MakeVertex(p);            vout << verti;        }    }    vout.StartMessageLoop();    return 0;}

1.2按长度离散

#include <Geom_CylindricalSurface.hxx>#include <gp_Ax3.hxx>#include <GeomAPI_Interpolate.hxx>#include <BRepAdaptor_Curve.hxx>#include <BRepBuilderAPI_MakeEdge.hxx>#include <Geom2d_TrimmedCurve.hxx>#include <GCE2d_MakeSegment.hxx>#include <GeomAPI_PointsToBSpline.hxx>#include <BRepBuilderAPI_MakeFace.hxx>#include <GC_MakeCircle.hxx>#include <BRepBuilderAPI_MakeWire.hxx>#include <BRepOffsetAPI_MakePipe.hxx>#include <GC_MakeArcOfCircle.hxx>#include <BRepAlgoAPI_Fuse.hxx>#include <gp_GTrsf.hxx>#include <BRepBuilderAPI_MakeVertex.hxx>#include"Viewer.h"#include <BRepAdaptor_CompCurve.hxx>#include <GCPnts_UniformAbscissa.hxx>int main(int argc, char* argv[]){    gp_Dir  Z(0.0, 0.0, 1.0);    gp_Pnt center(0, 0, 0.0);    gp_Pnt xr(0.5, 0, 0.0);    gp_Pnt yr(0.0, 1.0, 0.0);    gp_Pnt zr(0.0, 0.0, 7.0);    gp_Ax2  wb(center, Z);    gp_Circ  wbcircle(wb, 0.125 / 2);    TopoDS_Edge wbe = BRepBuilderAPI_MakeEdge(wbcircle);    TopoDS_Wire te = BRepBuilderAPI_MakeWire(wbe);    BRepAdaptor_CompCurve compCurve(te);    GCPnts_UniformAbscissa uniAbs;    uniAbs.Initialize(compCurve, 0.05, -1);    gp_Pnt p;    Viewer vout(50, 50, 500, 500);    vout << te;    if (uniAbs.IsDone())    {        for (Standard_Integer i = 1; i <= uniAbs.NbPoints(); ++i)        {            Standard_Real u = uniAbs.Parameter(i);            compCurve.D0(u, p);//获取每个离散点            TopoDS_Vertex verti = BRepBuilderAPI_MakeVertex(p);            vout << verti;        }    }    vout.StartMessageLoop();    return 0;}

1.3按弦高离散

#include <Geom_CylindricalSurface.hxx>#include <gp_Ax3.hxx>#include <GeomAPI_Interpolate.hxx>#include <BRepAdaptor_Curve.hxx>#include <BRepBuilderAPI_MakeEdge.hxx>#include <Geom2d_TrimmedCurve.hxx>#include <GCE2d_MakeSegment.hxx>#include <GeomAPI_PointsToBSpline.hxx>#include <BRepBuilderAPI_MakeFace.hxx>#include <GC_MakeCircle.hxx>#include <BRepBuilderAPI_MakeWire.hxx>#include <BRepOffsetAPI_MakePipe.hxx>#include <GC_MakeArcOfCircle.hxx>#include <BRepAlgoAPI_Fuse.hxx>#include <GCPnts_QuasiUniformDeflection.hxx>#include <BRepBuilderAPI_MakeVertex.hxx>#include"Viewer.h"#include <BRepAdaptor_CompCurve.hxx>#include <GCPnts_UniformAbscissa.hxx>int main(int argc, char* argv[]){    gp_Dir  Z(0.0, 0.0, 1.0);    gp_Pnt center(0, 0, 0.0);    gp_Pnt xr(0.5, 0, 0.0);    gp_Pnt yr(0.0, 1.0, 0.0);    gp_Pnt zr(0.0, 0.0, 7.0);    gp_Ax2  wb(center, Z);    gp_Circ  wbcircle(wb, 0.125 / 2);    TopoDS_Edge wbe = BRepBuilderAPI_MakeEdge(wbcircle);    TopoDS_Wire te = BRepBuilderAPI_MakeWire(wbe);    BRepAdaptor_CompCurve compCurve(te);    GCPnts_QuasiUniformDeflection quasiUniDef;    quasiUniDef.Initialize(compCurve, 0.08, GeomAbs_C0);    gp_Pnt p;    Viewer vout(50, 50, 500, 500);    vout << te;    if (quasiUniDef.IsDone())    {        for (Standard_Integer i = 1; i <= quasiUniDef.NbPoints(); ++i)        {            p=quasiUniDef.Value(i);//获取每个离散点            TopoDS_Vertex verti = BRepBuilderAPI_MakeVertex(p);            vout << verti;        }    }    vout.StartMessageLoop();    return 0;}

2、由点合成曲线

曲线曲面拟合Curve and Surface Fitting的方式可以分为两类:插值interpolation和逼近approximation。采用插值的方式时,所创建的曲线或曲面必须精确地满足所给的数据条件,例如曲线通过所给的插值点。采用逼近的方式时,创建的曲线或曲面不必精确地满足所给的数据条件,只要在一定的误差范围内接近即可。

2.1B样条插值

#include <Geom_CylindricalSurface.hxx>
#include <gp_Ax3.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <GCE2d_MakeSegment.hxx>
​
#include <GeomAPI_PointsToBSpline.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <GC_MakeCircle.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
​
#include <GCPnts_QuasiUniformDeflection.hxx>
#include <BRepBuilderAPI_MakeVertex.hxx>
​
#include"Viewer.h"
​
#include <BRepAdaptor_CompCurve.hxx>
#include <GeomTools.hxx>
​
int main(int argc, char* argv[])
{Handle(TColgp_HArray1OfPnt) aPoints = new TColgp_HArray1OfPnt(1, 3);Handle(Geom_BSplineCurve) aBSplineCurve;
​aPoints->SetValue(1, gp_Pnt(0.0, 0.0, 0.0));aPoints->SetValue(2, gp_Pnt(1.0, 1.0, 0.0));aPoints->SetValue(3, gp_Pnt(2.0, 6.0, 3.0));
​GeomAPI_Interpolate aInterpolater(aPoints, Standard_False, Precision::Approximation());aInterpolater.Perform();aBSplineCurve = aInterpolater.Curve();//std::cout << "ok";TopoDS_Edge s = BRepBuilderAPI_MakeEdge(aBSplineCurve);Viewer vout(50, 50, 500, 500);vout << s;vout << BRepBuilderAPI_MakeVertex(aPoints->Value(1));vout << BRepBuilderAPI_MakeVertex(aPoints->Value(2));vout << BRepBuilderAPI_MakeVertex(aPoints->Value(3));vout.StartMessageLoop();return 0;
}

2.2B样条近似

#include <Geom_CylindricalSurface.hxx>#include <gp_Ax3.hxx>#include <GeomAPI_Interpolate.hxx>#include <BRepAdaptor_Curve.hxx>#include <BRepBuilderAPI_MakeEdge.hxx>#include <Geom2d_TrimmedCurve.hxx>#include <GCE2d_MakeSegment.hxx>#include <GeomAPI_PointsToBSpline.hxx>#include <BRepBuilderAPI_MakeFace.hxx>#include <GC_MakeCircle.hxx>#include <BRepBuilderAPI_MakeWire.hxx>#include <BRepOffsetAPI_MakePipe.hxx>#include <GC_MakeArcOfCircle.hxx>#include <BRepAlgoAPI_Fuse.hxx>#include <GCPnts_QuasiUniformDeflection.hxx>#include <BRepBuilderAPI_MakeVertex.hxx>#include"Viewer.h"#include <BRepAdaptor_CompCurve.hxx>#include <GeomTools.hxx>int main(int argc, char* argv[]){    Handle(TColgp_HArray1OfPnt) aPoints = new TColgp_HArray1OfPnt(1, 3);    Handle(Geom_BSplineCurve) aBSplineCurve;    aPoints->SetValue(1, gp_Pnt(0.0, 0.0, 0.0));    aPoints->SetValue(2, gp_Pnt(1.0, 1.0, 0.0));    aPoints->SetValue(3, gp_Pnt(2.0, 6.0, 3.0));    GeomAPI_PointsToBSpline Approx(aPoints->Array1());    Handle(Geom_BSplineCurve) K = Approx.Curve();    TopoDS_Edge s = BRepBuilderAPI_MakeEdge(K);         Viewer vout(50, 50, 500, 500);    vout << s;    vout << BRepBuilderAPI_MakeVertex(aPoints->Value(1));    vout << BRepBuilderAPI_MakeVertex(aPoints->Value(2));    vout << BRepBuilderAPI_MakeVertex(aPoints->Value(3));    vout.StartMessageLoop();    return 0;}

       

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

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

相关文章

LayUI中表格树折叠 --

1、先将插件源码进行下载&#xff0c;新建 tableTree.js 文件&#xff0c;将源码放进去 2、将 tableTree.js 文件 配置之后&#xff0c;在需要使用的页面进行引入&#xff1a; layui.define(["tableTree"],function (exports) {var tableTree layui.tableTree;// …

2024年【天津市安全员B证】模拟试题及天津市安全员B证模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员B证模拟试题是安全生产模拟考试一点通生成的&#xff0c;天津市安全员B证证模拟考试题库是根据天津市安全员B证最新版教材汇编出天津市安全员B证仿真模拟考试。2024年【天津市安全员B证】模拟试题及天津市…

蓝桥杯官网练习题(大臣的旅费)

问题描述 很久以前&#xff0c;T 王国空前繁荣。为了更好地管理国家&#xff0c;王国修建了大量的快速路&#xff0c;用于连接首都和王国内的各大城市。 为节省经费&#xff0c;T 国的大臣们经过思考&#xff0c;制定了一套优秀的修建方案&#xff0c;使得任何一个大城市都能从…

Redis——缓存设计与优化

讲解Redis的缓存设计与优化&#xff0c;以及在生产环境中遇到的Redis常见问题&#xff0c;例如缓存雪崩和缓存穿透&#xff0c;还讲解了相关问题的解决方案。 1、Redis缓存的优点和缺点 1.1、缓存优点&#xff1a; 高速读写&#xff1a;Redis可以帮助解决由于数据库压力造成…

安全的接口访问策略

渗透测试 一、Token与签名 一般客户端和服务端的设计过程中&#xff0c;大部分分为有状态和无状态接口。 一般用户登录状态下&#xff0c;判断用户是否有权限或者能否请求接口&#xff0c;都是根据用户登录成功后&#xff0c;服务端授予的token进行控制的。 但并不是说有了tok…

【LeetCode】332. 重新安排行程(困难)——代码随想录算法训练营Day30

题目链接&#xff1a;332. 重新安排行程 题目描述 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&a…

椭圆曲线加密

椭圆曲线加密&#xff08;Elliptic Curve Cryptography&#xff0c;ECC&#xff09;是一种公钥加密算法&#xff0c;它基于椭圆曲线上的数学运算来实现安全的通信。 以下是椭圆曲线加密的基本过程&#xff1a; 1. 参数选择&#xff1a;选择一个适当的椭圆曲线和一个基础点。椭…

C#(C Sharp)学习笔记_运算符与布尔类型【四】

算术运算符 所谓算术运算符&#xff1a;就是现实中的加减乘除之类的符号&#xff0c;但在编程语言中&#xff0c;它们又有不同于现实的语法。下面就介绍一下算术运算符的各种符号包括计算案例。 运算符描述实例(设a为4&#xff1b;b为2)把两个操作数相加A B 将得到 6-从第一…

JVM-运行时数据区程序计数器

运行时数据区 Java虚拟机在运行Java程序过程中管理的内存区域&#xff0c;称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。 程序计数器的定义 程序计数器&#xff08;Program Counter Register&#xff09;也叫PC寄存器&#xff0c;每个线程会通过程序计数器…

1.3 Verilog 环境搭建详解教程

学习 Verilog 做仿真时&#xff0c;可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE&#xff08;目前已停止更新&#xff09;&#xff0c;VIVADO&#xff1b;因特尔公司的 Quartus II&#xff1b;ASIC 开发环境有 Synopsys 公司的 VCS &#xff1b;很多人也在用 Icarus…

PyTorch 2.2 中文官方教程(三)

使用 PyTorch 构建模型 原文&#xff1a;pytorch.org/tutorials/beginner/introyt/modelsyt_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整示例代码 介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 ||…

一些学习的总结帖子

一、Spring 参考链接1 参考链接2 参考链接3 二、多线程 并发的理解 参考链接1 三、redis 参考链接1 四、rabbitmq 五、数据库 数据库事务的概念及其原理 数据库事务 六、other 添加链接描述

Why React Doesn‘t Need jQuery?

a revolution library – 一个革命性的库greatly simplified tasks such as … – 极大的简化了…任务DOM manipulation – DOM操作event handling – 事件处理animation creation – 动画创建Ajax request – Ajax请求with the rise of modern front frameworks – 随着现代前…

Java风暴:打造高效作家信息管理平台

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

Web项目利用EasyExcel实现Excel的导出操作

早期Java使用的一些解析&#xff0c;到处excel的框架存在种种问题被遗弃&#xff0c;现在使用阿里巴巴所提供的EasyExcel已成为一种主流&#xff0c;本篇将详细介绍该功能在Web项目中如何实际应用。 详细操作文档&#xff1a;写Excel | Easy Excel 一、项目演示 在后台管理界…

windows下使用bat打开程序,并解决闪退问题

1.如何使用bat打开一个已经编译好的exe文件 示例&#xff1a;start /d"F:\testProject\bin\Debug" Shell_Component.exestart 空格 /d(后面不要空格) 引号并包裹exe程序路径 空格 exe名称 参考&#xff1a;https://blog.csdn.net/zhangshengqiang168/article/d…

Nginx与history路由模式:刷新页面404问题

使用nginx部署前端项目&#xff0c;路由模式采用history模式时&#xff0c;刷新页面之后&#xff0c;显示404。 路由模式 前端路由的基本作用为&#xff1a; ①当浏览器地址变化时&#xff0c;切换页面&#xff1b; ②点击浏览器后退、前进按钮时&#xff0c;更新网页内容&…

基于ISO13400 (DoIP) 实现车辆刷写

近年来&#xff0c;在整车研发中基于以太网实现车辆高带宽通讯无疑是人们热议的话题。无论是车内基于车载以太网来减少线束成本&#xff0c;实现ADAS、信息娱乐系统等技术&#xff0c;还是基于新的电子电气架构以及远程诊断需求来实现以太网诊断&#xff08;DoIP&#xff09;&a…

BUGKU-WEB 留言板

题目描述 题目无需登录后台&#xff01;需要xss平台接收flag&#xff0c; http协议需要http协议的xss平台打开场景后界面如下&#xff1a; 解题思路 看到此类的题目&#xff0c;应该和存储型xss有关&#xff0c;也就是将恶意代码保存到服务器端即然在服务器端&#xff0c;那就…

【Cocos入门】场景切换(loadScene、preloadScene)

一、loadScene 加载场景 loadScene(sceneName: string, onLaunched: Director.OnSceneLaunched, onUnloaded: Director.OnUnload) : boolean 通过场景名称进行加载场景。返回值为布尔类型 参数&#xff1a; NameTypeDescriptionsceneNamestring场景名称onLaunchedDirector.O…