繁体   English   中英

包装矩形算法

[英]Packing Rectangles Algorithm

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

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

你能给我一些关于如何解决这个问题的建议吗?

谢谢!

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

这不是功课。 我正在尝试创建一个类似于ted.com效果的效果

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

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

您可以使用空间索引或四叉树来细分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

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

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

因此,您可以做的最好的方法是将矩形适合于表面4/3(高度*宽度)的矩形

(这是一个下限)

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

在此输入图像描述

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

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

  1. 取第一个矩形并将其放在目标平面的角落。
  2. 取下一个矩形(断言它比前一个矩形小)
  3. 旋转约90度
  4. 这样
    • 它的较短尺寸与最后一个较大邻居的较长尺寸相邻
    • 并且其长边与目标平面的边缘或相同尺寸的相邻边缘相邻
  5. 重复2 - 4

我意识到描述可能不清楚,所以这里是提供解决方案的图片 - 它应该有助于掌握它:

在此输入图像描述

这很像MIP映射

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM