【问题标题】:CGAL Slicer : How to perform a mesh cut?CGAL Slicer:如何进行网格切割?
【发布时间】:2018-01-09 22:23:52
【问题描述】:

我想使用 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();
    }

感谢您的帮助。

【问题讨论】:

  • 尝试使用位于Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/clip.h 的未记录的clip() 函数
  • 嗨@sloriot,谢谢你的回答。显然,clip() 函数没有按预期工作。我正在尝试执行此切割:link,但我得到了这个结果:link。如您所见,灯笼的顶部消失了...这是我使用的文件:link
  • 只需反转平面剪的方向以保留另一部分。
  • 是的,我这样做是为了得到灯笼的底部。但是在处理顶部时(参见之前发送的屏幕截图),我丢失了不应消失的对象的一部分:Part disappearing (red drawing)Expected cut actionResult after clip()。谢谢你的帮助
  • 对不起,我回来晚了。我的猜测是您使用了将网格作为剪裁器的重载。如果所有连接的组件都未与该网格相交,则该裁剪器网格预计将关闭。如果你改用平面重载,你应该得到预期的结果。

标签: c++ cgal clip


【解决方案1】:

sloriot 提出了帖子的答案:

尝试使用 Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing‌​/internal/clip.h 中未记录的 clip() 函数

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 2012-09-09
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多