Могут ли R-деревья поддерживать z-порядок при использовании двух измерений? - PullRequest
3 голосов
/ 26 августа 2010

Я пишу реализацию R-Tree на основе оригинальной статьи Гутмана. Я думал об использовании R-Tree для программы, которую я пишу, которая включает в себя множество прямоугольников на экране, которые можно перемещать / масштабировать с помощью мыши.

Я хочу эффективно выбирать только прямоугольники, которые находятся в определенном прямоугольнике, и рисовать их (вместо того, чтобы перебирать потенциально более 100 элементов и проверять, пересекаются ли границы). Проблема, которую я обнаружил после прочтения статьи Гутмана, заключается в том, что z-порядок нельзя поддерживать для 2D-объектов.

Например, если я переместлю объект, он будет удален, а затем снова вставлен. Когда он вставлен заново, узел, в который он вставлен, не сможет отслеживать правильный порядок. Большинство реализаций R-Tree, которые я видел, используют массив и просто находят пустую позицию. Повторная вставка фактически уничтожит любое позиционирование в z-порядке.

Поэтому, когда я рисую все прямоугольники, которые пересекаются с прямоугольником, порядок их возврата не обязательно является правильным.

Я ошибаюсь в этом предположении? Я думал, что вместо использования массива я мог бы использовать дерево AVL или красно-черное дерево и использовать Comparer, который сравнивается по z-index для вставки в дерево. Таким образом, z-порядок всегда поддерживается (и это самый важный фактор).

Я также думал о сортировке, когда они вернутся, но я думаю, это может быть дороже.

1 Ответ

2 голосов
/ 26 августа 2010

R-дерево не должно каким-либо образом упорядочивать записи ответов.

Просто отсортируйте ответ.Это не слишком медленно.

Кстати, я могу отправить вам мой код r-дерева.Это прекрасно работает для меня, но было бы очень полезно, если бы кто-нибудь проверил, что написал Гутман или Бекман в своих статьях ...

Порядок пространственной индексации существенно отличается от строгого порядка ... это различиемежду пространственным индексированием и просто B + -деревом.

Вы также можете иметь два индекса и присоединиться к ним.Вы действительно уверены, что вам нужен индекс?Что-то работает медленно?

...