包装矩形算法

时间:2011-09-28 09:08:20

标签: algorithm math packing

我需要解决以下问题: 我有多个大小的矩形:宽度高度,宽度/ 2高度/ 2,宽度/ 4高度/ 4,宽度/ 8高度/ 8 ...等等

我需要将这些矩形打包成一个大小为x * width y * height的大矩形,这样就不会有矩形重叠,矩形在包装中随机分布,任何矩形至少应该触及另一个矩形。我尝试了一个相当基本的贪婪算法,但它失败了。

您能否就如何解决问题给我一些建议?

谢谢!

编辑:您可以拥有多个每种尺寸的矩形

这不是作业。我正在尝试创建一种类似于ted.com

效果的效果

随机意味着可能存在满足约束的矩形的多个打包。该算法不应在每次运行时生成相同的包装。

5 个答案:

答案 0 :(得分:4)

这听起来像rectangle packing problem。那里有algorithm的链接。该代码尽可能紧密地包装矩形。你说你想要矩形随机分布,我猜这意味着不是所有矩形都是彼此相邻的,并且所有矩形都展开以填充大矩形。也许上面链接中的代码是获得一些想法的良好起点。

答案 1 :(得分:2)

您可以使用空间索引或四叉树来细分2d平面。这个想法是将2d问题减少到1d问题。获得空间索引(或空间填充曲线)后,您可以将2d离散化为1d,您可以使用1d搜索相似性或从低到高排序或反向排序,例如长度。如果您收到此订单,则可以将索引计算回2d表示并以最有效的方式将它们打包到您的容器中。有很多方法可以制作空间索引。一些最好但很难做的是希尔伯特曲线。另一个是z曲线或莫顿曲线。它与zizag曲线不同,因为它将平面细分为4个方块(不是矩形)。

编辑:这是一个Jquery-Plugin的链接:http://www.fbtools.com/jquery/treemap/ 这里有世界流行:http://www.fbtools.com/jquery/treemap/population.html

编辑:http://people.csail.mit.edu/konak/papers/socg_2008-circular_partitions_with_applications_to_visualization_and_embeddings.html

编辑:http://lip.sourceforge.net/ctreemap.html

答案 2 :(得分:1)

  

在每一步中,您将新矩形的表面除以4。

     

SUM([0,inf]中n为1/4 n)= 4/3 **

     

所以你能做的最好的事情就是把你的矩形放在一个矩形的表面上   4/3(高度*宽度)

     

(这是一个下限)

@mloskot算法给出了一个可能的解决方案,它将位于表面3/2 *(高度*宽度)的矩形中:这是一个例子:

enter image description here

我不知道你怎么能做得更好。

答案 3 :(得分:0)

假设每个尺寸只有一个矩形,您可以尝试复制纸张尺寸的排列。按大小从最大到最小排序矩形,然后

  1. 取第一个矩形并将其放在目标平面的角落。
  2. 取下一个矩形(断言它比前一个矩形小)
  3. 旋转约90度
  4. 放置
    • 其较短的尺寸与最后一个较大邻居的较长尺寸相邻
    • 并且其长边与目标平面的边缘或其相邻边缘相邻 大小
  5. 重复2 - 4
  6. 我意识到描述可能不清楚,所以这里有图片展示解决方案 - 它应该有助于把握它:

    enter image description here

答案 4 :(得分:0)

这很像MIP-mapping