将2D框排序为更大的框以填充最有效和最完整的方式

时间:2015-05-27 05:33:49

标签: sorting lua 2d love2d

背景
你好,所以我一直在研究这个功能,我磕磕绊绊。最终,我要完成的是拥有一个应用程序,用户输入更大的框,并输入一个较小的框列表。 (顺便说一句,所有2维)。程序然后处理这个,并尝试尽可能完整地填充较小的盒子。对于那些好奇的人来说,这是一个剧院平台应用程序。

代码:
我这里有这个功能,它取“box”,这是一个由用户创建的大盒子表,以及“平台”,它是一个较小盒子的表。正如评论中所见,我已经编写了一个部分,如果一个平台完全适合一个盒子,那么它就是这样做的。然后,它减少该平台的给定大小的数量,并将该框标记为已填充。

问题:
我无法弄清楚的问题是如何以最有效的方式以编程方式将两个平台安装到一个更大的盒子中。我考虑使用框的x侧并用给定的一组平台的x值填充它,然后在该集合中使用相同的x值替换不同的平台,但是具有不同的y值但是存在几个问题。登记/> 关于我应该从哪里去的任何指示?

userInterfaceCall()
    squares[#squares+1] = {x1=x, y1=y, x2 = nil, y2 = nil, f=false}
    --x1,y1 and x2,y2 are coordinates for two opposite points in a square
    --f is the boolean that is marked true when a square (box) is completely filled
end

platforms[1] = {x=4, y=4, q=2} --example user data
platforms[2] = {x=4, y=6, q=2} --x and y are platform dimensions
platforms[3] = {x=6, y=2, q=1} --q is quantity
platforms[4] = {x=8, y=4, q=1} 

process(squares,platforms) --this is called by a UI element

function process(box,platforms)
for i,box in ipairs(box) do                     --for every square do
    if box.f == false then                      --if the box already has a given platform, don't do shit
        for i,platform in ipairs(platforms) do  --for each platform for each box
            boxX = math.abs(box.x1-box.x2)/scale  --Ignore this, this is working with scaling from-
            boxY = math.abs(box.y1-box.y2)/scale  --pixel size to feet to compare to list of platforms
            if boxX == platform.x and boxY == platform.y and platform.q > 0 then        --Test if any platform fits directly in the box
                placements[#placements+1] = {x1 = box.x1, y1 = box.y1, x2 = box.x2, y2 = box.y2, s = ''} --Creates a new placement of a given platform, which is then drawn
                platform.q = platform.q - 1 --we reduce the quantity, cause we used one
                box.f = true --yes, we just filled the box completely
            elseif boxY == platform.x and boxX == platform.y and platform.q > 0 then    --Test for switched x and y
                placements[#placements+1] = {x1 = box.x1, y1 = box.y1, x2 = box.x2, y2 = box.y2, s = ''}
                platform.q = platform.q - 1
                box.f = true
            elseif
                --put multiple platforms in one box, Help
            else
                setPrompt('Could not find for box: '..boxX..','..boxY)
            end
        end
    end
end

2 个答案:

答案 0 :(得分:2)

您找到了Multi-dimensional Knapsack Problem的变体,已知它是NP完全的。所以不,没有简单的“最佳”解决方案,但是,已经发现许多策略在可接受的时间内产生可接受的结果。请参阅链接的文章以获得进一步的解释。

答案 1 :(得分:1)

对于其他任何看过这个的人,请在此处阅读:http://codeincomplete.com/posts/2011/5/7/bin_packing/

这是一个有效的javascript / CSS解决方案。