QuadTree : 포인트 만 저장합니까?


9

충돌 감지를 위해 움직이는 객체를 추적하는 쿼드 트리를 개발 중입니다. 각 개체는 경계 모양이 있습니다. 모두 원이라고 가정하겠습니다. (2D 하향식 게임입니다)

각 객체의 위치 만 저장할 것인지 전체 경계 모양을 저장할 것인지 확실하지 않습니다.

점으로 작업하면 객체가 여러 노드에 걸쳐 있지 않으므로 삽입 및 세분화가 쉽습니다. 반면에 객체의 근접성 쿼리는 객체의 크기를 고려하지 않기 때문에 충돌을 놓칠 수 있습니다. 포인트 만있을 때 쿼리 영역을 계산하는 방법은 무엇입니까?

인접 노드의 객체 간 충돌

리전으로 작업하는 경우 여러 노드에 걸쳐있는 객체를 처리하는 방법은 무엇입니까? 이것이 노드 용량을 초과하더라도 완전히 포함 된 가장 가까운 상위 노드에 삽입해야합니까?

어떤 노드에 빨간색 개체가 포함되어야합니까?

감사.

답변:


4

쿼드 트리에 확장 객체 (영역)를 저장하는 경우 해당 객체는 접촉하는 모든 리프 노드에서 참조되어야합니다. 가장 일반적인 조상을 찾고 거기에 저장하려고 시도하지 않을 것입니다. 높은 수준의 경계를 가로 지르는 작은 물체는 매우 높은 노드로 끝나고 그 밖의 모든 것에 대해 테스트해야하기 때문입니다. 충돌 쿼리 등을 수행 할 때 고급 노드.

그러나 큰 객체는 많은 노드에서 참조 될 수 있으므로 이동시 업데이트 비용이 많이 들고 충돌 등을 위해 여러 번 다시 확인하게되므로주의해야합니다. 사용 사례에 따라 트리에서 더 높은 수준으로 큰 객체를 저장하기 위해 일종의 휴리스틱을 사용할 가치가 있지만 알고리즘을 복잡하게 만들 수 있기 때문에 특정 경우에 실제로 성능 문제가 아니라면 귀찮게하지 않을 것입니다.

마찬가지로 영역을 쿼리하려면 쿼리 된 영역이 터치하는 모든 리프 노드를 살펴 봐야합니다.

이들은 기본적으로 동일한 알고리즘을 사용하는데, 이는 영역으로 시작하여 트리를 아래로 밀어 터치 한 리프 노드를 찾습니다. 깊이 우선 순회이지만 각 노드에서 해당 지역에 닿지 않는 모든 어린이를 제거 할 수 있습니다. 순회 위치를 추적하려면 스택을 유지해야합니다.


감사합니다. 물론, 노드 간 객체를 처리하는 것은 노드 내부에있는 객체보다 느리지 만 그 주변에서는 볼 수 없습니다. 조각화를 막기 위해 노드 용량을 늘릴 수는 있지만 충돌 감지에 포함 된 객체의 수가 증가합니다. 나는 좋은 균형을 찾기 위해 그걸 가지고 놀 것이다.
alekop

4

용량을 초과하더라도 완전히 포함하는 가장 작은 노드에 저장해야합니다 (크기 조정 가능 컨테이너 사용).


2

@Nathan Reed의 답변에 대한 응답으로 이것을 주석으로 추가 할 것입니다. 단, 주석 이기에는 너무 크지 않으며 어쨌든 별도의 대답이 될만한 가치가 있습니다.

우리는 그의 답변에서 제안 된 것을 정확하게하고 있었으며 실제로이 페이지에 링크 된 소스에 의견이 있습니다. 대부분의 경우 2 ~ 3 개월에 한 번씩 엄청난 양의 검색 쿼리로 인해 응답하지 않는 서버가 무작위로 손실되는 것을 제외하고는 매우 잘 작동했습니다.

이 문제의 원인을 알아 내려고 시도하는 성능 검사를 수행하는 동안 문제의 근본 원인이 주목되었습니다. 겹치는 객체를 허용하는 경우에만 문제가 될 수 있습니다. 우리의 게임에서는 최악의 경우 성능 저하로 인한 스파이크가 발생할 수 있습니다.

우리는 경계 디스크가있는 약 100 개의 객체가 아주 근접한 곳에 모여있는 한 가지 경우를 가지고있었습니다. 이는 객체가 쿼드 트리 노드가 차지하는 면적보다 큰 지점에 도달하여 각 새로운 객체가 여러 노드에 나타나고 문제를 통제 할 수없는

개체 영역이 겹치게 할 경우, 개체가 꽉 조여 있으면 나무가 너무 깊어지지 않도록 사물을주의 깊게 살펴보십시오.

현재 조사중인 솔루션은 객체를 점으로 저장 한 다음 검색을 수행 할 때 검색 사각형의 범위를 트리에 저장된 최대 반경만큼 늘리는 것입니다. 트리는 첫 번째 패스 검색이기 때문에 몇 가지 다른 기준 검사와 함께 실제 원 기반 범위 검사를 수행하므로 잘못된 경고가 필터링됩니다.

실제 마일리지는 다를 수 있습니다.

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