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

时间:2012-08-24 16:19:35

标签: 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,int& y,int& z)
{
    //What's wrong with this code ?
    x = offset / size;
    y = offset % size;
    z = ??; //How to get Z?
}

//Get back offsets from any dimension ?

void ConvertBackComplex(unsigned int offset,int size,int* vector,int len)
{
    for (int i = 0;i < len;i++)
    {
        vector[i] = offset ?... ?
    }
}

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

3 个答案:

答案 0 :(得分:5)

首先,我认为你的索引系统有点偏。你有不同的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];
}

计算多维的数组索引(假设vector是你的坐标数组):

int index =0;
sizeProduct = 1;
for(int k=1; k<numDims; ++k)
{
    sizeProduct*=size[k];
}
for(int i=0; i<numDims; ++i)
{
    index+=sizeProduct*vector[i];
    if((i+1)<numDims)
    {
        sizeProduct/=sizes[i+1];
    }
}
index*=TILE_SIZE;

答案 1 :(得分:1)

假设所有维度都为TILE_SIZE长,则偏移计算错误。假设我有一个数组a来模拟所有维度TILE_SIZE长的3d数组:

int a[TILE_SIZE * TILE_SIZE * TILE_SIZE];

然后,坐标为p的{​​{1}}点会产生如下偏移量:

(x, y, z)

然后反向计算:

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; ,但必须保持一致。

答案 2 :(得分:1)

假设尺寸从X到Y到Z(如在X中表示最低尺寸):

您不能使用单一功能计算回到坐标的2D和3D偏移。

对于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;
}