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.hqwc.cn/news/461371.html

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

相关文章

单片机学习笔记---DS1302实时时钟工作原理

目录 DS1302介绍 学会读芯片手册&#xff08;DS1302芯片手册&#xff09; 封装 引脚定义 电源部分 时钟部分 通信部分 总结列表 内部结构图 电源控制部分 时钟控制部分 寄存器部分 访问部分 寄存器部分的详细定义 命令字 时序的定义 单字节读 单字节写 提前预…

面向智算服务,构建可观测体系最佳实践

作者&#xff1a;蓟北 构建面向 AI、大数据、容器的可观测体系 &#xff08;一&#xff09;智算服务可观测概况 对于越来越火爆的人工智能领域来说&#xff0c;MLOps 是解决这一领域的系统工程&#xff0c;它结合了所有与机器学习相关的任务和流程&#xff0c;从数据管理、建…

C#,雷卡曼数(Recamán Number)的算法与源代码

1 雷卡曼数&#xff08;Recamn Number&#xff09; 雷卡曼数&#xff08;Recamn Number&#xff09;&#xff0c;即Recaman序列被定义如下&#xff1a; (1) a[0]0; (2) 如果a[m-1]-m>0并且这个值在序列中不存在&#xff0c;则a[m]a[m-1]-m; (3) 否则a[m]a[m-1]m; 雷卡曼序…

图神经网络与图表示学习: 从基础概念到前沿技术

目录 前言1 图的形式化定义和类型1.1 图的形式化定义1.2 图的类型 2 图表示学习2.1 DeepWalk: 融合语义相似性与图结构2.2 Node2Vec: 灵活调整随机游走策略2.3 LINE: 一阶与二阶邻接建模2.4 NetMF: 矩阵分解的可扩展图表示学习2.5 Metapath2Vec: 异构图的全面捕捉 3 图神经网络…

Expo Router + Supabase使用流程

unsetunset前言unsetunset Expo是一个React-native生态中的一个工具包&#xff0c;提供了非常多的功能&#xff0c;Expo Router是Expo最近推出的功能&#xff0c;其效果类似于Nextjs的router&#xff0c;可以基于目录结构来实现路由。 Supabase是一个开源的postgres数据库&…

yolov8自制数据训练集

目录 1.YOLOv8是啥 2.系统环境 3.安装labelimg 3.1安装 3.2启动 labelimg 4.自制分类图片 4.1 YOLO数据集要求 4.2 图片保存目录 4.3 利用labelimg进行标注 4.4 存储图片 4.5 标注文件 5.数据集训练 5.1yaml文件 5.2训练命令 5.3查看训练过程 5.3.1启动tensorb…

Android AOSP源码研究之万事开头难----经验教训记录

文章目录 1.概述2.Android源下载1.配置环境变量2.安装curl3.下载repo并授权4.创建一个文件夹保存源码5.设置repo的地址并配置为清华源6.初始化仓库7.指定我们需要下载的源码分支并初始化 2.1 使用移动硬盘存放Android源码的坑2.2 解决方法 3.Android源码编译4.Android源烧录 1.…

element ui表格手写拖动排序

效果图&#xff1a; 思路&#xff1a; 重点在于&#xff1a;拖动行到某一位置&#xff0c;拿到这一位置的标识&#xff0c;数据插入进这个位置 vueuse的拖拽hooks useDraggable 可以用&#xff1b;html5 drag能拖动行元素&#xff1b;mounsedown、mounsemove时间实现拖拽 页…

JavaScript基础第六天

JavaScript 基础第六天 今天我们学习数组的遍历&#xff0c;以及数组的其他用法。 1. 数组遍历 1.1. 古老方法 可以使用 for 循环进行遍历。 let arr ["a", "b", "d", "g"]; for (let i 0; i < arr.length; i) {console.log…

火星文:网络时代下的语言

引言 在互联网时代&#xff0c;网络语言的发展日新月异。火星文作为一种特殊的网络表达方式&#xff0c;近年来逐渐兴起并成为了网络文化的一部分。 火星文生成器 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.com/huoxingwen 火星文的兴起时代 火星…

了解物联网漏洞与家庭网络入侵之间的联系

我们的家庭正日益成为一个由互连设备组成的网络。从智能恒温器到联网冰箱&#xff0c;物联网 (IoT) 彻底改变了我们与家庭环境互动的方式。 随着技术进步带来了新的挑战&#xff1a;这些设备容易受到网络威胁以及随之而来的家庭网络入侵风险。 在这篇博文中&#xff0c;我们将…

JCIM | MD揭示PTP1B磷酸酶激活RtcB连接酶的机制

Background 内质网应激反应&#xff08;UPR&#xff09; 中的一个重要过程。UPR是由内质网中的三种跨膜传感器&#xff08;IRE1、PERK和ATF6&#xff09;控制的细胞应激反应&#xff0c;当内质网中的蛋白质折叠能力受到压力时&#xff0c;UPR通过减少蛋白质合成和增加未折叠或错…