我正在使用CGAL
库处理一些代码来做几何的东西。
有一个多面体对象,使用它我按照 [文档][2] 中的代码创建了一个网格域。
使用方法CGAL::make_mesh_3()
,我创建了我的网格,它是这个[类型][3]的对象
接下来,我需要一个普通的 3D 数组来表示网格所在的空间。我需要在数组 (i,j,k) 中逐点浏览,并确定具有这些坐标的点(在 i,j,k 转换为正确的单位之后)是否在多面体定义的域内。
所以我要做的是使用对象Triangulation
中locate
[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
是查询locate
返回的Cell_handle
。
只要多面体不是一个复杂的对象,它就可以工作。对于简单的对象(例如圆锥体、球体等),我得到一个漂亮的输出,如下所示:
球果
但是如果我尝试像圆环这样的对象,它不起作用,我得到圆环上的孔在网格内部(结果圆环内的点给出"true"),在我粘贴的 if 语句中。但他们不应该是。 我尝试了其他语句来过滤它,例如:
if ( lt == Tr::INSIDE_CONVEX_HULL && !tr.is_infinite(ch)) {
return true;
}
但结果是一样的。如果物体有孔或多面体不等于CONVEX_HULL
,我就不明白我是什么。稍微想一想,在最好的情况下,CONVEX_HULL
是我得到的。
那么如何确定点 (x,y,z) 是位于多面体内部还是网格内部呢?
有没有办法得到这个?
如果已将点定位在网格内,则具有包含该点的单元格控点。您可以使用 C3T3 is_in_complex(Cell_handle) 的成员函数来了解此单元格是在域内部还是外部。
请注意,如果要直接在多面体上工作,可以使用函子Side_of_triangle_mesh