Заранее извините за отсутствие какой-либо терминологии в этом вопросе, но в основном я изучаю создание QuadTree, в котором используется двоичное индексирование, например:
Как видно из двух приведенных выше иллюстраций, если каждой ячейке присвоен двоичный идентификатор (например, 1010, 1011), то каждый НЕЧЕТНЫЙ двоичный индекс управляет смещением по оси X, а каждый ЧЕТНЫЙ > двоичные индексы управляют смещением по оси Y.
Например, в случае сетки Уровня 2 (16 ячеек) можно сказать, что 1010 (ячейка №10) имеет 1 на 4-й em> и 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.