如何以编程方式实现2D纸盒包装?

时间:2012-01-06 18:24:25

标签: algorithm bin-packing

在stackoverflow上有一些类似的问题,但是它们似乎都没有提供一个明确的答案,即没有对NP难题和算法有深刻理解的人可以理解。

如何执行矩形对象的2D bin打包?就我而言,我正在尝试将几个图像组合成一个图像,用作spritesheet,使用最小的空间。每个图像可能具有截然不同的边界,但是容器没有设置边界。

我希望有人了解bin打包算法可以解释如何以编程方式实现这一点,而不是提供bin打包方法的一般概述。

1 个答案:

答案 0 :(得分:24)

I Googled "bin packing code"这是我的第一次点击:http://codeincomplete.com/posts/2011/5/7/bin_packing/

以下是摘要:构建二叉树。树中的每个分支都包含一个精灵。每个叶节点表示可用空间。最初,树只有根节点,它代表所有可用空间。要向树中添加精灵,请在树中搜索大到足以容纳精灵的未占用(叶子)节点。通过将sprite设置为节点的占用者并为节点提供两个子节点,将该节点从一个叶子转换为一个分支。一个孩子代表精灵右边的剩余空间;另一个代表精灵下面的剩余空间和第一个孩子。

我上面链接的文章用图表和JavaScript代码更全面地解释了这一点。它还解释了如何动态增长精灵表而不是提前选择固定大小。