Sun, 09/25/2022 - 16:19
Forums:
I am using the below to triangulate a shape:
int main() { TopoDS_Shape box = BRepPrimAPI_MakeBox(gp_Pnt(0, 0, 0), gp_Pnt(1, 1, 1)); BRepMesh_IncrementalMesh aMesher(box, 1.2, Standard_False, 1.8, Standard_True); TopExp_Explorer ex; for (ex.Init(box, TopAbs_FACE); ex.More(); ex.Next()) { TopoDS_Face face = TopoDS::Face(ex.Current()); TopLoc_Location location; const Handle(Poly_Triangulation) triangles = BRep_Tool::Triangulation(face, location); for (int i = 1; i <= triangles->NbTriangles(); ++i) { Standard_Integer node1, node2, node3; if (face.Orientation() == TopAbs_REVERSED) { triangles->Triangle(i).Get(node1, node3, node2); } else { triangles->Triangle(i).Get(node1, node2, node3); } std::cout << node1 << " " << node2 << " " << node3 << std::endl; } } }
However for each face of the box, I only get node numbers from 1 to 4. How do I get numbers from 1 to 8 (or 0 to 7), where the numbers uniquely represent the vertices of my cube?
Mon, 09/26/2022 - 10:18
Each TopoDS_Face defines it's own Poly_Triangulation, so that to have a unified triangulation for an entire solid or another shape you'll have to fill in triangulation of your own. Connectivity is preserved via Poly_PolygonOnTriangulation stored inside TopoDS_Edge, connecting TopoDS_Face.
Alternatively, you may use tools like Poly_MergeNodesTool to create new triangulation considering only geometrical connectivity of nodes, regardless of topological connectivity.
Thu, 09/29/2022 - 00:42
Couldn't understand what gkv said above. Ended up implementing a few hash maps.