【问题标题】:Covering an arbitrary area with circles of equal radius用等半径的圆覆盖任意区域
【发布时间】:2010-11-27 03:47:02
【问题描述】:

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

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

有没有算法可以处理这个问题?

【问题讨论】:

  • 圆圈不会镶嵌,因此如果没有重叠,您将无法完美地做到这一点。你能澄清你的问题吗?
  • 编辑了我的答案以包含一个覆盖整个区域的方法。 :-)
  • “用尽可能少的圈子覆盖”有多重要?如果使用绝对最小圆圈数不是很重要,那么像 Eric Bainville 的技术可以在许多情况下产生良好的结果。
  • 圆圈的大小必须相同吗?圆圈可以与形状的边缘重叠吗?
  • 圆圈大小必须相同。它们可能与形状的边缘重叠。

标签: geometry


【解决方案1】:

在不了解您的限制条件的情况下,我建议对平面进行常规覆盖,其圆盘对应于六边形瓷砖的正六边形。然后保持所有圆盘与形状相交。

【讨论】:

    【解决方案2】:

    希望我能正确理解你的问题...

    可以证明,球体的六边形密堆积(HCP)覆盖了最大的体积,使用球体。因此,我假设用圆圈做 HCP 也会覆盖使用圆圈的最大区域。用三角形镶嵌您的区域,并在三角形的每个顶点放置一个圆心,半径为三角形边长的一半。请参阅 this 以获取我正在谈论的算法的图像。

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

    编辑:我以前的方法尽可能多地覆盖该区域,而不会重叠。如果允许重叠,那么(我相信)以下方法将以最小的重叠覆盖整个区域。

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

    因此,根据给定圆的半径,计算所需六边形的大小,使用六边形细分区域,然后在每个六边形上外接一个圆。

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

    -- Flaviu Cipcigan

    【讨论】:

    • 这种技术不起作用,因为它没有覆盖整个区域。
    【解决方案3】:

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

    1. 我的输入数据是以米为单位的圆半径和区域边界坐标
    2. 首先我找到了覆盖给定区域的边界矩形
    3. 然后从左下角开始,我将点移动距离等于用于构建六边形的三角形高度的两倍(它的边与我的圆的半径相同)和使用文森蒂公式的 0 度方位
    4. 对于我找到的每个点,我检查它是否与我的输入区域相交,是否保存它,否则我跳过它
    5. 当我到达边缘时,我会再次检查以确保我将获得区域内的所有分数
    6. 我将点移动 60 度,检查它,然后移动 120 度,再次检查
    7. 回到第 3 步,但现在我通过 180 度方位角移动点
    8. 边缘再次检查,然后像第 6 步一样,但先是 120 度,然后是 60 度
    9. 继续直到到达矩形的上边缘

    就像在给定的图像中一样,您当然可以通过减小圆的半径来提高精度

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

    我希望它很容易理解并且对任何人都有帮助。

    【讨论】:

    • 嗨,我正在寻求解决完全相同的问题,尽管我并不完全遵循您的 sudo 代码。你能给我提供你的实现吗?谢谢!
    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    相关资源
    最近更新 更多