3

3D配列のインデックス用に3intに変換したいintがあります。これは、私が取り組んでいることの例です。

byte[,,] array = new byte[XSize, YSize, ZSize];

int i = 0;

//other code

array[#,#,#] = cur;

//other code

iだけから#、#、#の正しい番号を取得する方法がわかりません。

4

2 に答える 2

15

Z、Y、Xの順に反復したいとします。。

int zDirection = i % zLength;
int yDirection = (i / zLength) % yLength;
int xDirection = i / (yLength * zLength); 
于 2012-07-03T18:06:08.917 に答える
3

配列空間の方向について仮定する必要があります。0、0、0に対応する0で数値をマッピングし、z、y、xの順に繰り返すと仮定すると、計算はかなり簡単です。

int x;
int y;
int z;

if (i < XSize * YSize * ZSize)
{
    int zQuotient = Math.DivRem(i, ZSize, out z);
    int yQuotient = Math.DivRem(zQuotient, YSize, out y);
    x = yQuotient % XSize;
}

これにより、BlackVegetableのソリューションよりも冗長な操作が節約されることに注意してください。(3、3、3)行列の場合、これにより次のセットが生成されます。

i (x, y, z)
0 (0, 0, 0)
1 (0, 0, 1)
2 (0, 0, 2)
3 (0, 1, 0)
4 (0, 1, 1)
5 (0, 1, 2)
6 (0, 2, 0)
7 (0, 2, 1)
8 (0, 2, 2)
9 (1, 0, 0)
10 (1, 0, 1)
11 (1, 0, 2)
12 (1, 1, 0)
13 (1, 1, 1)
14 (1, 1, 2)
15 (1, 2, 0)
16 (1, 2, 1)
17 (1, 2, 2)
18 (2, 0, 0)
19 (2, 0, 1)
20 (2, 0, 2)
21 (2, 1, 0)
22 (2, 1, 1)
23 (2, 1, 2)
24 (2, 2, 0)
25 (2, 2, 1)
26 (2, 2, 2)

また、これはで元に戻すことができi = z + y * ZSize + x * ZSize * YSizeます。

于 2012-07-03T19:25:05.920 に答える