Occ曲线离散算法 (点数、长度、弦高)三种方式(转)

在做CAD/CAM开发时,经常会遇到要将曲线离散成点。例如机床要沿一条空间曲线或平面样条曲线运行时,实际是把先把曲线离散成很小的直线段。然后进行直线插补运动。本文列出了经常用到的几种算法并附上源码,供大家参考。

主要有三种离散方法,按数量离散、按长度离散、按弦高离散,根据实际需要选择就好了。在OpenCASCADE中,就是将TopoDS_Wire离散成gp_Pnt。

1.按数量离散

将曲线离散成给定的段数,每段等长。示例和代码如下。

复制代码
TopoDS_Wire W=...;

BRepAdaptor_CompCurve compCurve(W);

GCPnts_UniformAbscissa uniAbs(compCurve, count, -1);

if(uniAbs.IsDone())

{

for (Standard_Integer i = 1; i <= uniAbs.NbPoints(); ++i)

{

Standard_Real u = uniAbs.Parameter(i);

gp_Pnt p=compCurve.D0(u, p);//获取每个离散点

}

}
复制代码

 

 

2.按长度离散

将曲线离散成多段,每段为给定长度。最后一段会少于给定距离,如果想每段等距,可以先求总长度再做平均,但每段距离会略小于给定长度。示例和代码如下。

复制代码
TopoDS_Wire W=...;

BRepAdaptor_CompCurve compCurve(W);

GCPnts_UniformAbscissa uniAbs;

uniAbs.Initialize(compCurve, distance, -1);

if (uniAbs.IsDone())

{

for (Standard_Integer i = 1; i <= uniAbs.NbPoints(); ++i)

{

Standard_Real u = uniAbs.Parameter(i);

gp_Pnt p=compCurve.D0(u, p);//获取每个离散点

}

}
复制代码

 

 

3.按弦高离散

将曲线离散成多段,每段的弦高在精度范围内。该算法在曲率大的地方离散点数会多,但总体点数有时会变少,更接近原始曲线,是最常用的一种。示例和代码如下。

复制代码
TopoDS_Wire W=...;

BRepAdaptor_CompCurve compCurve(W);

quasiUniDef.Initialize(compCurve, deflection, GeomAbs_C0);

if (quasiUniDef.IsDone())

{

for (Standard_Integer i = 1; i <= quasiUniDef.NbPoints(); ++i)

{

Standard_Real u = quasiUniDef.Parameter(i);

gp_Pnt p = quasiUniDef.Value(i);

}

}
复制代码

 

 

 转自:曲线离散算法 - YiShan-CADCAM - 博客园 (cnblogs.com)

posted @   格美格美  阅读(1482)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示