【问题标题】:2D Morton decode function 64bits2D Morton 解码功能 64bits
【发布时间】:2015-08-12 23:05:39
【问题描述】:

第一个函数将 [x, y] 编码为 64 位宽的莫顿码,其中 x 和 y 是使用二进制幻数交错位的 32 位宽整数。

什么是反向函数?

void xy2d_morton_64bits(uint64_t x, uint64_t y, uint64_t *d)
{
    x = (x | (x << 16)) & 0x0000FFFF0000FFFF;
    x = (x | (x << 8)) & 0x00FF00FF00FF00FF;   
    x = (x | (x << 4)) & 0x0F0F0F0F0F0F0F0F; 
    x = (x | (x << 2)) & 0x3333333333333333;
    x = (x | (x << 1)) & 0x5555555555555555;

    y = (y | (y << 16)) & 0x0000FFFF0000FFFF;
    y = (y | (y << 8)) & 0x00FF00FF00FF00FF;
    y = (y | (y << 4)) & 0x0F0F0F0F0F0F0F0F;
    y = (y | (y << 2)) & 0x3333333333333333;
    y = (y | (y << 1)) & 0x5555555555555555;

    *d = x | (y << 1);
}

void d2xy_morton_64bits(uint64_t d, uint64_t *x, uint64_t *y)
{
    // ????
}

【问题讨论】:

  • 第一个函数不起作用。您显然混淆了指针和值。您的编译器至少应该明确警告(指针上的 int-ops)。另外,为什么不直接返回结果呢? function 是什么?
  • 2D morton code encode/decode 64bits 的可能副本。 @WeatherVane:他在过去几天内三次问过同样的问题。
  • :) 奥拉夫——你当然是对的。对不起。匆忙将javascript代码与c混合时犯了错误。事实上,它甚至不是我的代码,而是从我之前的帖子中借来的。已经编辑好了。但是这个问题仍然没有答案......
  • 没错,我问的是同样的问题,或者至少是同样的问题,因为找不到答案。请帮忙。

标签: c z-order-curve


【解决方案1】:
void xy2d_morton(uint64_t x, uint64_t y, uint64_t *d)
{
    x = (x | (x << 16)) & 0x0000FFFF0000FFFF;
    x = (x | (x << 8)) & 0x00FF00FF00FF00FF;
    x = (x | (x << 4)) & 0x0F0F0F0F0F0F0F0F;
    x = (x | (x << 2)) & 0x3333333333333333;
    x = (x | (x << 1)) & 0x5555555555555555;

    y = (y | (y << 16)) & 0x0000FFFF0000FFFF;
    y = (y | (y << 8)) & 0x00FF00FF00FF00FF;
    y = (y | (y << 4)) & 0x0F0F0F0F0F0F0F0F;
    y = (y | (y << 2)) & 0x3333333333333333;
    y = (y | (y << 1)) & 0x5555555555555555;

    *d = x | (y << 1);
}

// morton_1 - extract even bits

uint64_t morton_1(uint64_t x)
{
    x = x & 0x5555555555555555;
    x = (x | (x >> 1)) & 0x3333333333333333;
    x = (x | (x >> 2)) & 0x0F0F0F0F0F0F0F0F;
    x = (x | (x >> 4)) & 0x00FF00FF00FF00FF;
    x = (x | (x >> 8)) & 0x0000FFFF0000FFFF;
    x = (x | (x >> 16)) & 0xFFFFFFFFFFFFFFFF;
    return x;
}

void d2xy_morton(uint64_t d, uint64_t *x, uint64_t *y)
{
    *x = morton_1(d);
    *y = morton_1(d >> 1);
}

【讨论】:

    猜你喜欢
    • 2015-08-13
    • 2015-08-12
    • 1970-01-01
    • 2011-05-16
    • 2011-11-20
    • 2019-04-02
    • 1970-01-01
    • 2019-07-18
    相关资源
    最近更新 更多