优化的数据结构,用于2d空间搜索和Javascript实现?

时间:2011-03-25 17:12:18

标签: javascript algorithm bin-packing

我正在研究俄罗斯方块式的HTML5游戏,需要加强空间优化算法。 需要以最节省空间的方式将不同大小的矩形块添加到画布中。我知道这个块占用了多少空间,我需要找到一个最近的点,可以使用固定的x坐标添加块 - 绝对最近的点是一个不错的选择。

我已经实现了一个版本,该版本使用画布上的逐像素值检查进行搜索,然后向下推,直到找到足够的形状可用空间然后添加它。只有当空间从左向右填充时,这才会缓慢地工作 - 算法可以安全地假设第一个像素列是否安全,然后可以添加整个块。

我需要让这个更加强大,这就是我认为应该去的地方。

存储四叉树来表示电路板状态可以更快地识别出存在空间的位置。

Search Space

每个深度级别存储4个节点 - 每个节点为0表示完全为空,或者1为“某处有某些东西”。每个渐进的深度级别都会提供有关电路板的越来越多的信息。

given(boardstate, block width, block height)
-calculate the largest grid space the block must span
  // a block which is 242x38 MUST span a 16x16 free space 
  // (based on 1/2 of smallest dimension)
-the block width requires n consecutive free spaces
  // (242/16) = 15
-find the first available 15x1 spaces in the board
-check the surrounding tiles at the next level of depth for collisions
  -check the surrounding tiles at the next level of depth for collisions... etc
-if there's a fit 
  draw the block 
  mark all affected nodes at all depths as 'filled'

表示网格的最佳javascript数据结构是什么?

到目前为止我考虑过的事情:

一个。使用指向子项和值的指针以及一组导航它的方法构建一个完整的tree对象。这将是直观的,可能节省空间,但我怀疑非常慢。

B中。将每个网格看作4位,并将深度存储为十六进制数组或对象。如果由一个比我更聪明的人完成,这可能不仅优化了存储,而且使得巧妙的位操作可用于比较相邻的单元,打开和关闭块等等。我想它会非常快,非常高效,但它超越了我的建设技巧。

℃。将每个深度存储在一个数组中。 Depth[0]=[1,0,0,0]; Depth[1][1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0]等。这就是我现在要去的地方。它的空间效率不是很高,而且可能不会非常快,但我想我可以解决它。

对于深度数量的任何结构存在实际限制(在我的上一个方法中存储4x4空间的可用性的数组超过65000)之后进行昂贵的调用以检查来自的最后几个像素的图像数据带有常规迭代器的画布是不可避免的。

那么,A,B,C,其他?

像往常一样,所有见解都表示赞赏。

1 个答案:

答案 0 :(得分:3)

您想要答案b)并且您想要实现空间填充曲线或空间索引。您不希望将位存储在数组或对象或索引中,而是存储在字符串键中。您希望从左到右读取此字符串键,因此您可以使用任何字符串匹配算法轻松查询每个深度。你想谷歌为尼克的空间索引希尔伯特曲线四叉树博客。但是你认为答案b)非常昂贵是正确的,所以我建议你回答a)因为它不是那么慢而且已经有一个免费实现的闭包库提供的javascript四叉树:closure-library.googlecode。 COM / SVN /文档/ class_goog_structs_QuadTree.html。