【问题标题】:Nested For-Loops - Remove Both Elements i and j嵌套 For 循环 - 删除元素 i 和 j
【发布时间】:2020-05-01 02:47:29
【问题描述】:

我正在使用在 Lua 中实现的游戏制作框架来忙于隔离。我正在使用 ECS/DOP 制作一个简单的平台游戏,我想生成从瓦片地图派生的碰撞几何图形,而不仅仅是检查与所有瓦片的碰撞。

每个图块都有一个边界框组件,它指向一个包含基本形状的列表。每个形状将边界框的边缘存储为 {{x1,y1},{x2,y2}}。此过程的第一步是解析仅包含 tilenames 的 TileMap 表,然后将由 row/column * grid_dimension 转换的相应边界框的副本插入名为 BBOX 的表中。下一步是删除边缘的所有实例,如果它是此图像所示的重复项

这是我卡住的地方。

所需的基本边缘删除算法如下所示:

for i = #BBOX, 1, -1 do
    local edge1 = BBOX[i]
    for j = i, 1, -1 do
        local edge2 = BBOX[j]
        same_edge = edge1 == edge2 -- Not the actual comparison, just the outcome of it
        if same_edge and i ~= j then
           BBOX[i] = nil
           BBOX[j] = nil
        end
    end
end

问题当然是当 i 等于循环中较早删除的 j 时,此错误。我环顾四周,找不到一种方法来删除 lua 中所有重复值的实例,只有关心唯一性的解决方案。有没有人找到一种有效的方法来做这件事或类似的事情?

【问题讨论】:

  • 您可以将您的键设置为每条边唯一的值,本质上是您用于比较的键。这将删除重复的值。
  • 那么根据边本身的值来做key?这是一个很酷的主意。我将如何去删除重复的最后一个实例呢?我可以看到 BBOX[edge_key] = edge 如何有助于制作唯一值表,但摆脱最后一个唯一值似乎有点麻烦。
  • 我不确定我理解你所说的getting rid of the last unique 是什么意思。如果您使用edge_key 并假设edge1edge2 相同,那么BBOX[edge1_key] = edge1 后跟BBOX[edge2_key] = edge2 只是1 个表条目而不是2 个
  • 基本上,最后我希望 BBOX[edge2_key] 和 BBOX[edge1_key] 返回 nil。重复边缘意味着它们位于较大矩形的内部(它们将是上图中的虚线)并且需要删除两条边缘。

标签: lua


【解决方案1】:

如果您使用每个键的唯一值,您可以更好地检测重复项。 我们将此唯一值称为edge.key

如果一条边最多只存在两次,那么:

BBOX[edge.key] = BBOX[edge.key] == nil and edge or nil

会成功的。

但是如果边可能存在任意次数,我们可以这样做:

local duplicateEdges = {}

for i = #BBOX, 1, -1 do
  if BBOX[edge_key] then
    duplicateEdges[edge_key] = true
  else
    BBOX[edge_key] = edge
  end

  for j = i, 1, -1 do
    if BBOX[edge_key] then
      duplicateEdges[edge_key] = true
    else
      BBOX[edge_key] = edge
    end
  end
end

for k in pairs(duplicateEdges) do
  BBOX[k] = nil
end

【讨论】:

  • 我最终做了第二个,但在适用的情况下将所有edge_key 替换为 i/j 并且仅在 BBOX[i] == BBOX[j] then duplicateEdges[i] = true, duplicateEdges[j] = true 时使用。我担心性能,但它似乎很好。谢谢@Nifim
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多