4

我正在创建一个游戏并希望将位置存储在 2d 地图中。这些位置以像素为单位,例如:

{ _id: 1111, map: [
  { x: 850,  y: 2000 },
  { x: 950,  y: 2000 },
  { x: 1050, y: 2000 }
]}

我还想过做一些类似的事情:

{ _id: 1111, map: [
  850:  [2000],
  950:  [2000],
  1050: [2000]
]}

像这样的地图最好的数据结构是什么?地点0 < x < 2000和地点0 < y < 2000

更多细节:

  • 获取游戏时,我需要完整的地图,我不需要只查询地图的子集
  • 我希望地图尽可能小以存储。
  • 地图中可以包含 3000 多个元素。
4

5 回答 5

2

如果您只关心保持简洁的地图,我将只存储一个整数数组,其中一个整数代表一个点。您使用按位数学推导出 x,y:

例如)65537 =(位)0000000000000001 0000000000000001 = x=z>>16, y=z&0xFFFF = (1,1)

UDPATE:这是一些请求的示例 JavaScript:

function intToPos(i)
{
    var x= i >> 16;
    var y= i&0xFFFF;

    console.log(x+","+y);
}

var positions=[65537,131074,196611];

for (var i=0; i < positions.length; i++)
{
   intToPos(positions[i])
}

更新: posToInt 函数:

function posToInt(x,y)
{
    var pos= (x<<16)|y;

    console.log(pos);

    return pos;
}
于 2013-07-28T01:03:40.943 回答
2

2000 * 2000只是4000000。所以......只需存储一个整数列表并使用模数学在您的应用程序代码中转换为二维坐标。

因此,对于(row, col)(改变 y 以使其更清晰,并省略y==2000因为那是,你知道,不是<2000)的坐标

(850, 1999)
(950, 1289)
(1050, 380)

你会做(python示例)

>>> COLS = 2000
>>> xy2num = lambda x, y: (x*COLS)+y
>>> num2xy = lambda n: (n // COLS, n % COLS)
>>> points = [(850, 1999), (950, 1289), (1050, 380)]
>>> point_nums = [xy2num(x, y) for x, y in points]
>>> point_nums
[1701999, 1901289, 2100380]
>>> [num2xy(num) for num in point_nums]
[(850, 1999), (950, 1289), (1050, 380)]

考虑这一点的一种方法是枚举地图上的每个点:

[(0,0), (0,1), (0,2), <...>, (0,1999),
 (1,0), (1,1), (1,2), <...>,
 (1999,0), (1999,1), <...>, (1999, 1999)]

每个0<=N<4000000整数本质上都是对该列表的索引查找。

请注意,这是 2D 并没有什么特别之处 - 可以适用于任意数量的维度(当然,所涉及的数字开始变得非常大)。

更有趣的阅读:

http://en.wikipedia.org/wiki/Aleph_number

于 2013-07-27T16:48:04.790 回答
1

为了尽可能小地存储它,我可能只是使用

[x1, y1, x2, y2, ..., xn, yn]

然后您可以轻松地Position从列表中重新创建您的类实例

positions = map(Position, L[::2], L[1::2])

假设构造函数将xy作为参数

于 2013-07-27T16:02:41.203 回答
0

不清楚,您的地图有多大,但一般地图会有大量数据,因此建议您使用 GridFs 而不是存储在集合中。

于 2013-07-27T16:03:22.830 回答
0

其他解决方法是两个位置不能指向同一个位置,因此“X+Y”可以成为您的 ID 和您的搜索 0,"position":[X,Y]}

于 2013-07-27T16:09:21.977 回答