(LUA) 从2个数字生成唯一数字

我有一个具有坐标的网格瓦片,例如(-3,5)或(1,540),我想为每个瓦片生成一个唯一的种子,但我还没有找到一种方法来实现。

原文链接 https://stackoverflow.com/questions/70502860

点赞
stackoverflow用户10953006
stackoverflow用户10953006

如果你有一个瓷砖网格,你可以考虑你有一个位于左上角的_第一个瓷砖_和一个位于右下角的_最后一个瓷砖_。

[0] [1] [2]
[3] [4] [5]
[6] [7] [8]

但是使用[行:列]的表示更加方便。

[0:0] [0:1] [0:2]
[1:0] [1:1] [1:2]
[2:0] [2:1] [2:2]

因此,你可以使用以下公式访问[行:列]的元素:

列数=3
元素=(行*列数)+列

例如,你网格中的(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

这很简单,每个瓷砖都将有一个唯一的标识符。

2021-12-28 05:20:00
stackoverflow用户844416
stackoverflow用户844416

你需要一种“配对函数” - 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

要从坐标计算出这样的索引,可以使用简单的算法(详情请参见此处

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]

和快速制作的测试链接

2021-12-28 08:53:00