编程语言
首页 > 编程语言> > 曲线离散算法

曲线离散算法

作者:互联网

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

}

}

 

更多精彩请关注公众号

 

标签:Wire,曲线,离散,算法,uniAbs,compCurve,TopoDS
来源: https://www.cnblogs.com/occi/p/14163361.html