Немного предыстории дизайнерских решений... Я разработал структуру октодерева, которая может хранить точки. Я решил ограничить рекурсию «поколений» на основе определенного базового размера вокселя. Дочерние узлы создаются только тогда, когда к этому узлу добавляются точки. Это не динамическое графическое приложение — это октодерево и объекты в нем статичны, поэтому предварительная обработка для повышения производительности не вызывает беспокойства.
Теперь я хотел бы добавить «формы» к моему октодереву — в частности, сетку поверхности, состоящую из треугольников. Вершины этих треугольников не соответствуют точкам, хранящимся в октодереве. Как хранить эти фигуры в октодереве? Я вижу два варианта...
Серые узлы «пусты» в том смысле, что они не имеют формы. В варианте 1 фигуры хранятся в каждом узле, с которым они пересекаются, т. е. узел 1a содержит shape1, а узлы 4c и 4d имеют общую форму shape2. В варианте 2 фигуры хранятся только в наименьшем узле, который они пересекают, т. е. узел 1а содержит фигуру1, а узел 4 содержит фигуру2.
Большинство сообщений об октодеревьях, которые я видел, предполагают Alt1, но они никогда не объясняют, почему. Alt2 имеет для меня больше смысла и создаст дополнительную работу только для тех фигур, которые находятся на границах узлов. Почему Alt1 предпочтительнее?
Изменить: Чтобы уточнить, мой используемый язык реализации - C++, поэтому я бы предпочел примеры реализации на этом языке, но вопрос не зависит от языка. Извините, если это неправильное использование тега.
Edit2: хотя это и не имеет прямого отношения к вопросу хранения формы, эта ссылка имеет хорошее обсуждение обхода октодерева, которое стоит за вопросом. Я подумал, что это может помочь любому, кто заинтересован в работе над этим вопросом.
Обновление: Четыре года спустя Alt2 оказался проще в реализации, но очень медленным, потому что большие треугольники, хранящиеся на более высоких уровнях октодерева, проверялись при каждом обходе октодерева — в моем случае это означало от сотен до тысяч ненужных тесты. В итоге я пересмотрел свой код, чтобы использовать вариант R*-Tree, который был легко реализовать и значительно быстрее.
a R*-Tree variant ... was easy to implement and substantially faster
. Меня интересует использование памяти. КакR*-Tree
по сравнению с Octree в отношении использования памяти? Спасибо =) - person user3405291   schedule 22.06.2020