(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]

and link to quick-made test