我有一个三角形CGAL网格与确切的内核(EK, EMesh3, EPoint3
),我想将其转换为相同的网格与不精确的内核(K, Mesh3, Point3
)。我的解决方案是将精确网格的每个顶点和每个面逐一添加到一个空的不精确网格中。有没有更直接的方法?
Mesh3 Convert(EMesh3 emesh) {
const size_t nvertices = emesh.number_of_vertices();
const size_t nedges = emesh.number_of_edges();
const size_t nfaces = emesh.number_of_faces();
Mesh3 mesh;
mesh.reserve(nvertices, nedges, nfaces);
for(EMesh3::Vertex_index vd : emesh.vertices()) {
const EPoint3 vertex = emesh.point(vd);
const double x = CGAL::to_double<EK::FT>(vertex.x());
const double y = CGAL::to_double<EK::FT>(vertex.y());
const double z = CGAL::to_double<EK::FT>(vertex.z());
mesh.add_vertex(Point3(x, y ,z));
}
for(EMesh3::Face_index fd : emesh.faces()) {
std::vector<int> face;
for(EMesh3::Vertex_index vd : vertices_around_face(emesh.halfedge(fd), emesh)) {
face.push_back(vd);
}
mesh.add_face(
CGAL::SM_Vertex_index(face[0]),
CGAL::SM_Vertex_index(face[1]),
CGAL::SM_Vertex_index(face[2])
);
}
return mesh;
}
你可以创建一个新的网格,就像你做的一样,但是用copy_face_graph()
函数,或者你可以使用PMP函数的vertex_property_map()
参数,有一个网格与不同的点映射(精确和不精确)。