2012-05-24 2 views
2

this wikipedia article에 설명 된 기술을 사용하여 쿼드 트리를 만듭니다. 좌표를 2 차원 또는 3 차원 배열에 저장하고 있습니다.다음 순서의 z- 순서 곡선

boost::array<unsigned int, 2 /* 3 */> coord; 

다음 상자의 좌표를 z 순서로 계산하는 방법이 필요합니다. 비트를 인터리빙하여 하나씩 증가시키고 디 인터리빙을 수행하면 작동하지만 매우 복잡해집니다. 비트를 인터리브하지 않고 작동하는 기사의 cmp_zorder (...) 메톤과 비슷한 구현이 있기를 바랍니다.

+0

정확히 무엇을 원하니? 인터리빙 및 디 인터리빙을하지 않고 Z 순서로 (x, y) 옆에있는 (x ', y')? – harold

+0

정확히 맞습니까? – Smittii

+0

확실히, 그러나 나는 어떤 트릭을 들어 보지 못했고, 그래서 내가 생각할 수있는 유일한 방법은 비트 추가 알고리즘을 수정하여 다른 좌표에 캐리를 추가하는 것입니다 (캐리가 x를 y에 더해야 함). , 그리고 carry in y가 x에 추가되어야 함). 비슷한 기술을 3D Z 커브에 사용할 수 있습니다. 그것은 나에게 특히 빠르다고 들리지 않는다. 어쨌든 그런 식으로 관심이 있습니까? – harold

답변

1

좋아 여기 x에서 "절단"부가 알고리즘이고 y는 입력뿐만 아니라 출력하고, 자타의 최하위 비트 인터리빙

int carry = 1; 
do 
{ 
    int newcarry = x & carry; 
    x ^= carry; 
    carry = newcarry; 
    newcarry = (y & carry) << 1; 
    y ^= carry; 
    carry = newcarry; 
} while (carry != 0); 
( the wikipedia article과 동일) x 될 것이다 좌표

나는 그것을 시험해 보았지만 조금만 시험했다.