曲线离散算法
作者:互联网
在做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