【发布时间】:2016-01-15 04:27:55
【问题描述】:
我正在使用CGAL 库编写一些代码来处理几何问题。
我有一个Polyhedron object,并使用它创建了一个网格域,遵循 [文档][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。
只要多面体不是复杂对象,它就可以工作。对于简单的对象(例如圆锥体、球体等),我会得到一个漂亮的输出,例如:
但是如果我尝试像圆环这样的对象,它就不起作用,并且我在 if 语句中发现圆环中的孔位于网格内部(因此,圆环内的点给出“真”)我贴了。但他们不应该。我尝试过其他语句来过滤它,例如:
if ( lt == Tr::INSIDE_CONVEX_HULL && !tr.is_infinite(ch)) {
return true;
}
但结果是一样的。如果对象有孔或多面体不等于CONVEX_HULL,我不明白我在做什么。稍微想一想,CONVEX_HULL 在最好的情况下就是我得到的。
那么我如何确定一个点 (x,y,z) 是在多面体内部还是在网格内部?
有没有办法得到这个?
【问题讨论】:
-
或许你可以将多面体分解成凸块,然后进行分段测试?
-
mmmm 是为了避免“洞”的事情吗?可以说将我的圆环分成两半并对每个部分进行测试?可能是......任何其他想法,这可能更普遍?