首页 > 编程语言 > 详细

曲线离散算法

时间:2020-12-20 15:06:17      阅读:98      评论:0      收藏:0      [点我收藏+]

在做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);

}

}

技术分享图片

 

更多精彩请关注公众号

技术分享图片

 

曲线离散算法

原文:https://www.cnblogs.com/occi/p/14163361.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!