2012-07-03 4 views
2

3 차원 배열의 인덱스에 대해 3 개의 int로 변환하려는 int가 있습니다. 여기에 대한 예제가 있습니다.1d 배열 인덱스를 3 차원 배열 인덱스로 변환 하시겠습니까?

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

int i = 0; 

//other code 

array[#,#,#] = cur; 

//other code 

그냥 i에서 #, #, #에 올바른 번호를 얻는 방법을 모르겠다.

+0

어떤 방법으로 반복하고 싶습니까? – scottheckel

+1

자세한 정보를 제공해 주시겠습니까? 모든 항목을 반복하려고합니까? 아니면 단일 조회 값에서 단일 요소에 직접 액세스하려고합니까? –

+0

내 이전 의견은 계속 유지됩니다. 입력과 예상 출력을 제공 할 수 있습니까? –

답변

11

Z, Y, X를 차례로 반복한다고 가정합니다. .

int zDirection = i % zLength; 
int yDirection = (i/zLength) % yLength; 
int xDirection = i/(yLength * zLength); 
+1

다른 순서로 고정되었습니다. – BlackVegetable

2

배열 공간의 방향에 대해 가정해야합니다. 가정은 0 0, 0, 0에와 있음을 대응하는 숫자를 매핑하는 당신은 Y가 X 다음 다음에 z 반복, 수학은 매우 간단하다 :이 BlackVegetable의 솔루션을 통해 일부 중복 작업을 저장

int x; 
int y; 
int z; 

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

하는 것으로. 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)