쿼드 트리에 큰 기하학적 객체를 저장하는 데 어떤 방법이 선호됩니까?


15

쿼드 트리 (또는 옥트리)에 기하학적 객체를 배치 할 때 몇 가지 방법으로 단일 노드보다 큰 객체를 배치 할 수 있습니다.

  1. 객체의 참조를 포함하는 모든 리프에 객체 참조 배치
  2. 객체 참조가 완전히 포함 된 가장 깊은 노드에 객체 참조 배치
  3. # 1과 # 2

예를 들면 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

이 이미지에서는 네 개의 리프 노드 (방법 # 1) 또는 루트 노드 (방법 # 2) 또는 둘 다 (방법 # 3)에 원을 배치 할 수 있습니다.

쿼드 트리를 쿼리하기 위해 어떤 방법이 더 보편적이며 왜 그럴까요?


1
확실히 참조해야합니다. 쿼드 트리 쿼리를 위해 잎, 잎 또는 잎에 참조가 있어야하는지 묻고 자합니다.
nsantorello

PS 질문의 의도를보다 명확하게하기 위해 편집되었습니다.
nsantorello

지원하려는 검색어는 무엇입니까?
Joe

@Joe 저는 특히 충돌 감지, 공간 인덱스 및 영역 / 절두체 컬링에 관심이 있습니다.
nsantorello

1
@nsantorello 지원하려는 쿼리에 따라 규칙이 다를 수 있지만 충돌 감지와 매우 관련이있는 것 같습니다 : stackoverflow.com/questions/4434335/…
Joe

답변:


8

객체 자체가 아닌 참조를 저장한다고 가정하면 응용 프로그램에 따라 다르게 수행하는 것이 좋습니다.

예를 들어,이 (솔리드) ​​원과의 충돌을 계산하고 왼쪽 하단에서 충돌이 발생한 경우 해당 잎에서 해당 잎의 모든 형상에 직접 액세스 할 수 있으면 더 쉬울 것입니다 (방법 # 3). (트리를 위로 가로 질러 상속 된 지오메트리를 결정할 필요없이). 그러나 지오메트리를 그리기 위해 쿼드 트리를 사용하고 있다고 가정하면 방법 # 1을 사용하고 싶습니다. 방법이 완전히 포함 된 노드에서 무언가를 그리는 것이 의미가 있기 때문에 (어떤 부분을 알아내는 것이 더 어려울 것입니다) 각 리프 노드와 위치에 대해 그립니다.)

더 일반적인 점은 quadtrees에 대한 유일한 경험은 기하학적 객체가 실제로 면적이없는 점인 n-body 시뮬레이션을 작성하는 것입니다. 그래서 나는 확실히 대답 할 수 없습니다.


감사합니다 Rafe, 응용 프로그램에 따라 다르다고 생각합니다.
nsantorello

6

Quadtree의 장점 중 하나는 모든 하위 노드에 동일한 정보가 포함되어 있으면 노드를 하위 노드로 분할 할 필요가 없다는 것입니다. 이를 통해 많은 메모리를 절약하고 처리 속도를 높일 수 있습니다.

이 원칙에 따라 루트 노드 (방법 # 2)에만 저장하는 것이 더 합리적이라고 생각합니다. 많은 메모리를 절약 할 수 있으며 처리가 더 쉬워 질 것이라고 생각합니다. 예를 들어, 3 개의 리프 노드를 통과하는 선이있는 원의 교차점을 찾으려면 각 리프 노드에 대해 별도로 교차점을 계산하거나이 원과 이미 교차 한 것을 기억해야합니다.

반면에 리프 노드에 오브젝트가 있으면 오 탐지 (교차를 확인해야하는 오브젝트가 올바른 노드에 있지만 실제로 교차하지는 않음)를 제거하는 데 도움이 될 수 있습니다.

따라서 두 가지 방법 모두 용도가 있으며 사용할 방법을 선택하는 방법을 잘 모르겠습니다.

나는 접근법 # 3을 사용하지 않을 것입니다. 왜냐하면 그것에 대한 긍정적 인 내용이 없기 때문입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.