Я хотел бы выполнить следующее действие с использованием CGAL:
Пересечь поверхность сетки; разрезанная сетка; с другой поверхностной сеткой; резаная сетка; разделить разрезанную сетку на 2 разных сетки.
Для этого я использую CGAL Mesh Slicer который дает мне набор полилиний. К сожалению, слайсер не предоставляет информацию о том, к какой стороне вырезанной сетки принадлежит каждая ломаная. Кроме того, он эффективно выполняет действие слайсера.
Как я могу получить эту информацию?
Мне нужна эта информация, чтобы выполнить разбиение вырезанной сетки вдоль полилиний, затем деление на 2 отдельные сетки.
В моем контексте вырезанная сетка — это поверхностная сетка, подобная этой:
Вот разрезанная сетка + разрезанная сетка:
В моем коде я генерирую плоскость из каждой грани вырезанной сетки и выполняю операцию среза с вырезанной сеткой.
Вот мой код:
//Import off files and instantiate meshes
const char* filename1 = "test.off";
const char* filename2 = "cutMesh2.off";
std::ifstream input(filename1);
Mesh cuttedMesh, cutMesh;
if (!input || !(input >> cuttedMesh))
{
std::cerr << "First mesh is not a valid off file." << std::endl;
return 0;
}
input.close();
input.open(filename2);
if (!input || !(input >> cutMesh))
{
std::cerr << "Second mesh is not a valid off file." << std::endl;
return 0;
}
input.close();
// AABB Slicer constructor from the cutted mesh
AABB_tree tree(edges(cuttedMesh).first, edges(cuttedMesh).second, cuttedMesh);
tree.accelerate_distance_queries();
CGAL::Polygon_mesh_slicer<Mesh, K> slicer_aabb(cuttedMesh, tree);
std::cout << cutMesh.num_vertices()<< std::endl;
// For each face of the cut mesh
BOOST_FOREACH(face_descriptor f, faces(cutMesh))
{
std::cout << "Face " << f << std::endl;
Point points [3];
int i = 0;
//for each point of the current face
BOOST_FOREACH(vertex_descriptor v, CGAL::vertices_around_face(cutMesh.halfedge(f), cutMesh))
{
points[i]= cutMesh.point(v);
++i;
}
Polylines polylines;
// Perform the slice between the current face of the cut mesh and the cutted mesh
slicer_aabb(K::Plane_3(points[0],points[1],points[2]), std::back_inserter(polylines));
std::cout << "the slicer intersects " << polylines.size() << " polylines" << std::endl;
//for each polyline computed by this face of the cutmesh
BOOST_FOREACH(Polyline_type polyline,polylines)
{
std::cout << "Polyline : " << polyline.size() << " points"<< std::endl;
BOOST_FOREACH(Point point, polyline)
{
std::cout << "Point : " << point << std::endl;
}
}
std::cout << std::endl;
polylines.clear();
}
Спасибо за вашу помощь.
Ответ на пост был предложен sloriot :
Попробуйте использовать недокументированную функцию clip (), расположенную в Polygon_mesh_processing / include / CGAL / Polygon_mesh_processing /internal/clip.h
Других решений пока нет …