Я понимаю, что мой титул не очень понятен, но мне трудно думать о лучшем.Если кто-то хочет исправить это, пожалуйста.
Я разрабатываю структуру данных для моей двухмерной игры с бесконечной вселенной.Структура данных основана на простой (!) Системе узел / лист, такой как R-Tree .
. Это базовая концепция: вы задаете, сколько дочерних элементов вы хотите, чтобы узел (aконтейнер) иметь максимум.Если вы хотите добавить лист, но узел, в котором должен быть лист, заполнен, то он создаст новый набор узлов в этом узле и переместит все текущие листы в их новый (более точный) узел.Таким образом, в очень населенных районах будет гораздо больше подразделений, чем в очень больших, но редко посещаемых областях.
Это работает для обычных объектов.Единственная проблема возникает, когда у меня больше, чем maxChildsPerNode объектов с одинаковым расположением X, Y: поскольку узел заполнен, он будет создавать более точные подузлы, но все старые листы будут снова помещены в один и тот же узел, потому что они имеютточно такая же позиция - в результате получается бесконечный цикл создания большего количества узлов и большего количества узлов.
Итак, что мне делать, если я хочу добавить больше листьев, чем maxChildsPerNode с точно такой же позицией в мое дерево?
PS.если я не смог объяснить свою проблему, пожалуйста, сообщите мне, чтобы я мог попытаться улучшить объяснение.
Обновление : таким образом я проверяю, все ли листья в полном узле имеют одинаковые позиции:
//returns whether all leafs in the given leaf list are identical
private function allLeafsHaveSamePos(leafArr:Array<RTLeaf<T>>):Bool {
if (leafArr.length > 1) {
var lastLeafTopX:Float = leafArr[0].topX;
var lastLeafTopY:Float = leafArr[0].topY;
for (i in 1...leafArr.length) {
if ((leafArr[i].topX != lastLeafTopX) || (leafArr[i].topY != lastLeafTopY)) return false;
}
}
return true;
}