CGAL - 在多面体内找到点

时间:2016-01-15 04:27:56

标签: c++ geometry cgal

我使用CGAL库在某些代码中处理几何内容。

我有Polyhedron object并使用它我按照[文档] [2]中的代码创建了一个网状域。

使用方法CGAL::make_mesh_3(),我创建了我的网格,这是[类型]的对象[3]

接下来我需要一个普通的3d数组,它将代表网格所在的空间。我需要在数组(i,j,k)中逐点进行,并确定具有这些坐标的点(在i,j,k之后被转换为正确的单位)是否在多面体定义的域内。

所以我所做的就是使用对象locate中的方法Triangulation [4]来找到该点的位置。此方法返回Cell_Handle [5]和Locate_type(从中可以知道点的位置)

三角测量类还有其他方法,如is_cell()is_infinite() ......

重点是,如果我设置我的查询以知道该点是否在多面体内部,如下所示:

if( tr.is_cell(ch)  && !tr.is_infinite(ch) ) {
    return true;
  }else {
    return false;
  }

ch是查询Cell_handle返回的locate

只要多面体不是一个复杂的对象,它就可以工作。对于简单的对象(例如锥形,球形等),我得到一个漂亮的输出,如:

Cone

但是如果我尝试一个像圆环这样的物体,它就不起作用了,我得到了圆环内的洞在网格内部(环面内的点给出了#34;真的"作为一个结果),在我粘贴的if语句中。但他们不应该。我已尝试过其他语句来过滤它,如:

if ( lt == Tr::INSIDE_CONVEX_HULL && !tr.is_infinite(ch)) {
    return true;
  }

但结果是一样的。如果物体有洞或多面体不等于CONVEX_HULL,我就不会得到什么。稍微思考一点,CONVEX_HULL在最好的情况下是我得到的。

那么如何确定点(x,y,z)是位于多面体内还是位于网格内?

有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

如果您已将点定位在网格内,则您有一个包含该点的单元格句柄。您可以使用C3T3 is_in_complex(Cell_handle)的成员函数来了解此单元格是在域内还是域外。

请注意,如果您想直接使用多面体,可以使用仿函数Side_of_triangle_mesh