曲線離散演算法
阿新 • • 發佈:2020-12-20
在做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); } }
更多精彩請關注公眾號