C 行、列、深度值的多维数组索引?

C 行、列、深度值的多维数组索引?,c,math,C,Math,我有几个值是多维数组的偏移量,如下所示: static const int TILE_SIZE = 32; int Offset2D = (y * TILE_SIZE) + (x * TILE_SIZE); int Offset3D = (y * TILE_SIZE) + (x * TILE_SIZE) + (z * TILE_SIZE); 现在我要做的是将偏移量转换为x,y,z对,如下所示: void ConvertBack(int offset,int size,int& x,in

我有几个值是多维数组的偏移量,如下所示:

static const int TILE_SIZE = 32;
int Offset2D = (y * TILE_SIZE) + (x * TILE_SIZE);
int Offset3D = (y * TILE_SIZE) + (x * TILE_SIZE) + (z * TILE_SIZE);
现在我要做的是将偏移量转换为x,y,z对,如下所示:

void ConvertBack(int offset,int size,int& x,int& y,int& z)
{
    //What's wrong with this code ?
    x = offset / size;
    y = offset % size;
    z = ??; //How to get Z?
}

//从任何维度获取偏移量?
void ConvertBackComplex(无符号整数偏移量、整数大小、整数*向量、整数长度)
{
对于(int i=0;i

…到目前为止,我所有的尝试都失败了…所以我真的很欢迎任何帮助

假设所有尺寸都是
TILE\u SIZE
长的,则偏移计算是错误的。假设我有一个数组
a
,它模拟了所有尺寸的3d数组
TILE\u SIZE
长:

int a[TILE_SIZE * TILE_SIZE * TILE_SIZE];
然后,坐标为
(x,y,z)
的点
p
的偏移量如下:

int p_offset = z * (TILE_SIZE * TILE_SIZE)
             + y * (TILE_SIZE)
             + x;
然后,反向计算为:

int p_z = p_offset / (TILE_SIZE * TILE_SIZE);
int p_y = (p_offset - p_z * (TILE_SIZE * TILE_SIZE)) / TILE_SIZE;
int p_x = p_offset % TILE_SIZE;

您可以选择不同的维度顺序
(x,y,z)
,但您必须保持一致。

首先,我认为您的索引系统有点不正确。按不同的x、y和z值排列可以得到相同的偏移量。首先,假设TILE_SIZE是数组中存储给定点数据的单元数:

myArray = new arr[xSize*ySize*zSize*TILESIZE]
int offset2D = (x*ySize*zSize + y*zSize)*TILE_SIZE;
int offset3D = (x*ySize*zSize + y*zSize + z)*TILE_SIZE;
要从偏移量返回x、y、z,只需执行以下操作:

temp = offset/TILE_SIZE;
x = temp/(ySize*zSize);
y = (temp%(ySize*zSize))/zSize;
z = (temp%(ySize*zSize))%zSize;
对于多个维度:

temp = offset/TILE_SIZE;
sizeProduct = 1;
for(int k=1; k<numDims; ++k)
{
    sizeProduct*=size[k];
}
for(int i=0; i<numDims; ++i)
{
    vector[i]=temp/sizeProduct;
    temp = temp % sizeProduct;
    if((i+1)<numDims)
    {
        sizeProduct/=sizes[i+1];
    }
}
int arraySize = TILE_SIZE;
for(int i=0; i<numDims; ++i)
{
    arraySize*=sizes[i];
}
temp=偏移量/瓷砖尺寸;
sizeProduct=1;

对于(int k=1;k假设尺寸从X到Y到Z(如X表示最低尺寸):

不能使用单个函数将二维和三维偏移计算回坐标

对于2D:

void ConvertBack2D(int offset, int x_len, int &x, int &y)
{
    y = offset / x_len;
    x = offset % x_len;
}
对于3D:

void ConvertBack3D(int offset, int x_len, int y_len, int &x, int &y, int &z)
{
    z = offset / (x_len * y_len);
    y = (offset - (x * x_len * y_len)) / y_len;
    x = (offset - (x * x_len * y_len)) % x_len;
}

非常好!但是我只是对多维反转函数版本有点好奇…我该如何计算数组的长度和索引(希望我没有问太多:p)?我现在将其添加到我的答案中。如果它比您想要的更一般,那么很抱歉。我对每个维度使用了任意大小。版本也很好且易于理解!感谢您的输入!
void ConvertBack2D(int offset, int x_len, int &x, int &y)
{
    y = offset / x_len;
    x = offset % x_len;
}
void ConvertBack3D(int offset, int x_len, int y_len, int &x, int &y, int &z)
{
    z = offset / (x_len * y_len);
    y = (offset - (x * x_len * y_len)) / y_len;
    x = (offset - (x * x_len * y_len)) % x_len;
}