有几种方法可以将 3d 坐标映射到单个数字。这是一种方法。
某个函数 f(x,y,z) 给出坐标 (x,y,z) 的线性索引。它有一些我们想要导出的常数 a,b,c,d,这样我们就可以编写一个有用的转换函数。
f(x,y,z) = a*x + b*y + c*z + d
您已指定 (0,0,0) 映射到 0。所以:
f(0,0,0) = a*0 + b*0 + c*0 + d = 0
d = 0
f(x,y,z) = a*x + b*y + c*z
这就解决了。
您已指定 (1,0,0) 映射到 1。所以:
f(1,0,0) = a*1 + b*0 + c*0 = 1
a = 1
f(x,y,z) = x + b*y + c*z
这就解决了。
让我们任意决定 (MAX_X, 0, 0) 之后的下一个最大数是 (0,1,0)。
f(MAX_X, 0, 0) = MAX_X
f(0, 1, 0) = 0 + b*1 + c*0 = MAX_X + 1
b = MAX_X + 1
f(x,y,z) = x + (MAX_X + 1)*y + c*z
这就解决了。
让我们任意决定(MAX_X, MAX_Y, 0)之后的下一个最大数是(0,0,1)。
f(MAX_X, MAX_Y, 0) = MAX_X + MAX_Y * (MAX_X + 1)
f(0,0,1) = 0 + (MAX_X + 1) * 0 + c*1 = MAX_X + MAX_Y * (MAX_X + 1) + 1
c = MAX_X + MAX_Y * (MAX_X + 1) + 1
c = (MAX_X + 1) + MAX_Y * (MAX_X + 1)
c = (MAX_X + 1) * (MAX_Y + 1)
现在我们知道了 a、b、c 和 d,我们可以编写如下函数:
function linearIndexFromCoordinate(x,y,z, max_x, max_y){
a = 1
b = max_x + 1
c = (max_x + 1) * (max_y + 1)
d = 0
return a*x + b*y + c*z + d
}
您可以通过类似的逻辑从线性索引中获取坐标。我有一个非常棒的演示,这个页面太小而无法包含。所以我就跳过数学课,只给你最后的方法。
function coordinateFromLinearIndex(idx, max_x, max_y){
x = idx % (max_x+1)
idx /= (max_x+1)
y = idx % (max_y+1)
idx /= (max_y+1)
z = idx
return (x,y,z)
}