在二维网格

时间:2017-09-06 12:56:29

标签: javascript performance grid-layout

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

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

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

我还认为以不同的方式存储数据会有所帮助,但同样,我不知道如何。

2 个答案:

答案 0 :(得分:2)

您有两种创建网格的方法:

  • 使用二维数组,这对于网格来说一定是更容易的事情
  • 将相邻的瓷砖存放在其中:

    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] 

将返回以下错误:未捕获TypeError:无法设置属性&#39; 2&#39;未定义的,因为arr的索引仅定义在0到9之间。

答案 1 :(得分:0)

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

“久经考验的”二维网格数据结构将是......一个简单的二维数组。然后,您可以通过坐标直接访问切片。