(LUA) 从 2 个数字生成一个唯一数字
(LUA) Generate a unique number from 2 numbers
我有一个图块网格,每个图块的坐标为 (-3, 5) 或 (1, 540) 我想为每个图块生成一个唯一的种子,但我还没有找到这样做的方法
如果您有一个图块网格,您可能会认为在左上角有一个 第一个图块和一个 最后一个图块 在右下角。
[0] [1] [2]
[3] [4] [5]
[6] [7] [8]
但是 [Row:Col]
符号更方便。
[0:0] [0:1] [0:2]
[1:0] [1:1] [1:2]
[2:0] [2:1] [2:2]
因此您可以使用以下公式访问 [Row:Col]
元素:
ColumnCount = 3
Element = (Row * ColumnCount) + Col
例如,您的网格中的 (2:1)
偏移量将是 2*3+1
,即 7
。
[0:0] [0:1] [0:2]
[1:0] [1:1] [1:2]
[2:0] [2:1] [2:2]
--v--
2*3+1 = 7
这很简单,每个图块都有一个唯一的标识符。
您需要某种“配对函数”- Wiki 描述了用于自然数的此类函数,而您需要包括负数在内的整数。
可以螺旋方式枚举坐标平面上的所有整数点
^ OY
|
16 15 14 13 12
17 4 3 2 11
18 5 0 1 10 ==> OX
19 6 7 8 9
20 21 22 23 24
因此,例如,点 -2,-2
的索引为 20
要从坐标计算此类索引,您可以使用简单的算法(details here)
if y * y >= x * x then begin
p := 4 * y * y - y - x;
if y < x then
p := p - 2 * (y - x)
end
else begin
p := 4 * x * x - y - x;
if y < x then
p := p + 2 *(y - x)
end;
你不要求反向映射,但肯定可以(层数为(1 + floor(sqrt(p))) / 2
等)
待完成:Python反向映射函数
def ptoxy(p):
layer = (int(math.sqrt(p)) + 1) // 2 # integer division
topleft = 4*layer*layer
if p <= topleft:
if p <= topleft - 2 * layer:
return [layer, 3*layer + p - topleft]
else:
return [-layer + topleft - p, layer]
else:
if p >= topleft + 2 * layer:
return [p-topleft - 3*layer, -layer]
else:
return [-layer, layer-p + topleft]
我有一个图块网格,每个图块的坐标为 (-3, 5) 或 (1, 540) 我想为每个图块生成一个唯一的种子,但我还没有找到这样做的方法
如果您有一个图块网格,您可能会认为在左上角有一个 第一个图块和一个 最后一个图块 在右下角。
[0] [1] [2]
[3] [4] [5]
[6] [7] [8]
但是 [Row:Col]
符号更方便。
[0:0] [0:1] [0:2]
[1:0] [1:1] [1:2]
[2:0] [2:1] [2:2]
因此您可以使用以下公式访问 [Row:Col]
元素:
ColumnCount = 3
Element = (Row * ColumnCount) + Col
例如,您的网格中的 (2:1)
偏移量将是 2*3+1
,即 7
。
[0:0] [0:1] [0:2]
[1:0] [1:1] [1:2]
[2:0] [2:1] [2:2]
--v--
2*3+1 = 7
这很简单,每个图块都有一个唯一的标识符。
您需要某种“配对函数”- Wiki 描述了用于自然数的此类函数,而您需要包括负数在内的整数。
可以螺旋方式枚举坐标平面上的所有整数点
^ OY
|
16 15 14 13 12
17 4 3 2 11
18 5 0 1 10 ==> OX
19 6 7 8 9
20 21 22 23 24
因此,例如,点 -2,-2
的索引为 20
要从坐标计算此类索引,您可以使用简单的算法(details here)
if y * y >= x * x then begin
p := 4 * y * y - y - x;
if y < x then
p := p - 2 * (y - x)
end
else begin
p := 4 * x * x - y - x;
if y < x then
p := p + 2 *(y - x)
end;
你不要求反向映射,但肯定可以(层数为(1 + floor(sqrt(p))) / 2
等)
待完成:Python反向映射函数
def ptoxy(p):
layer = (int(math.sqrt(p)) + 1) // 2 # integer division
topleft = 4*layer*layer
if p <= topleft:
if p <= topleft - 2 * layer:
return [layer, 3*layer + p - topleft]
else:
return [-layer + topleft - p, layer]
else:
if p >= topleft + 2 * layer:
return [p-topleft - 3*layer, -layer]
else:
return [-layer, layer-p + topleft]