Який спосіб є кращим для зберігання великих геометричних предметів у квадраті?


15

Розміщуючи геометричні об'єкти в квадраті (або октреві), ви можете розміщувати об'єкти, розмір яких більший за один вузол, кількома способами:

  1. Розміщення посилання на об'єкт у кожному листі, для якого він міститься
  2. Розміщення посилання на об'єкт у найглибшому вузлі, для якого він повністю міститься
  3. І №1, і №2

Наприклад:

введіть тут опис зображення

На цьому зображенні ви можете розмістити коло у всіх чотирьох вузлах листів (метод №1) або лише в кореневому вузлі (метод №2) або в обох (метод №3).

Для запиту квадрату, який метод є більш звичним і чому?


1
Безумовно, це повинно бути довідкою. Я маю намір запитати, чи для запитів у квадрату повинні бути посилання на листя, не листя або те й інше.
nsantorello

PS Відредагований, щоб сподіватися зробити наміри питання зрозумілішими.
nsantorello

Який запит ви намагаєтеся підтримати?
Джо

@Joe Я особливо зацікавлений у виявленні зіткнень, просторовій індексації та вибиванні регіону / фрусту.
nsantorello

1
@nsantorello Правило може бути різним залежно від того, який із запитів ви хочете підтримати, але це здається дуже актуальним для виявлення зіткнень: stackoverflow.com/questions/4434335/…
Джо,

Відповіді:


8

Якщо припустити, що ви зберігаєте посилання, а не сам об’єкт, це може мати сенс робити це по-різному, залежно від вашої програми.

Наприклад, якщо ви обчислювали зіткнення з цим (суцільним) колом, і зіткнення відбувалося в нижньому лівому куті, було б простіше, якби ви мали доступ до всієї геометрії цього листа безпосередньо з цього листа (метод №3) (без необхідності пересувати дерево вгору та визначати успадковану геометрію). Але, скажімо, ви просто використовували квадрати для малювання геометрії, ви хочете скористатися методом №1, тому що лише має сенс намалювати щось у вузлі, для якого воно повністю міститься (було б складніше розібратися, яка частина намалювати для кожного вузла листя і де).

Що стосується більш звичного, то мій єдиний досвід роботи з квадратами - це написання моделювання n-body, де геометричні об'єкти справді були лише точками, які не мали області, тому я не можу остаточно відповісти на це.


Дякую Рафі, я думаю, ви праві, що це залежить від програми.
nsantorello

6

Однією з переваг Quadtree є те, що вам не доведеться розділяти вузол на його дочірніх вузлах, якщо всі дочірні вузли містили б однакову інформацію. Це може заощадити багато пам’яті та швидше обробити.

Дотримуючись цього принципу, я думаю, що має сенс зберігати його лише в кореневому вузлі (метод №2). Це може заощадити багато пам’яті, і я думаю, що це також полегшить обробку. Наприклад, якщо ви намагалися знайти перетини кола з лінією, яка проходить через три вузли аркуша, вам потрібно буде або обчислити перетин окремо для кожного вузла аркуша, або пам’ятайте, що ви вже перетиналися з цим колом.

З іншого боку, якщо у вас є об'єкти в вузлах листків, це може допомогти вам усунути помилкові позитиви (об’єкти, які ви повинні перевірити на перетин, оскільки вони знаходяться у правильному вузлі, але насправді вони не перетинаються).

Отже, я думаю, що обидва підходи мають своє використання, і я не впевнений, як вибрати, який із них використовувати.

Напевно, я б не використовував підхід №3, тому що я не бачу жодних позитивів щодо цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.