2

多次元配列へのオフセットである値がいくつかあり、次のようになります。

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 ?... ?
    }
}

...これまでのところ、私の試みはすべて失敗しています....だから、どんな助けも大歓迎です!...

4

3 に答える 3

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];
}

複数の次元で配列インデックスを計算するには (ベクトルが座標の配列であると仮定します):

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;
于 2012-08-24T16:43:00.613 に答える
1

次元が X から Y、Z に移動すると仮定します (X が最小次元を表すように):

1 つの関数を使用して、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;
}
于 2012-08-24T17:00:22.950 に答える
1

すべての寸法がTILE_SIZE長いと仮定すると、オフセットの計算は間違っています。すべての次元が長いa3D 配列をシミュレートした配列があるとします。TILE_SIZE

int a[TILE_SIZE * TILE_SIZE * TILE_SIZE];

次にp、座標(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;

ディメンションの異なる順序を選択できます(x, y, z)が、一貫性を保つ必要があります。

于 2012-08-24T16:40:01.683 に答える