我有一种情况,如下图所示,这需要我找出一个区域内最大的圆圈(开放空间)。在下面的例子中,黑色圆圈是固定的已知位置,我需要找到不触及黑色圆圈的最大区域(由橙色和绿色圆圈表示)。在下面的示例中,橙色圆圈是最大的开放空间,这是我想要计算的区域。
我可以强行它,选择一个位置并展开一个圆圈,直到它碰到一个黑点,然后只记录圆圈的位置和半径(开放空间)但是这将大大低效地迭代所有可能的位置。
是否有一种有效的方法来分析此实例中最大的开放空间?请注意,此字段上的最大黑点数将为15,但可能会低很多。
编辑感谢Yves和所有其他评论者。根据答案和其他评论做出的一些澄清。黑盒子是绑定的,因此定义的任何区域必须在黑盒子内。黑色圆圈的半径是已知的并且是静态的,但是出于这些目的,它们可以减少到点。最后,圆的近似是可以接受的。它将用于AI例程中,该例程在确定哪个区域最佳时具有误差范围。因此,如果圆圈在半径或位置略微偏离,那么它将不是一个大问题。
我目前正在研究Voronoi方法,我认为我理解它,但现在尝试拉出适合的算法就是问题!我会测试并回复你。
编辑2 :感谢Yves,我查看了Voronoi图,并使用了一种简单的方法循环遍历所有Voronoi顶点(以及它穿过边界框的点)并找到了最大的圆圈中心点不包含任何"黑圈"。使用相对较小的有限点集,我很满意这个实现。请参阅下面的结果,在空白处显示前3个空心圈。
答案 0 :(得分:8)
这被称为“最大的空心圆”问题。它可以通过Voronoi图有效地解决。
如果黑色圆圈的直径有限,您可以将它们缩小到中心,然后从找到的解决方案中推导出半径。
无论如何,如果允许圆圈对抗矩形,则需要修改算法以解决此问题。这是一项非常重要的任务。
<强>更新强>:
相关问题在“TOUSSAINT,Godfried T.计算最大的空圈子,位置有限。国际计算机与信息科学杂志,1983,12.5:347-358”和“CHEW,L。Paul; DRYSDALE, Scot。找到位置有限的最大空心圈。1986年。“当中心被约束在给定的凸多边形内时,它描述了一种有效的解决方案。 (但你要求我完全控制圆圈。)
数字域中可能采用完全不同的方法(处理离散图像,有限大小的像素):您可以计算欧几里德距离映射到黑色像素。有一种非常智能的高效算法可以在线性时间内实现(图像大小,而不是障碍物的数量);参见“A. Meijster,J。B. T. M. Roerdink和W. H. Hesselink,计算线性时间距离变换的通用算法”。
计算出距离贴图后,所需圆的中心是距离值最大的像素。这种方法适用于任何形状的障碍物。
<强>更新强>:
在您的情况下,由于障碍物的数量很少,因此可以接受详尽的搜索。您需要尝试通过3个点的圆圈,经过2个点并与边缘相切,或者通过1个点并切线到2个边缘。
对于所有这些圈子,请检查它们是否包含其他点并保持最大值。原则上,这需要时间O(N ^ 4)。显然,这种复杂性可以降低到O(N³),但我在这个问题上找到的每个条目都描述了基于Voronoi的方法而不是详尽的方法。