【问题标题】:Programmatically Positioning Shapes -- Packing Efficiently以编程方式定位形状——高效包装
【发布时间】:2012-02-13 22:01:47
【问题描述】:

假设我定义了一些抽象形状,每个形状都有宽度和高度(为了简单起见,我们将它们设为矩形)。如何将它们中的尽可能多的放置在一个定义了宽度和高度的画布上(只是一个术语,不一定是 HTML5 画布)?

显然这是某种约束满足问题,但我真的不知道从哪里开始(除了蛮力)。谷歌搜索只会出现不相关的结果(可能是因为我不知道要搜索什么)。什么是好的算法,或者什么是创建算法的好方法?

Fizz 就是一个很好的例子。形状(在本例中为圆形)以组的形式出现,并且不会相互重叠,并且不会相互干扰。我的用例更像是一次性定位交易。另一个例子是SpriteRight,它在一定的范围内尽可能高效地放置。

【问题讨论】:

  • 谷歌装箱算法,你会找到你需要的开始。

标签: language-agnostic constraints constraint-programming


【解决方案1】:

您的问题可以从有限域上的约束逻辑编程中受益 ()。

考虑Prolog constraint processing: Packing squares 的问题和答案。它展示了几种方法,其中一种方法使用专用的placement constraints 在二维中查找非重叠矩形的布局。

clpfd 还使您能够在打包约束之外强制执行附加约束。有支持的免费(例如SWIYAP)和商业(例如SICStus实现。

【讨论】:

    【解决方案2】:

    我找到了一个带有 JavaScript 和 HTML5 画布的 open source example。矩形是随机生成的,然后打包。然而,作者并未声称效率。

    我还发现了an article,看起来很有希望。

    【讨论】:

      【解决方案3】:

      您也可以查看http://www.aimms.com/downloads/application-examples/circle-packing。这里使用数学规划/建模来解决圆包装问题。也可以定义其他变体。约束编程中存在特殊的装箱约束,http://www.aimms.com/cp

      一般来说,数学规划是解决此类问题的好方法。

      【讨论】:

        猜你喜欢
        • 2012-12-12
        • 1970-01-01
        • 2021-06-09
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2016-10-11
        相关资源
        最近更新 更多