【问题标题】:Finding Whether A Point Is In The Convex Hull Generated By A Set Of Points查找一个点是否在由一组点生成的凸包中
【发布时间】:2016-12-21 06:07:22
【问题描述】:

我需要从一组点计算凸包。

点的尺寸通常为10~30D

集合的大小很小,通常是2~10

而我需要的任务是判断一个点是否在点集构造的凸包内。

有哪些算法可以执行此操作,或者我可以使用任何现有的库?

【问题讨论】:

  • 你不需要构造凸包来查看一个点是否在它里面。只需解决一个线性规划问题,看看是否可以通过对一组点进行线性组合来产生该点,所有系数都在 [0,1] 范围内
  • 虽然在二维中,凸包可以表示为一个多边形,并且一些 algorithms 以它而闻名,但我不清楚如何在合适的数据结构中表示凸包以获得更高方面;请澄清所需的表示。
  • mcdowella 是对的,在您的情况下,您希望避免计算完整的凸包(时间复杂度随 D 呈指数增长)。如果由于其他原因需要构建凸包,可以使用CGAL
  • @mcdowella 系数之和必须为 1。

标签: c++ algorithm computational-geometry


【解决方案1】:

注意:这个算法的原始草图,它需要修改。它可能会输出错误的结果(见下面的cmets)

以下是您的问题的多种可能解决方案之一。

让 D - 你的空间维度,N - 你的点数。您可以使用以下算法:

您应该为空间的每个坐标平面计算投影凸包。你会得到 D 个凸包。这一步的复杂度是D * N * log N

然后你应该测试你点的每个投影是否位于每个适当的凸包内。这一步的复杂度是D * N(使用原生算法)

总体执行复杂度 = D * N * Log N。

注意:该算法的基本思想是通过以下点的位置测试来归结计算平面上的凸包。

附:当然,您可以得到一些退化的情况,其中凸包可以是线段或只是点。但是这些情况可以轻松处理

附言该算法只允许检查点是在凸包内还是在其边界上

【讨论】:

  • 标题确实询问了计算凸包,但它具有误导性 - 问题澄清了只有包含/排除是必要的。这可以在不计算凸包本身的情况下完成。
  • 我同意你的看法。但这将取决于他解决问题的方法。当然,作者可能不会计算凸包来解决这个任务(使用线性规划如上例)。但我认为我的算法很容易实现。注意:它不涉及计算多维凸包。它使用辅助投影来测试点的位置。
  • 请不要误会我的意思——我并没有批评你的好答案。由于您撰写答案时的标题具有误导性,因此我想添加评论(可能是给未来的读者)。在这里,投赞成票。
  • 然后呢?这个任务归结为检查点是否位于线段边界上。我认为这种退化的情况很容易治疗。
  • @АлександрЛысенко 不,该点远离船体边界。
猜你喜欢
  • 2011-06-21
  • 2014-12-12
  • 1970-01-01
  • 2021-10-23
  • 2023-03-31
  • 2013-05-20
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多