平铺不同大小的矩形

时间:2012-07-30 14:59:31

标签: algorithm optimization tiling

我正在寻找一些指向算法的指针,这些算法应该允许平铺不重叠不同大小的矩形。

给定一组不同大小的矩形,将它们平铺在大小为H x W且没有重叠的区域上。目标是最大化使用的空间或相反 - 最小化间隙面积。如果空间不足,请继续进行相同大小的第二个区域,依此类推。

假设每个矩形的宽度和高度小于拼接区域的各个尺寸。矩形不会旋转或以其他方式转换 - 即它们的边是水平的或垂直的。

我不是在寻找完成的代码,只是好奇最好用什么方法/算法来解决这个问题。

2 个答案:

答案 0 :(得分:2)

最简单的是使用kd树将树细分为垂直和水平的euklidian 2d空间。然后,您可以将矩形打包到其中一个创建的空间中,并以递归方式细分树。在线提供了一个Jquery treemap插件示例。 jquery插件砌体可以做同样的事情,但它更像是1d bin-packing解算器。 2d bin-packing更加复杂,也可能意味着旋转矩形。以下是打包光照贴图的示例:http://www.blackpawn.com/texts/lightmaps/default.html

答案 1 :(得分:1)

我有一个想法可以朝着正确的方向发展。我们的想法是在边界框中跟踪平铺区域与白色区域的比率。

输入:无序的输入矩形集 输出:填充区域

  1. 定义空边界框
  2. 从输入集中选择这样的两个矩形A_i和B_j,其边界框B包含最小的空白区域比率
  3. 使用两个最佳框更新边界框
  4. 将边界框放在一个角落,比如说(1,1)
  5. 重复直到没有方框
    1. 从集合中取一个新框,例如更新的边界框有最小空白
    2. 如果边界框的宽度或高度超过输出区域的宽度或高度,则限制在水平或垂直方向上生长
    3. 如果无法添加新框,请继续使用新区域H x W并重新启动算法,否则更新边界框
  6. 还有一些要点可以定义 - 如何最好地确定边界框的位置?如何强加边界框增长限制?如何有效地找到最佳边界框?