为啥add_face会失败?

我正在使用CGAL实现一个三角网格细分的功能。
我删除了三角网格中的一个单元格,然后对每条边进行中点分割,从而把一个单元格划分成4个小三角形。
我先删除原来的大三角形,再插入4个新创建的小三角形。
我发现只能插入中间的小三角形,其余的都是null_face()。
我尝试过调整新的面片的顶点序,但是发现无济于事,请问该咋解决?

CGAL
Surface_mesh

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    针对该问题,可以先使用循环器找到需要删除的单元格,然后将其边界上的顶点的关联半边设置为边界半边。之后,使用循环器遍历当前单元格的每条边,计算出中点,然后将每条边分别与中点相连形成4个小三角形,插入到网格中。代码实现如下:

    // assume m is the Surface_mesh object
    // assume fh is the face descriptor of the cell to be split
    Mesh::Halfedge_around_face_circulator fvit = m.halfedges(fh), done(fvit);
    Mesh::Vertex_around_face_circulator vvit = m.vertices(fh), vdone(vvit);
    // set all border halfedges to be properly labeled
    for(; fvit != done; ++fvit) {
        if(m.is_border(*fvit)) {
            m.set_vertex_halfedge_to_border_halfedge(m.target(*fvit));
        }
    }
    // iterate through the edges and add new triangles
    fvit = m.halfedges(fh);
    Mesh::Point p0, p1;
    for(; fvit != done; ++fvit, ++vvit) {
        Mesh::Halfedge_index he = *fvit;
        Mesh::Vertex_index va = m.target(he);
        Mesh::Vertex_index vb = m.target(m.next(he));
        Mesh::Vertex_index vc = *vvit;
        p0 = m.point(va) + m.point(vb);
        p0 = 0.5 * p0;
        p1 = m.point(vc);
        Mesh::Vertex_index vm = m.add_vertex(p0);
        Mesh::Face_index fn = m.add_face(va, vm, vc);
        m.add_face(vb, vc, vm, fn);
        m.set_vertex_halfedge(vc, fn);
    }
    // remove the cell to be split
    m.remove_face(fh);
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^