【问题标题】:CGAL - find points inside polyhedronCGAL - 在多面体中找到点
【发布时间】: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

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

Cone

但是如果我尝试像圆环这样的对象,它就不起作用,并且我在 if 语句中发现圆环中的孔位于网格内部(因此,圆环内的点给出“真”)我贴了。但他们不应该。我尝试过其他语句来过滤它,例如:

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

但结果是一样的。如果对象有孔或多面体不等于CONVEX_HULL,我不明白我在做什么。稍微想一想,CONVEX_HULL 在最好的情况下就是我得到的。

那么我如何确定一个点 (x,y,z) 是在多面体内部还是在网格内部?

有没有办法得到这个?

【问题讨论】:

  • 或许你可以将多面体分解成凸块,然后进行分段测试?
  • mmmm 是为了避免“洞”的事情吗?可以说将我的圆环分成两半并对每个部分进行测试?可能是......任何其他想法,这可能更普遍?

标签: c++ geometry cgal


【解决方案1】:

如果您已将点定位在网格内,那么您将拥有一个包含该点的单元句柄。可以通过C3T3的成员函数is_in_complex(Cell_handle)知道这个cell是在域内还是域外。

注意,如果你想直接在多面体上工作,你可以使用函子Side_of_triangle_mesh

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2017-10-27
    • 2014-06-28
    • 1970-01-01
    相关资源
    最近更新 更多