我正在使用CGAL实现一个三角网格细分的功能。
我删除了三角网格中的一个单元格,然后对每条边进行中点分割,从而把一个单元格划分成4个小三角形。
我先删除原来的大三角形,再插入4个新创建的小三角形。
我发现只能插入中间的小三角形,其余的都是null_face()。
我尝试过调整新的面片的顶点序,但是发现无济于事,请问该咋解决?
CGAL
Surface_mesh
我正在使用CGAL实现一个三角网格细分的功能。
我删除了三角网格中的一个单元格,然后对每条边进行中点分割,从而把一个单元格划分成4个小三角形。
我先删除原来的大三角形,再插入4个新创建的小三角形。
我发现只能插入中间的小三角形,其余的都是null_face()。
我尝试过调整新的面片的顶点序,但是发现无济于事,请问该咋解决?
CGAL
Surface_mesh
针对该问题,可以先使用循环器找到需要删除的单元格,然后将其边界上的顶点的关联半边设置为边界半边。之后,使用循环器遍历当前单元格的每条边,计算出中点,然后将每条边分别与中点相连形成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);