Elements::Ptr Elements::adapt_boundary(Mesh::Ptr mesh) { if (mesh->get_num_voxels() > 0) { const size_t vertex_per_voxel = mesh->get_vertex_per_voxel(); switch (vertex_per_voxel) { case 4: return Ptr(new TriangleElements(mesh)); default: std::stringstream err_msg; err_msg << "Voxel with " << vertex_per_voxel << " vertices is not supported yet."; throw NotImplementedError(err_msg.str()); } } else { const size_t vertex_per_face = mesh->get_vertex_per_face(); switch (vertex_per_face) { case 3: return Ptr(new EdgeElements(mesh)); default: std::stringstream err_msg; err_msg << "Face with " << vertex_per_face << " vertices is not supported yet."; throw NotImplementedError(err_msg.str()); } } }
GeoMeshPtr GeogramMeshUtils::mesh_to_geomesh(const Mesh::Ptr mesh) { const size_t dim = mesh->get_dim(); const size_t vertex_per_face = mesh->get_vertex_per_face(); const size_t num_vertices = mesh->get_num_vertices(); const size_t num_faces = mesh->get_num_faces(); const auto& vertices = mesh->get_vertices(); const auto& faces = mesh->get_faces(); if (vertex_per_face != 3) { throw NotImplementedError("Converting non-triangle mesh to " "Geogram mesh is not yet implemented"); } auto geo_mesh = std::make_shared<GeoMesh>(dim, false); geo_mesh->vertices.clear(); geo_mesh->vertices.create_vertices(num_vertices); geo_mesh->facets.clear(); geo_mesh->facets.create_triangles(num_faces); for (size_t i=0; i<num_vertices; i++) { auto& p = geo_mesh->vertices.point(i); for (size_t j=0; j<dim; j++) { p[j] = vertices[i*dim+j]; } } for (size_t i=0; i<num_faces; i++) { geo_mesh->facets.set_vertex(i, 0, faces[i*3]); geo_mesh->facets.set_vertex(i, 1, faces[i*3+1]); geo_mesh->facets.set_vertex(i, 2, faces[i*3+2]); } return geo_mesh; }
CellPartition::Ptr CellPartition::create(const Mesh::Ptr& mesh) { const MatrixFr vertices = MatrixUtils::reshape<MatrixFr>( mesh->get_vertices(), mesh->get_num_vertices(), mesh->get_dim()); const MatrixIr faces = MatrixUtils::reshape<MatrixIr>( mesh->get_faces(), mesh->get_num_faces(), mesh->get_vertex_per_face()); return CellPartition::Ptr(new CellPartition(vertices, faces)); }
std::unique_ptr<draco::Mesh> to_draco_mesh(Mesh::Ptr mesh, bool with_attributes=true) { std::unique_ptr<draco::Mesh> draco_mesh(new draco::Mesh()); const size_t vertex_per_face = mesh->get_vertex_per_face(); if (vertex_per_face != 3) { throw NotImplementedError( "Draco encoding only supports triangle mesh."); } copy_vertices(mesh, draco_mesh); copy_faces(mesh, draco_mesh); if (with_attributes) { copy_vertex_attributes(mesh, draco_mesh); //copy_face_attributes(mesh, draco_mesh); } return draco_mesh; }