Actionscript 3 如何转换四叉树单元格';位置和维度值的空间索引(二进制索引)?

Actionscript 3 如何转换四叉树单元格';位置和维度值的空间索引(二进制索引)?,actionscript-3,indexing,logical-operators,quadtree,Actionscript 3,Indexing,Logical Operators,Quadtree,在此问题中,我很抱歉没有使用任何术语,但基本上我正在考虑创建一个使用二进制索引的四叉树,如下所示: 如上图所示,如果每个单元格都有一个二进制ID(例如:10101011),则每个奇数二进制索引控制X偏移,每个偶数二进制索引控制Y偏移 例如,在级别2网格(16个单元格)的情况下,1010(单元格#10)可以说在其第4和第2个索引处有1,因此它们将执行两个Y偏移。第一个“1”(在最左侧)将指示一个单元格高度的偏移,然后第二个“1”将另外偏移两倍单元格高度 例如: // If Cell Height

在此问题中,我很抱歉没有使用任何术语,但基本上我正在考虑创建一个使用二进制索引的四叉树,如下所示:

如上图所示,如果每个单元格都有一个二进制ID(例如:10101011),则每个奇数二进制索引控制X偏移,每个偶数二进制索引控制Y偏移

例如,在级别2网格(16个单元格)的情况下,1010(单元格#10)可以说在其第4和第2个索引处有1,因此它们将执行两个Y偏移。第一个“1”(在最左侧)将指示一个单元格高度的偏移,然后第二个“1”将另外偏移两倍单元格高度

例如:

// If Cell Height = 64pixels
  1### = 64 pixels
+ ##1# = 128 pixels
__________________
  1#1# = 192 pixels
这同样适用于X轴,只是它使用奇数代替(例如:#1#1)

现在,当我初始化我的四叉树时,我开始计算如果使用所有单元格和所有深度,它可能包含的最大节点数。我已经用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...
}
public static function MSB( pValue:uint ):int {
    var bits:int =      0;

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

    return bits;
}
但是现在,我一直在试图找出如何将索引从二进制形式转换为实际的单元格X和Y位置。就像我上面说的,每个细胞的尺寸都是可以找到的。这只是对整个索引执行一些逻辑操作的问题(或者“位代码”是我在代码中提到的名称)

如果您知道一个使用逻辑运算(二进制级别)将二进制索引值转换为X和Y位置的好例子,请在此处发布链接或解释

谢谢


以下是我从中获得此想法的参考资料(注意:不同的编程语言):

L.Spiro发动机-


不过,我不熟悉那篇文章中使用的语言,因此我无法真正理解它并将其轻松转换为ActionScript 3.0。

您的任务由Hannan Samet描述。 其工作原理是首先构建四叉树,然后将共同响应的morton代码分配给每个四元单元。(位交叉码)。

获得代码后,将其指定给四边形中的对象。然后你可以去钻研四叉树。然后可以通过将坐标转换为共同响应的morton代码进行搜索,并在morton索引上执行bin搜索。你可以使用希尔伯特或格雷码来代替莫顿(也称为z顺序)。

没关系,我认为我的细胞在内存中的排列方式过于复杂了。我采用了一种更线性的方法(从左上到右下,先水平迭代),现在我有了一个工作的四叉树,可以根据查询矩形识别节点:)挑战将是查询四叉树并获取父节点和子节点。为了保持历史记录,我设法使每个节点线性索引。下面是一个快速演示: