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证】模拟试题及天津市…

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…

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 支持 || 训练模型 ||…

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

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

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

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

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…

基于Chrome插件的Chatgpt对话无损导出markdown格式(Typora完美显示)

刚刚提交插件到Chrome插件商店正在审核&#xff0c;想尝试的可以先使用&#xff1a; https://github.com/thisisbaiy/ChatGPT-To-Markdown-google-plugin/tree/main 我将源代码上传至了GitHub&#xff0c;欢迎star, IssueGoogle插件名称为&#xff1a;ChatGPT to MarkDown plus…

3.1 Verilog 连续赋值

关键词&#xff1a;assign&#xff0c; 全加器 连续赋值语句是 Verilog 数据流建模的基本语句&#xff0c;用于对 wire 型变量进行赋值。&#xff1a; 格式如下 assign LHS_target RHS_expression &#xff1b; LHS&#xff08;left hand side&#xff09; 指赋值操作…

C#委托的前世今生

起因 很多C#初学者&#xff0c;都遇到过这样的问题——线程间操作无效&#xff0c;从不是创建控件的线程访问它。 今天就这个问题&#xff0c;展开分析。 溯源 先说下这个问题产生的根源。 大家都知道&#xff0c;程序运行起来之后&#xff0c;首先会有一个主线程&#xff…

中小型网络系统总体规划与设计方法

目录 1.基于网络的信息系统基本结构 2.网络需求调研与系统设计原则 3.网络用户调查 4.网络节点地理位置分布情况 5.网络需求详细分析 6.应用概要分析 7.网络工程设计总体目标与设计原则 8.网络结构与拓扑构型设计方法 9.核心层网络结构设计 10.接入核心路由器 11.汇聚…

Android 环境搭建

1、桥接工具安装 网站地址&#xff1a;AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载 使用安装包&#xff1a; adb 查看当前链接成功的设备&#xff1a;adb devices 使用adb shell指令来进入到手机的后台&#xff1a;

Redis 持久化对性能有何影响?

Redis 持久化对性能的影响 Redis 是一个高性能的内存数据存储系统&#xff0c;通常被用于缓存、消息队列和数据存储等方面。由于 Redis 是基于内存的&#xff0c;因此它的读写速度非常快&#xff0c;可以满足高并发、低延迟的应用需求。但是&#xff0c;当 Redis 需要持久化数…