문제

나의 번호를 가지고 직육면체의 위치 및 크기는 주로 최소값과 최대 x, yz 좌표(그래서 그들은 병렬 메인 축).

예:내가 다음과 같은 3 겹쳐집니다:

10.5 <= x <= 39.4,  90.73 <= y <= 110.2, 90.23 <= z <= 95.87
20.1 <= x <= 30.05,  9.4  <= y <=  37.6,  0.1  <= z <= 91.2
10.2 <= x <= 10.3,   0.1  <= y <=  99.8, 23.7  <= z <= 24.9

면 다음을 제공 포인트(예: (25.3,10.2,90.65)),하는 방법이 있을 신속하게 확인하려 cuboid(s)나는가?

  • 분명히 그 반복을 통해 모든 직육면체 있지만,잠재적으로 그들의 수백만,나는 이보다 더 빨리 갈 단순 반복(무언가를 O(로그 n)또는 더 좋은 것입).

  • 이처럼 내게 들리는"퍼지 일치하는"유형 문제,그리고 나가는 것을 알 아파치 루씬 지원 범위 쿼리, 지만,이 작업은 반대 방향으로 라운드(을 찾는 점에서 입방 보다는 오히려 입방을 포함하는 시점).

  • 약간 복잡한 문제를 더욱 번호의 크기보다 클 수도 있 3(수 있 20);즉내가 찾는 사람은"hypercuboids"보다는 겹쳐집니다.)

도움이 되었습니까?

해결책

하나의 간단한 방법으로 가속화하는 것이 이 쿼리를 구성하여 다음 uniform 그리드 데이터 구조(자주라고 쓰레기통)으로 사전 처리 단계:어 n x n x n (3d)그리드 통해 귀하의 현장에 대한 모든 셀의 격자의 포인터를 저장하는 모든 직육면체를 교차하는 세포입니다.지금에 대한 쿼리점 계산할 수 있습에서 직접하는 세포 그것은에서 균일한 그리드,그리고 당신은 확인 해야만 직육면체 관련 셀,과하지 않는 모든 겹쳐집니다.

따라 얼마나 큰 공간은 어떻게 다양한 입방형 크기는 이 방법은 되지 않을 수도 있습니다 매우 효율적이기 때문에 당신이 어려울 수 있습니다 좋은 선택 n 해상도를 가속화하 충분히고 필요하지 않습니다 엄청난 양의 세포이다.이것을 극복할 수 있습을 들여다보십시오 더 적응 방법으로 파티션,공간 등 kd-트 (kd-나무에서 위키백과), 는 기본적으로 이진 나무는 분할 공간으로 축 정렬 비행기:보에 대한 예 여기에는 붉은 비행기를 나누는 상자에는 두 부분으로 그리고 녹색 작은 부품,다른...

kd-tree

를 사용하여 쿼리 kd-트리가 먼저 트래버스는 리프의 kd-트리는 쿼리점 위치하고 있음을 확인과 현지 직육면체에서 수 있습니다. 다른 공간을 데이터 분할 구조 옵션을 찾을 수 있습니다 .

또 다른 옵션을 사용하는 것입 경계로 볼륨 계층 구조, 그룹,객체를 함께서 경계와 그 경계 그룹 볼륨으로 더 큰 경계 볼륨과 그에...을 얻을 계층 구조의 경계니다.이러한에 잘 적응하는 현장 및 수 있다 쉽게 처리하는 개체의 이동,하지만 나는 생각에 대한 설정은 공간 분할 잘 일할 수 있는...어쨌든,자세한 내용을 참조하십시오 이 책의 챕터.

다른 팁

당신이 다가갑의 영토로"바이너리 공간 분할"과"충돌 감지";기본적으로 아이디어는 기본적으로 저장하는 겹쳐집니다 나무 유형 구조를 나누는 그들이 차지하는 공간으로 깔끔한 작은 상자입니다.에 대한 결정하는"공간의 일부"서로 직육면체를 차지하는 동안에 삽입 나무 strucutre.

Google 검색에 Octrees.

조국 나누어,3 차원 공간 및 객체 내에 포함되는 공간이 아주 큰 부분을 컴퓨터 과학;대부분의 개발에 사용되는 컴퓨터 게임.의 일부를 알고리즘으로 고려간 요소,즉는 물체 간에 이동 파티션 공간이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top