我正在创建一款游戏并希望在二维地图中存储位置。这些位置以像素为单位,例如:
{ _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
更多详情:
答案 0 :(得分:2)
2000 * 2000
仅为4000000
。所以......只存储一个整数列表
并使用模数学转换为应用程序中的二维坐标
代码。
所以,对于(row, col)
coords(改变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没有什么特别之处 - 可以使用 任意数量的维度(当然,涉及的数字 开始变得非常大)。
阅读更有趣:
答案 1 :(得分:2)
如果你关心的只是保持一个简洁的地图,我只会存储一个整数数组,其中一个整数代表一个点。您使用按位数学来导出x,y:
例如)65537 =(位)0000000000000001 0000000000000001 = x = z&gt;&gt; 16,y = z&amp; 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;
}
答案 2 :(得分:1)
尽可能小地存储它可能我只是使用
[x1, y1, x2, y2, ..., xn, yn]
然后您可以使用
轻松地从列表中重新创建Position
类实例
positions = map(Position, L[::2], L[1::2])
假设构造函数将x
和y
作为参数
答案 3 :(得分:0)
不清楚,您的地图有多大,但通常地图会有大量数据,因此建议您使用GridF而不是存储在集合中。
答案 4 :(得分:0)
其他工作是两个位置不能指向同一个位置,所以“X + Y”可以成为你的ID和你的搜索0,“位置”:[X,Y]}