如何用平面或边界框切割多面体?

时间:2019-09-09 03:02:56

标签: cgal

在多面体中,如何获得与给定平面相交的任何边缘的手柄(目的是我可以用CGAL::polyhedron_cut_plane_3进一步切割它)?

我当前有此代码段,但它不起作用。我是根据CGAL文档和示例中的片段构建的:

typedef CGAL::Simple_cartesian<double> Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron;
typedef CGAL::AABB_face_graph_triangle_primitive<Polyhedron> Primitive;
typedef CGAL::AABB_traits<Kernel, Primitive> Traits;

Polyhedron poly = load_obj(argv[1]); // load from file using a helper
Kernel::Plane_3 plane(1, 0, 0, 0);   // I am certain this plane intersects the given mesh

CGAL::AABB_tree<Traits> tree(faces(poly).first, faces(poly).second, poly);
auto intersection = tree.any_intersection(plane);
if (intersection) {
  if (boost::get<Kernel::Segment_3>(&(intersection->first))) {
    // SHOULD enter here and I can do things with intersection->second
  } else {
    // BUT it enters here
  }
} else {
  std::cout << "No intersection." << std::endl;
}

在2019年9月9日编辑:

我将此标题从原来的旧标题更改为:如何获取在平面-多面体相交处找到的某些边缘的手柄。使用CGAL/Polygon_mesh_processing/clip.h中提供的方法,无需使用ABBB_Tree查找交点。

  • 要用一个平面剪辑,一行就足够了:CGAL::Polygon_mesh_processing::clip(poly, plane);
  • 如@sloriot所建议,要在某个边界框内进行剪辑,有一个内部函数CGAL::Polygon_mesh_processing::internal::clip_to_bbox。这是an example

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用文件clip_to_bbox()中未公开功能的函数CGAL/Polygon_mesh_processing/clip.h将平面变成裁剪bbox并调用函数corefine()来嵌入平面相交到您的网格中。如果要获取相交边,请在指定参数中将边约束图传递到corefine()