【问题标题】:Find adjacent tiles in a two-dimensional grid在二维网格中查找相邻图块
【发布时间】:2017-09-06 12:56:29
【问题描述】:

我有一个二维网格,其中所有图块都由两个坐标 x 和 y 定义。我将图块存储在像这样var tiles = []; 的数组中。每个图块都是一个具有xy 属性的对象:

Tile = {
   x: ...,
   y: ...
}

出于绘图目的(画布),我想找出哪些瓷砖彼此相邻。我可以通过遍历每个元素并检查它是否相邻来做到这一点。由于这需要 n^n 次访问,我认为这不是正确的方法。我认为会有更有效的算法。

我还认为也许以不同的方式存储数据会有所帮助,但我也不知道该怎么做。

【问题讨论】:

  • 嗯,从一般的角度来看,这看起来像是一个问题,您可以通过学习大 O 表示法以及它与计算机科学中的数据存储类型的关系来进行调查。也就是说,看起来您将不得不按照您的想法进行操作。

标签: javascript performance grid-layout


【解决方案1】:

您有 2 种方法来创建网格:

  • 使用二维数组,这对于网格来说一定更容易
  • 用类似的东西将相邻的 Tile 存储在其中:

    var tile0 = {
      x:0, y:1
    }
    
    var tile1 = {
      x:1,y:1, tileLeft : tile0
    }
    

如果您想创建五边形或六边形...网格,它会很有用,当然可以使用 for 循环自动创建网格。

编辑

二维数组只是数组的数组

var arr = new Array()
for(var i = 0 ; i < 10 ; i++){
    arr[i] = new Array()
}

现在您可以像在网格中一样设置值,例如:

arr[0][2] = {x:2,y:2}  //It's a bit useless since indexes can be use for x and y

在这种情况下,我有 10 个数组存储在一个数组中,所以:

arr[10][0] 

将返回以下错误:Uncaught TypeError: Cannot set property '2' of undefined,因为 arr 的索引只定义在 0 和 9 之间。

【讨论】:

  • 你能解释一下二维数组是如何工作和在这里使用的吗?
  • 我的问题是网格是无限的,只定义了一些图块。所以第一种方法似乎更适合我。但由于我还需要保存和加载数据,所以看起来有点难以实现。
  • 它是 javascript 对象,您可以将它们存储在 JSON 中,因此也可以将它们存储在 mongoDB 数据库中,找到创建图块的正确方法似乎比存储和加载它们更难。您的问题取决于数据的大小,您可以等待多长时间来加载数据...
  • 感谢您的帮助。我想我会将这两个坐标映射到一个唯一的整数,我可以将它存储在一个一维数组中(这对我来说不太容易混淆),并另外将它存储在各个图块中。
【解决方案2】:

使用您的数据结构,我无法在不访问每个图块的情况下检查所有相邻图块。

“久经考验”的二维网格数据结构是……一个简单的二维数组。然后您可以直接通过它们的坐标访问图块。

【讨论】:

  • 你能解释一下二维数组是如何工作和在这里使用的吗?
猜你喜欢
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
相关资源
最近更新 更多