【问题标题】:How to approximate a polygon with n rectangles?如何用 n 个矩形近似多边形?
【发布时间】:2019-11-24 07:16:44
【问题描述】:

是否有任何算法可以用 n 个不重叠的矩形来近似给定的多边形,从而提供最大的覆盖范围?通过最大覆盖率,我的意思是矩形区域的总和最大化。矩形不一定大小相等。

我正在处理的多边形是凸的。如果找到确切的解决方案很难/昂贵(我希望它是这样),那么也欢迎简单的、好的启发式方法。

编辑我一直想用多边形内的矩形来近似多边形,但矩形不完全在多边形内的解决方案也很好。如果是这样的话,面积的最大化变成了面积的最小化。

编辑 2 我忘了说这些矩形是正交矩形,即与轴对齐。

【问题讨论】:

  • 您能否提供更多信息?我想知道,您想获得什么信息(矩形数量、总面积总和、浪费的“空间”百分比)。此外,您还必须指定一些内容:您是否希望以最少的矩形数量获得最大的区域覆盖?因为有很多 1mm^2 的矩形,你可以很好地近似该区域。如果是这样,这听起来像en.wikipedia.org/wiki/Multi-objective_optimization。也许您可以将您的问题投射到多个背包问题上。
  • @Slomo:我将给出多边形和矩形数量作为输入。够了吗?
  • 好的,谢谢。基于此,Jens Schauder 的第一个想法似乎是合理的。由于您只有凸多边形,因此最大的矩形将位于中心。因此,您可以递归地找到剩余的下一个较小区域的最大矩形。当您点击第 n 个矩形(输入)时,您的递归将结束。
  • 这里有一个有趣的regular多边形解决方案stackoverflow.com/questions/3296102/…
  • 这里最大正交矩形的一个很好的方法cgm.cs.mcgill.ca/~athens/cs507/Projects/2003/DanielSud

标签: algorithm geometry computational-geometry


【解决方案1】:

一种方法是为您的多边形创建一个(在一般情况下为矩形)边界框。计算边界框面积与多边形面积之差。如果差异足够小,你就完成了,如果没有,继续......

将盒子分成 4 个大小相同的 2x2 矩形。找出这些矩形中的哪个完全在多边形内。计算多边形内矩形总面积与多边形总面积之差。如果差异足够小,您就完成了,如果没有,请继续...

将 4 个矩形中的每一个划分为 4 个子矩形...如果在任何阶段您发现一个矩形完全位于多边形内部或完全外部,您可以将其从矩形列表中删除以在下一次迭代中细分.

换句话说,使用quadtree 划分包含多边形的空间并将其扩展至满足您的准确度标准所需的范围。

【讨论】:

    【解决方案2】:
    1. 创建要处理的多边形队列 Q
    2. 将初始多边形添加到 Q

    3. 从 Q 中移除多边形 P

    4. 找到 P 的最长边 A
    5. 旋转 P 使 A 在 X 轴上
    6. 如果 P 是三角形,用 A 中心的垂线将其分割:
    7. 将两半 G 和 H 添加到 Q 并转到 3
    8. (现在,P 有 4 个或更多边)
    9. 如果 X 和/或 Y 是急性的:

    10 .取 P、A 的下一个最长边,然后转到 5

    11 .从 A 向上投影一个红色矩形。找到它与 P、B 和 C 相交的 2 个点:

    12 .选择较长的(B)并最终确定绿色矩形

    13 .将剩余的数字(D、E 和 F)添加到 Q

    14 .转到 3

    【讨论】:

      【解决方案3】:

      第一个想法,也许其他人可以改进它。

      • 在多边形内的某处放置一个正方形,尽可能远离任何边缘。
      • 迭代 1.) 成长它, 2.) 移动它并转动它以使其与边缘的距离最大化。直到你不能再种植它为止
      • 从头开始,同时将放置的矩形的边缘视为多边形的边缘。

      【讨论】:

        【解决方案4】:

        我意识到这是一个非常古老的问题,但我最近偶然发现了一个类似的问题,我不得不尝试用矩形来近似多边形。使用此处和其他地方提出的一些想法,我从inscribed rectangle 开始,并在内接矩形周围生成矩形以提供多边形的一般形状。

        这种方法适用于凸多边形,也适用于一些凹多边形 - 特别是如果您采用迭代方法(例如,将输出矩形作为输入提供给另一个迭代)。

        对于非常凹的形状,您可以考虑将多边形分解为凸包,然后应用我上面描述的技术。 Bayazit 的实现看起来很有前途。

        如果有人感兴趣,我已经在此处发布了使用内接矩形的实现: https://github.com/pborissow/Poly2Rect

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-01
          • 2013-02-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多