1. 程式人生 > 實用技巧 >獲取TopoDS_Face的網格資料

獲取TopoDS_Face的網格資料

將線條包覆到模型(wrap curve to shape,可閱讀我寫的高階演算法模型包覆演算法)或計算銑削等路徑時,一般會先獲取模型的網格資料,而網格精度和質量會影響計算結果。

不管是openglOpenCASCADE,還是vtk等等,顯示原理都是將原始曲面離散成很多的三角面進行顯示,三角網格越密越順滑顯示越逼真,但也對電腦硬體有更高的要求。

OpenCASCADE在對TopoDS_Shape顯示時,就是先對其進行了離散,離散資料會儲存在模型中,因此可以直接讀取。程式碼如下。

for (TopExp_Explorer ex(shape, TopAbs_FACE); ex.More(); ex.Next()) {
                
const TopoDS_Face& F = TopoDS::Face(ex.Current()); TopLoc_Location L; Handle(Poly_Triangulation) facing = BRep_Tool::Triangulation(F, L); if (!facing.IsNull()) { //頂點 gp_Trsf aTrsf = L.Transformation();
for (Standard_Integer i = 1; i <= (facing->NbNodes()); i++) { gp_Pnt pnt = facing->Nodes().Value(i).Transformed(aTrsf);//獲取頂點座標 } //三角 for (Standard_Integer i = 1; i <= (facing->NbTriangles()); i++) { const Poly_Triangle& trian = facing->Triangles().Value(i); Standard_Integer index1, index2, index3; trian.Get(index1, index2, index3);
//獲取三角頂點索引 } } }

預設情況下,為了顯示效率,網格劃分精度會比較低,如果想獲取較高的精度,可以呼叫OpenCASCADE的網格劃分函式。如下:

TopoDS_Shape shape=...;//模型
Double deflection = ...;//網格精度
BRepMesh_IncrementalMesh(shape, deflection);

更多精彩請關注公眾號