如何找到位于采样边界内的最大圆?

时间:2011-09-08 13:26:26

标签: algorithm 2d computational-geometry

给定一组2D点作为不规则形状的边界,一个可能不是凸面并且可能有内部孔的形状,是否有算法找到适合边界的最大圆?

我已经做了很多搜索,我确实找到了接近的算法,例如最大的空圆问题,但到目前为止我找不到的算法与我的约束相符。

3 个答案:

答案 0 :(得分:2)

一个非常愚蠢的算法:) (可能更快的事情)

最大的圆圈应该至少触及3个物体(物体是顶点或线)。

因此,您可以计算所有组合O(n ^ 3),为每个组合构建一个圆,检查它是否位于区域内(O(n))并选择最大的一个。总计 - O(n ^ 4)。

答案 1 :(得分:2)

由于点集不绑定任何区域,因此问题定义不明确。你提到的边界应该是一些曲线,可能是多边形。没有它你就不能说有内部空洞,也不能要求圆圈在边界内。使用此定义,您可以在“外部”创建任何大小的圆圈,触及几个设定点。

如果使用多边形指定边界,Aioobe的链接是好的。如果重新定义问题以找到触及给定集合的至少3个点的最大半径圆,则与检查Dalaunay triangulation的外接圆相同。

答案 2 :(得分:2)

<强>动机。 首先对形状进行采样的点给出的形状让我想起了alpha shapes的概念及其与持久拓扑的关系。有关相关图片,请参阅这些slides

无论如何,alpha形状与点Voronoi diagram有密切关系,这是Delaunay triangulation的双重(作为平面图)。

<强>解。 我建议考虑所有Voronoi节点并将具有最大间隙半径的节点(到其定义点的距离)作为您寻找的点:

Voronoi diagram of points

在Delaunay三角剖分的双重设置中,该节点对应于具有最大外接圆的Delaunay三角形。

此解决方案也受到计算几何中最大内切圆问题的推动。

另一种看待它的方法是Voronoi图的草火解释:考虑从每个输入点开始的草火。火以单位速度在每个方向上生长。中间的红点是凸壳内最新的点。

分析&amp;实施 算法的时间复杂度是Voronoi图的O(n log n),O(n)找到具有最大间隙的Voronoi节点。典型的实现是qhull。在boost中似乎有一个C ++实现可以帮助您。但任何Delaunay三角测量代码也都可以。

可能出现的问题。 如果形状类似于拥有大口袋的欧米茄字母,则具有最大间隙的Voronoi节点在欧米茄形状“外部”。因此,人们需要更好地掌握采样形状的“内部”和“外部”的概念。在这里,最初提到的α形状可能有所帮助,c.f。由Edelsbrunner发明的survey,他发明了阿尔法形状。