确定一个点是否可以包含在没有相邻点的圆内的方法

计算科学 算法 计算几何
2021-11-26 19:18:10

我一直在研究一个特别具有挑战性的问题,并希望得到一些指导。这是我的问题。我有一个包含数百万个点的点云。对于集合中的每个点,我需要确定是否存在可以围绕该点绘制的半径为r的封闭圆(该点可以位于圆内的任何位置)但也不包含任何相邻点。这是一个有助于说明我的场景的图表。

在此处输入图像描述

上图中的蓝点是兴趣点。红点都位于兴趣点的2r半径内(超出此距离的任何相邻点都不会影响结果)。在这种情况下,可以绘制一个包含兴趣点且不包含其他点的r半径圆。事实上,这样的候选圈子显然有很多。我对获得所有候选人不感兴趣,而只是想知道这种情况是否发生。

也许有一种明显的方式来执行我忽略的这种分析。我曾考虑过使用 Delaunay 三角剖分(兴趣点是否位于三角形面内?)但由于指定的圆大小,我不相信这种方法会起作用。我知道,如果有两个或更少的邻居,那么总是可以拟合一个符合要求的圆。我也知道,如果邻居的凸包没有包围兴趣点,我的条件就满足了。但是这些东西都不能帮助我解决一般的解决方案。有谁知道可以用来完成这项任务的方法或算法?

2个回答

让圆以你的蓝点为中心,半径r记为Cr和半径2r(图中的实心圆圈)为C2r. 对于每个红点piC2r构造一个半径圆rpi并称之为Ci. 任何以Ci包含pi因此无效。任何以Cr可能是有效的。因此,您需要找到一个在内部的点Cr但除此之外Ci. 你的解决方案是CrCi. 当然,找到这些点说起来容易做起来难。

可以使用此 mathoverflow question中讨论的广义 voronoi 图找到圆的并集。尽管您不需要整个空间,这对于您的问题来说可能有点过分,只需要一个点。

我认为你需要的算法是这样的:

  1. 构建红点的 voronoi 图。
  2. 找到交点Cr(以蓝点为中心的圆,半径为r) 与 voronoi 图的所有边
  3. 检查内部voronoi图每个顶点的距离Cr以及在步骤 2 中构建的点。到该点与其区域相邻的红点之一。如果至少是r,那么你是

通过构造,它们都在r的蓝点。voronoi 图区域周围的顶点尽可能从构建图的点获得。例如,如果一个顶点位于 3 个区域的边界,根据定义,它必须与用于构建图的这三个区域的所有 3 个红点等距。因此,您只需要检查它与其中 1 个的距离。

作为一个例子,我从维基百科关于Voronoi 图的文章中获取了图像并对其进行了编辑。

在此处输入图像描述

红色和蓝色点与您的图表中的相同。黄色圆圈是一个半径圆r以蓝点为中心。您需要做的就是检查每个青色点到相邻区域中单个红点的距离。如果无法以其中一个青色点为中心放置圆,则无法放置符合您要求的圆。

我认为这不是最佳选择,但这不适合评论。围绕一个点的最大封闭圆必须通过至少三个其他点,否则它可能会被放大或在某些方向上是无限的。因此,对于给定的点,可以查看“附近”点的所有三元组(例如,在 Delaunay 三角剖分图中的几跳内)并检查通过该三元组的唯一圆是否具有半径r并包含一个且只有一个点。那么那个封闭的点满足条件。

鉴于封闭圆的中心不一定是它所包围的点,我认为 Delaunay 图不会轻易产生要检查的最佳三元组集。所以检查很多附近的点可能是一个开始。

问题在于,如何选择“附近的”三元组以使结果最优,所以这可能只是一个近似值才有意义。准确性可能取决于点的均匀分布程度。