我使用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
。
只要多面体不是一个复杂的对象,它就可以工作。对于简单的对象(例如锥形,球形等),我得到一个漂亮的输出,如:
但是如果我尝试一个像圆环这样的物体,它就不起作用了,我得到了圆环内的洞在网格内部(环面内的点给出了#34;真的"作为一个结果),在我粘贴的if语句中。但他们不应该。我已尝试过其他语句来过滤它,如:
if ( lt == Tr::INSIDE_CONVEX_HULL && !tr.is_infinite(ch)) {
return true;
}
但结果是一样的。如果物体有洞或多面体不等于CONVEX_HULL
,我就不会得到什么。稍微思考一点,CONVEX_HULL
在最好的情况下是我得到的。
那么如何确定点(x,y,z)是位于多面体内还是位于网格内?
有办法解决这个问题吗?
答案 0 :(得分:1)
如果您已将点定位在网格内,则您有一个包含该点的单元格句柄。您可以使用C3T3 is_in_complex(Cell_handle)的成员函数来了解此单元格是在域内还是域外。
请注意,如果您想直接使用多面体,可以使用仿函数Side_of_triangle_mesh