2012-04-14 3 views
2

인덱스 0에서 x * y * z까지의 3D 데이터 구조를 나타 내기 위해 1D 벡터를 사용합니다. 여기서 x, y 및 z는 각 방향의 셀 수입니다. 인덱스하기 위해1D 벡터 - 3D 인덱스

특정 셀 [XI] [일] [ZI], 내가 사용 :

index = xi + x*yi + x*y*zi ; 

내 문제는, 내가 다른 길을 갈 방법을 작동하지 않을 수 있습니다!

xi = index % x ; 

하지만 난 내 인생은 다른 사람을 얻을 수에 대한 .. : 나는 내가 XI을 얻는 방법 일 것 같아 지수 43

에 표시된 각각의 좌표를 얻으려면 :/

EDIT : 흠. 이게 옳은 거니?

xi = index % x; 
yi = ((index - xi)/x) % y; 
zi = ((index - xi - x*yi)/x)/y ; 
+0

편집이 올바르지 만 정수 구분으로 인해 빼기가 필요하지 않습니다. – SirGuy

답변

4

이 시도 하나는 예상대로

xi = index % x; 
yi = (index/x) % y; 
zi = ((index/x)/y) % z; 

이 쉽게 일반화 될 수 있습니다.

+0

'% z'는 불필요 합니다만, 이것을 일반화하는 방법을 명확하게 보여줍니다. 천국 누군가가 4, 5 또는 6 차원 배열을 필요로하는 것을 금하십시오! – SirGuy

+0

"그들은"체스 프로그램에서 ~ 7 차원 배열을 사용한다고 들었습니다.) 자동 체이더 배열 인덱싱이 가능하기 때문에 '% z'는 나쁘지 않습니다. 편리합니다. – Anthales

+0

주기 배열 인덱싱을 승인 할 것인지 확신 할 수 없습니다. 인덱스가 내 배열보다 크면 오류가 발생하지만 사이클링에서는이를 숨길 수 있습니다. 다른 환경에서는 편리하지만, 편리하다면 승인 할 수 있습니다. – SirGuy

1

일부 모듈러 연산이 트릭을 수행해야합니다. 그런 다음 마지막으로

(index/x) % y = yi. 

:

index/(x * y) = zi. 

는 편집이 : (위의 수학 반대) 코드에서

이 될 것이다 : 이순신에 대한 다음

index % x = (xi + x*yi + x*y*zi) % x = xi % x, 
    but 0 <= xi < x therefore xi % x = xi. 

,210
xi = index % x; 
    yi = (index/x) % y; 
    zi = index/(x * y); 
+0

좋은 답변 ... 코드 사이트 일 수 있으므로 적어도 마지막 방정식을 코드가 될 수있는 것처럼 보이게 만드시겠습니까? (저는 그런 식의 연산자를 본적이 없습니다) – Shep

+0

@Shep 당신 말이 맞아요. 나는 수학적인 질문을 너무 좋아해서 그 작은 세부 사항을 잊어 버립니다. 대답을 편집했습니다 – SirGuy