c++ - Z 阶曲线坐标

标签 c++

我如何访问使用 Z 顺序存储的数据,时间复杂度为 O(1) 数组?我需要通过坐标快速访问每个元素。有没有比使用 while 移位位更快的方法来访问此数据?

一种方法是使用查找表(我有静态数据大小)

编辑:

我现在的一个想法是使用 y*SIZE+x 按顺序存储叶子

编辑 2.:

我在 std::bitset 中讲述四叉树中的位。我正在尝试检查某些数据是否可用。在大小为 128*128 的矩阵中。所以我可以跳过对空数据的暴力矩阵搜索。

最佳答案

您可以使用以下代码计算 z 阶曲线值:

uint32_t calcZOrder(uint16_t xPos, uint16_t yPos)
{
    static const uint32_t MASKS[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF};
    static const uint32_t SHIFTS[] = {1, 2, 4, 8};

    uint32_t x = xPos;  // Interleave lower 16 bits of x and y, so the bits of x
    uint32_t y = yPos;  // are in the even positions and bits from y in the odd;

    x = (x | (x << SHIFTS[3])) & MASKS[3];
    x = (x | (x << SHIFTS[2])) & MASKS[2];
    x = (x | (x << SHIFTS[1])) & MASKS[1];
    x = (x | (x << SHIFTS[0])) & MASKS[0];

    y = (y | (y << SHIFTS[3])) & MASKS[3];
    y = (y | (y << SHIFTS[2])) & MASKS[2];
    y = (y | (y << SHIFTS[1])) & MASKS[1];
    y = (y | (y << SHIFTS[0])) & MASKS[0];

    const uint32_t result = x | (y << 1);
    return result;
}

取自这里Bit Twiddling Hacks

从您的 128x128 数组(或任何其他大小)中,您可以从任何位置轻松计算 z 顺序曲线值。例如:

xPos = 2, yPos = 3 -> z order curve value = 7

示例代码的最大数组大小为 65536*65536。为了方便,只需使用 2 的幂,在这种情况下,最大浪费的空间约为。 3/4

关于c++ - Z 阶曲线坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12157685/

相关文章:

c++ - 来自 c 的随机十六进制答案

C++ memcpy 到数组的末尾

c++ - 尝试提供将整数类型 std::vector 除以常量的运算符

c++ - 如何在 grammar<Iterator,double()> 中添加 qi::symbols?

c++ - #define 函数参数 C++

c++ - 在较大字符串中查找子字符串的查找方法

c# - 在 C++ 函数执行后使用 GCHandle 崩溃将大型结构数组从 C# unity 脚本传递到 C++ dll

c++ - 移动和编辑时区分项目上的 Qt itemChange 信号

c++ - 格式化适合语言环境的日和月,不带年

c++ - 将数组传递给函数的问题