当我遇到这个问题时,我很想创建一个稀疏八叉树实现,就像 nVidia 的人(“高效稀疏体素八叉树”)正在为他们的体素事情做的那样:
我有一个字节类型的位域(所以只有 8 位),它告诉我八叉树的叶子在哪里(1 表示叶子,0 表示没有叶子,附加了 8 个节点 --> 8 位)。我现在要做的是返回一个叶子位置的数组。我当前的实现是使用一个while循环来确定是否设置了LSB。之后输入移位 1。所以我是这样做的:
int leafposition = _leafmask & _validmask;
int[] result = new int[8];
int arrayPosition = 0;
int iteration = 0;
while ( leafposition > 0 )
{
iteration++; //nodes are not zero-indexed ... ?
if ( (leafposition & 1) == 1 ) // LSB set?
{
result.SetValue( iteration, arrayPosition );
arrayPosition++;
};
leafposition = leafposition >> 1;
}
return result;
这看起来并不优雅,并且有两件事令人不安:
- 这个 while 循环模仿了一个 for 循环
- 结果数组很可能小于 8 个值,但调整大小的成本很高
我希望结果类似于[2,4,6]
42 (0010 1010)
。
任何人都可以提供一个更优雅的仍然可读的解决方案吗?
结果
我正在使用我之前实现的八叉树叶计数函数将数组设置为适当的大小。