关闭。减去从表面啮合(CGAL?)(Substract closed mesh from surfa

2019-10-29 22:05发布

我有以下问题,请与下面的图片最好的描述。

我在3D表面上,所以它可以具有垂直重叠和是一个非封闭网格。 我有我想从中减去的对象。 绿色+黄色区域是原始表面,红色线勾勒出一个球(如三角网格,而不是原始的)。 黄色区域是表面的相交需要被从原件表面除去球体的部分。 绿色区域是减法的结果:所需要的表面。

我已经使用了CGAL库,但还是新的,所以使用CGAL的解决方案将是最优先。 但是,如果某人有没有CGAL的解决方案将受到欢迎,以及。

我能看到的最好的办法是给表面轻微的厚度(保持当前面的底部)。 然后使用Nef_polyhedron_3来的。减去其他物体,然后将转换为Polyhedron_3只有不停的底面。 但是,这似乎是一个黑客攻击的一位。


编辑:使用建议的解决方案我挨得很近,但我无法使用反转法线的建议,使用下面的代码夹到正确的一边。 我也想看看,如果脸的顶点顺序(顺时针/逆时针)有任何影响,但似乎没有什么。

typedef CGAL::Simple_cartesian<double>                  SC;
typedef CGAL::Surface_mesh<SC::Point_3>                 SurfaceMesh;
typedef SurfaceMesh::Property_map<SM_fid, SC::Vector_3> SM_fnormals;
typedef SurfaceMesh::Vertex_index                       SM_vid;
typedef SurfaceMesh::Face_index                         SM_fid;

namespace PMP = CGAL::Polygon_mesh_processing;
namespace params = PMP::parameters;

void clip(SurfaceMesh P&, SurfaceMesh& Q) {        
    SM_fnormals fnormals = CGALobstacle->add_property_map<SM_fid, SC::Vector_3>
        ("f:normals", CGAL::NULL_VECTOR).first;

    PMP::compute_face_normals(Q, fnormals);

    PMP::clip(P, Q, false, params::all_default(), params::face_normal_map(fnormals));
}

Answer 1:

有从CGAL 4.10在开始一个未记录的功能Polygon_mesh_processing/include/CGAL/Polygon_mesh_processing/internal/clip.h 。 函数签名是:

/// requires face_index_map, vertex_index_map for np_tm
/// requires face_index_map for np_c
/// if edge_is_constrained_map is not provided in np_tm a default one is
/// provided using boost::unordered_set<edge_descriptor>
template <class TriangleMesh,
          class NamedParameters1,
          class NamedParameters2>
bool
clip(      TriangleMesh& tm,
 /*const*/ TriangleMesh& clipper,
           bool close,
     const NamedParameters1& np_tm,
     const NamedParameters2& np_c)

第二个参数是你的领域和你的第一个面。 第三表明,如果你想输出表面被关闭(在你的情况下,这样假)。 需要注意的是该功能裁剪,所以如果你想你需要扭转你的球(向内法线)的方向领域以外的部分。

有一个使用例子在这里 。

我建议使用Surface_mesh而非Polyhedron_3

注意,该函数未记录和标题可能会在即将推出的版本中消失(如果这样做就意味着它得到了正式记录)。

编辑 :既然CGAL 4.13正式记录功能是在这里 。



文章来源: Substract closed mesh from surface (CGAL?)