我正在使用CGAL
库编写一些代码来处理几何图形。
我有一个Polyhedron object,并使用它根据[文档] [2]中的代码创建一个网状域。
使用CGAL::make_mesh_3()
方法,我创建了我的网格物体,它是此[type] [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
但是,如果我尝试像圆环这样的对象,则该圆环不起作用,并且我发现圆环中的孔位于网格内部(结果是圆环中的点为“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
关于c++ - CGAL-在多面体中查找点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34804416/