用等半径的圆覆盖任意区域

时间:2009-09-10 12:19:08

标签: geometry

算法如何工作覆盖半径相等的圆的任意区域?

圆的半径和区域的大小和形状是任意给出的。该区域应尽可能少地覆盖。圆圈可能重叠。

是否有可以处理此问题的算法?

4 个答案:

答案 0 :(得分:8)

希望我理解你的问题......

可以证明球体的六边形密堆积(HCP)使用球体覆盖最大体积。因此,我假设用圆圈做HCP也会用圆圈覆盖最大区域。使用三角形对您的区域进行细分,并在三角形的每个顶点放置一个圆心,其中心半径为三角形边长的一半。有关我正在讨论的算法的图像,请参阅this

注意:这类似于close packing of atoms in a unit cell

编辑:我之前的方法涵盖了尽可能多的区域,没有重叠。如果允许重叠,那么(我相信)以下方法将覆盖整个区域,并且重叠最小。

正如您可能知道的那样,只有3个带有正多边形的2D空间镶嵌 - 使用正方形,三角形或六边形。策略是使用这些多边形中的一个进行镶嵌,然后将圆圈限定为每个多边形。使用这种方法六边形会浪费最小面积。

因此,从给定圆的半径计算所需六边形的大小,使用六边形对该区域进行细分,然后在每个六边形上划一个圆。

NB: Eric Bainville提出了类似的方法。

-- Flaviu Cipcigan

答案 1 :(得分:2)

我知道这个问题可能有点过时,但最近我遇到了类似的问题,用六角网格覆盖相同圆圈的地理区域,这就是我解决它的方法:

  1. 我的输入数据是以米为单位的圆的半径和区域边界的坐标
  2. 首先我找到了覆盖给定区域的边界矩形
  3. 然后从左下角开始我将点移动距离等于用于构建六边形的三角形的高度的两倍(其边与我的圆的半径相同)并使用Vincenty的公式承载0度
  4. 对于我发现的每个点,我检查它是否与我的输入区域相交,如果我保存它,我跳过它的其他方式
  5. 当我到达边缘时,我再做一次检查以确保我将获得所有点
  6. 我通过承受60度移动点,检查它,然后再移动120度,再次检查
  7. 回到第3步,但现在我用180度的方式移动点
  8. 再次检查边缘,然后再检查,然后在步骤6中,但首先是120度,然后是60度
  9. 继续,直到你到达矩形的上边缘
  10. diagram of algorithm 与给定图像一样,当然可以通过减小圆的半径来提高精度

    我知道这不是最好的选择,但对我来说效果很好。

    我希望这是可以理解的,并会帮助任何人。

答案 2 :(得分:0)

在不了解您的约束的情况下,我建议定期覆盖飞机,磁盘对应于六边形拼接的正六边形。然后保持所有圆盘与形状相交。

答案 3 :(得分:0)

我知道问题正在寻找一种算法,但是我也遇到了类似的问题,想用圈子来掩盖美国,因此我很快就找到了使用this free online tool的解决方案。因此,我谦虚地建议,如果面积和半径不变,则可以在3分钟内将其视线。显然,这个答案不能一概而论,但通常问题也不是。