C++ CGAL切片器:如何执行网格切割?

C++ CGAL切片器:如何执行网格切割?,c++,cgal,clip,C++,Cgal,Clip,我想使用CGAL执行以下操作: 与曲面网格相交;切割网格;使用另一个曲面网格;切割的网格;将切割的网格划分为两个不同的网格 为此,我使用提供一组多段线的。不幸的是,切片器不提供每个多段线所属的切割网格的哪个面的信息。此外,它还有效地执行了切片器操作。 如何检索此信息 我需要这些信息来沿多段线细分切割的网格,然后在两个单独的网格中进行分割 在我的上下文中,剪切网格是曲面网格,如下所示: 以下是切割网格+切割网格: 在我的代码中,我从切割网格的每个面生成一个平面,并对切割网格执行切片操作 这是我

我想使用CGAL执行以下操作: 与曲面网格相交;切割网格;使用另一个曲面网格;切割的网格;将切割的网格划分为两个不同的网格

为此,我使用提供一组多段线的。不幸的是,切片器不提供每个多段线所属的切割网格的哪个面的信息。此外,它还有效地执行了切片器操作。 如何检索此信息

我需要这些信息来沿多段线细分切割的网格,然后在两个单独的网格中进行分割

在我的上下文中,剪切网格是曲面网格,如下所示:

以下是切割网格+切割网格:

在我的代码中,我从切割网格的每个面生成一个平面,并对切割网格执行切片操作

这是我的密码:

    //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();
    }
//导入文件并实例化网格
const char*filename1=“test.off”;
const char*filename2=“cutMesh2.off”;
std::ifstream输入(filename1);
网格切割网格,切割网格;
如果(!输入| |!(输入>>切割网格))
{
标准:cerr cutMesh)
{

这个职位的答案是由斯洛里奥提出的:

尝试使用位于Polygon\u mesh\u processing/include/CGAL/Polygon\u mesh\u processing中的非文档化clip()函数‌​/内部/clip.h


尝试使用位于
Polygon\u mesh\u processing/include/CGAL/Polygon\u mesh\u processing/internal/clip.h
Hi@slorio中的非文档化
clip()
函数,谢谢您的回答。显然,clip()是函数未按预期工作。我正在尝试执行此剪切:,但我得到以下结果:。正如您所看到的,灯笼的顶部消失了…以下是我使用的文件:只需反转平面裁剪器的方向以保留另一部分。是的,这是我获取灯笼底部的方法。但是在处理顶部时(请参阅之前发送的屏幕截图),我正在丢失不应该消失的对象的一部分:,。感谢您的帮助抱歉我回来晚了。我猜您使用了将网格作为裁剪器的重载。如果所有连接的组件都不与该网格相交,则该裁剪器网格应关闭。如果在中使用平面重载相反,你应该得到预期的结果。