2012-05-25 2 views
1

quadtree 세분화에서 인접 셀을 찾을 방법이 있습니까? 어느 레벨에서나 선택한 셀에 인접한 모든 셀을 의미합니까?QuadTree의 인접 셀

답변

2

공간 채우기 곡선은 공간 completley를 채우고 2 차원을 1 차원으로 줄입니다. 필자는 phpclasses.org (hilbert 커브)에서 무료 PHP 클래스를 작성했습니다. 그것은 z 곡선, 4 힐버트 곡선과 무어 곡선과 쿼드 키 기능을 포함합니다. 다음은 충돌 감지 및 쿼드 트리에 대한 블로그입니다 : lab.polygonal.de/?p=202?

enter image description here

모튼 일명 Z-곡선 구성하는 것이 용이하다. x와 y 값을 2 진수로 변환하고 값을 연결하십시오. 여기에서 코드를 찾을 수 있습니다 : http://msdn.microsoft.com/en-us/library/bb259689.aspx. 최상위 비트를 사용하여 상위 경계를 확인할 수 있습니다.

+0

감사의 말 Chibox, 프로그래밍의 관점에서 자세한 것은 무엇입니까? – abenci

+0

나는 여전히 내 질문과 z 곡선 사이의 연결을보기가 어렵다. – abenci

+0

행운이 없습니다. 나는 거리의 많은 수준에서조차 선택된 하나에 인접한 세포를 찾을 필요가있다. 그리고 나는 z-curve가 도울 수있는 방법을 이해하지 못한다. 미안하다. – abenci

0

노드가 어떤 자식인지 추적해야합니다. 인접 노드가 동일한 상위 노드에 있으면 그냥 반환하십시오. 그렇지 않다면, 당신은 공통 조상을 찾을 수있을 때까지 나무 위로 걸어 가야합니다. 그런 다음 올바른 레벨로 되돌아 올 때까지 (또는 아래쪽에 도달 할 때까지) 비슷한 경로를 따르십시오.

Node WalkLeft(Node node) 
{ 
    if (node == null) return null; 

    Node leftParent; 
    switch (node.ChildDirection) 
    { 
     case ChildDirection.Root: 
      return null; 
     case ChildDirection.TopRight: 
      return node.Parent.TopLeft; 
     case ChildDirection.BottomRight: 
      return node.Parent.BottomLeft; 
     case ChildDirection.TopLeft: 
      leftParent = WalkLeft(node.Parent); 
      return leftParent.TopRight ?? leftParent; 
     case ChildDirection.BottomLeft: 
      leftParent = WalkLeft(node.Parent); 
      return leftParent.BottomLeft ?? leftParent; 
    } 
} 

다른 방향으로도 마찬가지입니다.

x ?? y은 첫 번째 Null이 아닌 값을 선택합니다.