我tyring创建稀疏八叉树实现像在nVidia的("Efficient Sparse Voxel Octrees")的人设位位置正在做他们的体素的东西,当我碰到这个问题:找到一个字节
我有型字节的位字段(所以只有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)
。
任何人都可以提供一个更优雅的解决方案,仍然可读吗?
结果
我使用的八叉树叶数我先前实施到阵列设定为适当的大小的功能。
这是不是真的那么慢重新分配的数组。对于你的目的而言,它是否太慢是另一回事(因为这大概是经常调用的内循环代码)。您可能首先考虑计算汉明权重(位数设置为1),以便可以分配适当大小的数组,并测量两种方法。 http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer –
你知道,这就是为什么我在这里问。我写的最后一个方法就是尽可能快地获得叶数......不能相信我这样做时并没有考虑自己的代码。非常感谢你的最明显的想法! – HaMster