转移代码存在问题,无法弄清楚它应该如何工作。

好的,我将这段代码从 JavaScript 文件转换为了 Lua。它是解决装箱问题的一个方案。基本上,给定一个目标矩形大小 "init(x,y)",然后给出一个用于填充该矩形的块表 "fit(blocks)"。然而当我运行它时,我得到了错误信息 "attempt to index local 'root' (a number value)"。这里出了什么问题?

我也不完全理解这段代码是如何工作的,有人在端口过程中帮助了我。当我将一个表 "blocks" 传递给 fit 函数时,它是否添加了块的属性 block.fit.x 和 block.fit.y?

任何帮助将不胜感激。

编辑:通过将 "." 改为 ":" 来调用方法来修复错误。

-- 从 https://github.com/jakesgordon/bin-packing 移植而来

local _M = {}

mt = {
  init = function(t, x, y)       -- 接受要求填充的目标矩形的尺寸
    t.root = { x = 0, y = 0, x = x, y = y }
  end,

  fit = function(t, blocks)     -- 传入块表 "blocks"
    local n, node, block
    for k, block in pairs(blocks) do
      if node == t.findNode(t.root, block.x, block.y) then
        block.fit = t.splitNode(node, block.x, block.y)
      end
    end
  end,

  findNode = function(t, root, x, y)
    if root.used then                 -- 如果 root.used,则
      return t.findNode(root.right, x, y) or t.findNode(root.down, x, y)
      elseif (x <= root.x) and (y <= root.y) then
        return root
      else
        return nil
    end
  end,

  splitNode = function(t, node, x, y)
    node.used = true
    node.down = { x = node.x,   y = node.y + y, x = node.x,   y = node.y - y }
    node.right = { x = node.x + x, y = node.y,   x = node.x - x, y = y      }
    return node;
  end,
}

setmetatable(_M, mt)

-- 类对象化操作
mt.__index = function(t, k)
  if nil ~= mt[k] then
    return mt[k]
  else
    return t[k]
  end
end

mt.__call = function(t, ...)
  local new_instance = {}
  setmetatable(new_instance, mt)
  new_instance:init(...)
  return new_instance
end

return _M
点赞
用户336528
用户336528

我不知道这是否会有帮助,但这是我把代码转换为 Lua 的方式。

local Packer = {}

Packer.__index = Packer

function Packer:findNode (root, w, h)
  if root.used then
    return self:findNode(root.right, w, h) or self:findNode(root.down, w, h)
  elseif w <= root.w and h <= root.h then
    return root
  else
    return nil
  end
end

function Packer:fit (blocks)
  local node
  for _, block in pairs(blocks) do
    node = self:findNode(self.root, block.w, block.h)
    if node then
      block.fit = self:splitNode(node, block.w, block.h)
    end
  end
end

function Packer.init (w, h)
  local packer = {}
  packer.root = {x = 0, y = 0, w = w, h = h}
  return setmetatable(packer, Packer)
end

function Packer:splitNode (node, w, h)
  node.used = true
  node.down  = {x = node.x,     y = node.y + h, w = node.w,     h = node.h - h}
  node.right = {x = node.x + w, y = node.y,     w = node.w - w, h = h         }
  return node
end

return Packer

将其放置在名为 packer.lua 的文件中,并使用 local Packer = require "packer" 导入到您的 main.lua 中。

2016-11-24 21:06:12