我需要解决以下问题: 我有多个大小的矩形:宽度高度,宽度/ 2高度/ 2,宽度/ 4高度/ 4,宽度/ 8高度/ 8 ...等等
我需要将这些矩形打包成一个大小为x * width y * height的大矩形,这样就不会有矩形重叠,矩形在包装中随机分布,任何矩形至少应该触及另一个矩形。我尝试了一个相当基本的贪婪算法,但它失败了。
您能否就如何解决问题给我一些建议?
谢谢!
编辑:您可以拥有多个每种尺寸的矩形
这不是作业。我正在尝试创建一种类似于ted.com
效果的效果随机意味着可能存在满足约束的矩形的多个打包。该算法不应在每次运行时生成相同的包装。
答案 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
答案 2 :(得分:1)
在每一步中,您将新矩形的表面除以4。
SUM([0,inf]中n为1/4 n)= 4/3 **
所以你能做的最好的事情就是把你的矩形放在一个矩形的表面上 4/3(高度*宽度)
(这是一个下限)
@mloskot算法给出了一个可能的解决方案,它将位于表面3/2 *(高度*宽度)的矩形中:这是一个例子:
我不知道你怎么能做得更好。
答案 3 :(得分:0)
假设每个尺寸只有一个矩形,您可以尝试复制纸张尺寸的排列。按大小从最大到最小排序矩形,然后
我意识到描述可能不清楚,所以这里有图片展示解决方案 - 它应该有助于把握它:
答案 4 :(得分:0)
这很像MIP-mapping