【问题标题】:Determine if a point is interior or exterior to a 3D Alpha-shapes surface in CGAL确定一个点是在 CGAL 中的 3D Alpha 形状表面的内部还是外部
【发布时间】:2014-09-05 23:14:04
【问题描述】:

我正在使用 CGAL 使用ex_alpha_shapes_3 example 创建一组 3D 点的凹壳。接下来,我想知道空间中的点查询是否位于由三角形凹壳面(ex_alpha_shapes_3 代码的输出)创建的曲面内。 “多边形中的点”技术应该对此有用。如果有人能帮我解决这个问题,我将不胜感激。

【问题讨论】:

  • 我对CGAL不是很熟悉,所以我不知道在那里实现光线追踪和光线碰撞算法会有多容易。如果这很难,并且性能并不重要,那么如果一个点在 alpha 形状内,那么原始点集的 alpha 形状 + 查询点应该与原始 alpha 形状相同,您可以检查这种“平等”。
  • 感谢您的回复。实际上,性能非常关键,因为我需要在每个时间步重复此过程,并且我的数据集中可能有相当多的点(数十万或更多)。

标签: c++ cgal point-in-polygon concave-hull


【解决方案1】:

我不了解 CGAL,但鉴于您的多面体是凸面的,您可以使用一些启发式方法。您可以在本质上是 2D 中完成很多工作。您可以使用任何轴,但假设我们在 XY 平面上工作并暂时忽略 Z 分量。由于您的形状是凸形的,因此通常只有两个三角形的 XY 坐标围绕您的点的 XY 坐标。对于任何三角形,您可以快速确定是否 x[min]

【讨论】:

  • 对于凸包来说,这似乎是一种有趣的方法,谢谢。但是,在我的情况下,我有一个凹形外壳,它可能包括一个以上的体积(空间中未连接的部分)或两个以上的 XY 围绕查询点的三角形。我猜这个算法在这种情况下是行不通的。
  • 我的错,我在原始问题中将“凹”误读为“凸”。然而,基本逻辑仍然适用,尽管它更复杂。您必须在 2D 中找到所有周围的三角形。然后,如果在 Z 轴上您的点上方或下方的这些三角形的数量是奇数,则该点位于其中一个体积内,特别是包含 Z 值在任一方向上最接近测试点的三角形的体积.
【解决方案2】:

您可以使用locate 函数,根据点所在的单纯形以及单纯形的函数classify 的输出,您将直接知道您是在内部、外部还是在边界上。

  • 无论哪种单纯形,EXTERIOR 是外部,INTERIOR 是内部。
  • 如果点落在边上,则 REGULAR 位于边界上,而 SINGULAR 取决于您的设置中是否应使用孤立边
  • 如果点落在顶点上,则 REGULAR 位于边界上,SINGULAR 取决于您的设置中是否应有隔离输入点

【讨论】:

  • 感谢您的有用回答。目前,我只使用“Alpha_shapes_3”来构建凹面。这是否意味着我需要首先在整个体积内(被凹面覆盖)生成一个三角形网格,才能使用“Trainangulation_3”中的“定位”功能?我是一个新的 CGAL 用户,有基本的 C++ 经验,所以这让我有点困惑。
  • Alpha_shape_3 继承自 Triangulation_3。
  • 我尝试通过在代码中添加以下行来使用定位功能,但编译时出现错误。
  • typedef CGAL::Alpha_shape_3<Triangulation_3> Alpha_shape_3;typedef Alpha_shape_3::Cell_handle Cell_handle;typedef Alpha_shape_3::Locate_type Locate_type;Point query_point(1.0,1.0,1.0);int li, lj;Locate_type lt;Cell_handle ch = Alpha_shape_3::locate(query_point, lt, li, lj);assert( lt == OUTSIDE_AFFINE_HULL );
  • Alpha_shape_3::OUTSIDE_AFFINE_HULL
猜你喜欢
  • 2012-11-26
  • 2011-02-09
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
相关资源
最近更新 更多