包装矩形,紧凑的表示

时间:2008-09-30 13:56:22

标签: algorithm packing rectangles

我正在寻找解决以下问题的指针:我有一组矩形,其高度已知,x位也是,我想以更紧凑的形式打包它们。使用一个小图画(所有矩形宽度相同,但宽度可能在现实生活中有所不同),我想,而不是。

-r1-
  -r2--
     -r3--
       -r4-
        -r5--
等等。

-r1-  -r3-- 
  -r2-- -r4-
         -r5--

所有提示将不胜感激。我不一定在寻找“最佳”解决方案。

6 个答案:

答案 0 :(得分:2)

您的问题是一个更简单的变体,但您可能会得到一些关于为“binpacking”问题开发的启发式的技巧。已经有很多关于此的文章,但this page是一个良好的开端。

答案 1 :(得分:2)

Topcoder有竞争解决此问题的3D版本。获胜者讨论了他的方法here,这对你来说可能是一本有趣的读物。

答案 2 :(得分:1)

这样的东西?

  • 按x-position
  • 对矩形集合进行排序
  • 编写一种方法,检查在x轴的某个间隔上存在哪些矩形

    Collection<Rectangle> overlaps (int startx, int endx, Collection<Rectangle> rects){
    ...
    }
    
  • 循环遍历矩形集合

    Collection<Rectangle> toDraw;
    Collection<Rectangle> drawn;
    foreach (Rectangle r in toDraw){
    Collection<Rectangle> overlapping = overlaps (r.x, r.x+r.width, drawn);
    int y = 0;
    foreach(Rectangle overlapRect in overlapping){
    y += overlapRect.height;
    }
    drawRectangle(y, Rectangle);
    drawn.add(r);
    }
    

答案 3 :(得分:1)

矩形的高度是否相同?如果它们是,并且问题只是将每个矩形放入哪一行,那么问题归结为对形式的所有矩形对(X,Y)的一系列约束“矩形X不能在同一行中矩形Y“当矩形X在x方向上与矩形Y重叠时。

用于此的“贪婪”算法从左到右对矩形进行排序,然后将每个矩形依次分配给它所适合的最低编号行。因为矩形是从左到右处理的,所以只需要担心当前矩形的左手边缘是否会与任何其他矩形重叠,这在一定程度上简化了重叠检测算法。

我无法证明这是最佳解决方案,但另一方面也无法想到任何反例。任何人吗?

答案 4 :(得分:0)

将类似俄罗斯方块的游戏放入您的网站。根据您的参数生成下降的块和游戏区域的大小。基于其设计的紧凑性(较少的自由空间=更多点)奖励玩家。让您的网站访问者为您执行工作。

答案 5 :(得分:0)

之前我曾经遇到过这样的问题。最直观的图片可能是大矩形在底部的图片,较小的图片在顶部,有点像将它们全部放在容器中并摇动它,使重的矩形落到底部。所以要做到这一点,首先按照减小面积(或宽度)的顺序对数组进行排序 - 我们将首先处理大型项目并将图片重新构建。

现在问题是如果我理解正确的话,将y坐标分配给一组给出x坐标的矩形。

迭代你的矩形数组。对于每个矩形,将矩形的y坐标初始化为0.然后通过增加此矩形的y坐标进行循环,直到它不与任何先前放置的矩形相交(您需要跟踪先前放置的矩形)。提交您刚刚找到的y坐标,然后继续处理下一个矩形。