如何计算3D坐标的线性索引,反之亦然?

use*_*116 9 arrays math matrix multidimensional-array coordinate-transformation

如果我有一个点(x,yz),我如何找到线性指数,i为该点?我的编号方案是(0,0,0)是0,(1,0,0)是1 ,. ..,(0,1,0)是max-x-dimension,....另外,如果我有一个线性坐标,i,我如何找到(x,y,z)?我似乎无法在谷歌上找到这个,所有的结果都充满了其他无关紧要的东西.谢谢!

Kev*_*vin 23

有几种方法可以将3d坐标映射到单个数字.这是一种方式.

一些函数f(x,y,z)给出坐标(x,y,z)的线性索引.它有一些我们想要得到的常量a,b,c,d,所以我们可以编写一个有用的转换函数.

f(x,y,z) = a*x + b*y + c*z + d
Run Code Online (Sandbox Code Playgroud)

你已经指定(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
Run Code Online (Sandbox Code Playgroud)

那已经解决了.你已经指定(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
Run Code Online (Sandbox Code Playgroud)

那已经解决了.让我们随意决定(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
Run Code Online (Sandbox Code Playgroud)

那已经解决了.让我们任意决定(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)
Run Code Online (Sandbox Code Playgroud)

既然我们知道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
}
Run Code Online (Sandbox Code Playgroud)

您可以通过类似逻辑从线性索引获取坐标.我有一个真正奇妙的演示,这个页面太小,无法包含.所以我将跳过数学讲座,并给你最后的方法.

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)
}
Run Code Online (Sandbox Code Playgroud)

  • @MarkAnderson,如果我没记错的话,在我编写`coordinateFromLinearIndex`时,数学讲座只存在于我脑海中.我可以编辑答案来展示我如何派生出最终的代码块,但首先我需要记住我是如何做到的:-) (2认同)