1. 程式人生 > 實用技巧 >曲線離散演算法

曲線離散演算法

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

更多精彩請關注公眾號