Search code examples
c++cgal

CGAL: Get face data from surface mesh


I'm trying to fill my own struct with data retrieved from a CGAL::Surface_mesh.

You can add a face to a surface mesh via..

CGAL::SM_Face_index face = SM_Surface_Mesh.add_face(SM_Vertex_Index, SM_Vertex_Index, SM_Vertex_Index);

.. but how does one retrieve that face given the SM_Face_Index? I've tried sifting through the documentation but to no avail.

InteropMesh * outputMesh = new InteropMesh();
uint32_t num = mesh1.number_of_vertices();

outputMesh->vertexCount = num;

outputMesh->vertices = new InteropVector3[num];

for (Mesh::Vertex_index vd : mesh1.vertices()) 
{
    uint32_t index = vd; //via size_t

    Point data = mesh1.point(vd);
    outputMesh->vertices[index].x = (float)data.x();
    outputMesh->vertices[index].y = (float)data.y();
    outputMesh->vertices[index].z = (float)data.z();
}

outputMesh->indices = new uint32_t[mesh1.number_of_faces() * 3];

for (CGAL::SM_Face_index fd : mesh1.faces())
{
    //? How do I get the three vertex indices?
}

Solution

  • The Surface_mesh data structure can represent more than only triangle meshes. Meaning that you might have more than 3 vertices per face. Once you get a face, you can navigate on its boundary edges and get the source and target vertices.

    For example you can do:

    Surface_mesh::Halfedge_index hf = sm.halfedge(fi);
    for(Surface_mesh::Halfedge_index hi : halfedges_around_face(hf, sm))
    {
      Surface_mesh::Vertex_index vi = target(hi, sm);
    }
    

    You can also do it by hand:

    Surface_mesh::Halfedge_index hstart = sm.halfedge(fi), hi=hstart;
    do{
      Surface_mesh::Vertex_index vi = target(hi, sm);
      hi=sm.next(hi);
    }
    while(hi!=hstart)