最小区域包围矩形?

时间:2011-11-05 12:15:35

标签: algorithm matrix computational-geometry geometry-surface

我需要一个算法的想法来解决以下问题(我已经尝试了一些个人的 解决方案,但它们似乎不是最佳的)

如果给定带有标记和未标记区域的表面(矩阵形式)和2个矩形 你可以在任何形式或位置操纵,找到可能的形状和位置 矩形使得它们覆盖所有标记区域,同时保持最小值 表面积可能。

1 个答案:

答案 0 :(得分:3)

这个答案假设你不能旋转矩形,并且边总是平行于x和y轴。

首先,找到包围整个区域的矩形。对此的算法是这样的(假设原点位于topleft):

For each marked spot in the matrix:
    if spot.x < rectangle.left:
        rectangle.left = spot.x
    if spot.x > rectangle.right:
        rectangle.left = spot.x
    if spot.y < rectangle.top:
        rectangle.left = spot.x
    if spot.y < rectangle.bottom:
        rectangle.left = spot.x

然后,找到这样的最大水平间隙:

largest_gap = -1
For each column in matrix:
     last_marked_spot = 0, 0
     For each spot in column:
         if spot.marked:
             if spot.x - last_marked_spot.x > largest_gap:
                 largest_gap = spot.x - last_marked_spot.x
             last_marked_spot = spot

垂直间隙也是如此。然后检查哪个差距最大。

然后使用最大间隙作为分隔符将全包矩形分成两部分。最后一步是折叠两个矩形(使用顶部算法的反向)。