Как преобразовать пространственный индекс ячейки QuadTree (двоичный индекс) в значения положения и размера?

Заранее извините за отсутствие какой-либо терминологии в этом вопросе, но в основном я изучаю создание QuadTree, в котором используется двоичное индексирование, например:

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

Как видно из двух приведенных выше иллюстраций, если каждой ячейке присвоен двоичный идентификатор (например, 1010, 1011), то каждый НЕЧЕТНЫЙ двоичный индекс управляет смещением по оси X, а каждый ЧЕТНЫЙ > двоичные индексы управляют смещением по оси Y.

Например, в случае сетки Уровня 2 (16 ячеек) можно сказать, что 1010 (ячейка №10) имеет 1 на 4-й и 2-й индекс, поэтому они будут выполнять два смещения по оси Y. Первый «1###» (с крайней левой стороны) будет указывать на смещение на одну высоту ячейки, тогда второй «##1#» будет дополнительно смещать его на двойную высоту ячейки.

As in:

// If Cell Height = 64pixels
  1### = 64 pixels
+ ##1# = 128 pixels
__________________
  1#1# = 192 pixels

То же самое можно применить к оси X, только вместо этого используются нечетные числа (например: #1#1).

Теперь, когда я инициализирую свой QuadTree, я начал вычислять максимальное количество узлов, которое оно может содержать, если используются все ячейки и все глубины. Я рассчитал это с помощью суммы 4 в степени каждой глубины:

_totalNodes =   0;

var t:int=0, tLen:int=_maxLevels;
for (; t<tLen; t++) {
    _totalNodes += Math.pow(4, t); //Adds 1, 4, 16, 64, 256, etc...
}

Затем я создаю еще один цикл (от 0 до _totalNodes), который создает экземпляры узлов и сохраняет их в длинном массиве. Он передает целое число текущей итерации конструктору узла и сохраняет его как индекс.

До сих пор я мог определить, на какой глубине (иначе: уровне) будет храниться узел, выяснив наиболее значимый бит его индекса:

public static function MSB( pValue:uint ):int {
    var bits:int =      0;

    while ( pValue >>= 1) {
        bits++;
    }

    return bits;
}

Но теперь я застрял, пытаясь понять, как преобразовать индекс из двоичной формы в фактические позиции ячеек X и Y. как я уже сказал выше, размеры каждой ячейки находятся. Это просто вопрос выполнения некоторых логических операций со всем индексом (или «бит-код» - это имя, на которое я ссылаюсь в своем коде)

Если вам известен хороший пример, в котором используются логические операции (двоичный уровень) для преобразования значений двоичного индекса в позиции X и Y, не могли бы вы опубликовать ссылку или объяснение здесь?

Спасибо!


Вот ссылка, откуда я взял эту идею (примечание: другой язык программирования):

Л. Spiro Engine — http://lspiroengine.com/?p=530

Однако я не знаком с языком, использованным в этой статье, поэтому не могу в полной мере следовать ему и легко преобразовать его в ActionScript 3.0.


person bigp    schedule 19.02.2013    source источник
comment
Неважно, я думаю, что слишком усложняю то, как мои клетки расположены в памяти. Я выбрал более линейный подход (сверху слева направо, сначала повторяя по горизонтали), и теперь у меня есть работающее дерево QuadTree, которое может идентифицировать узел на основе запроса Rectangle! :) Задача будет заключаться в том, чтобы запросить Quadtree и получить родительские и дочерние узлы.   -  person bigp    schedule 19.02.2013
comment
Просто чтобы сохранить историю, мне удалось заставить это работать с линейной индексацией каждого узла. Вот короткая демонстрация: pierrechamberlain.ca/   -  person bigp    schedule 20.02.2013


Ответы (1)


Ваша задача описана Ханнаном Саметом. Это работает, сначала строя дерево квадрантов, а затем присваивая каждой ячейке квадроцикла соответствующий код Мортона. (код с чередованием битов).
Когда у вас есть код, вы назначаете его объектам в квадроцикле. затем вы можете удалить четырехъядерное дерево. затем вы можете выполнить поиск, преобразовав координату в соответствующий код Мортона, и выполнить поиск в корзине по индексу Мортона. Вместо кода Мортона (также называемого z-порядком) вы также можете использовать коды Гильберта или коды Грея.

person AlexWien    schedule 13.04.2013