如何用n个矩形近似多边形?

时间:2012-06-06 14:16:07

标签: algorithm geometry computational-geometry

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

我正在处理的多边形是凸的。如果确切的解决方案很难/很难找到(我期待它),也欢迎简单的良好启发式。

编辑我一直认为用多边形内部的矩形近似多边形,但矩形不完全在多边形内的解也很好。如果是这种情况,区域的最大化将使区域最小化。

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

4 个答案:

答案 0 :(得分:5)

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

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

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

换句话说,使用quadtree划分包含多边形的空间,并将其展开到符合准确性标准所需的范围。

答案 1 :(得分:3)

  1. 创建要处理的多边形队列Q
  2. 将初始多边形添加到Q

  3. 从Q

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

    10。采取P,A和goto 5的下一个最长边

    11。从A投射一个红色矩形。找到它与P,B和C相交的2个点: enter image description here

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

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

    14 p。转到3

答案 2 :(得分:2)

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

  • 在多边形内放置一个正方形,尽可能远离任何边缘。
  • 迭代 1.)长大, 2.)移动它并转动它以最大化它与边缘的距离。直到你再也无法成长
  • 从头开始,同时考虑放置矩形的边缘作为多边形的边缘。

答案 3 :(得分:1)

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

这种方法对凸多边形很有效,对某些凹多边形也很合适-尤其是如果您采用迭代方法(例如,将输出矩形作为另一次迭代的输入)。

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

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

Poly2Rect