曲線離散算法


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

}

}

 

更多精彩請關注公眾號

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM