2D莫顿德code函数64位 [英] 2D Morton decode function 64bits

查看:184
本文介绍了2D莫顿德code函数64位的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

第一个功能EN codeS [X,Y]作为64宽的莫顿code,其中x和y是利用交错位用二元幻数32位宽的整数。

什么是反向功能?

 无效xy2d_morton_64bits(uint64_t中的x,uint64_t中Y,uint64_t中* D)
{
    X =(X |(X LT;&下; 16))及0x0000FFFF0000FFFF;
    X =(X |(X LT;&下; 8))及0x00FF00FF00FF00FF;
    X =(X |(X LT; 4;))及0x0F0F0F0F0F0F0F0F;
    X =(X |(X LT; 2))及0x3333333333333333;
    X =(X |(X LT;&所述; 1))及0x5555555555555555;    Y =(Y |(γ&所述;&下; 16))及0x0000FFFF0000FFFF;
    Y =(Y |(γ&所述;&下; 8))及0x00FF00FF00FF00FF;
    Y =(Y |(γ&下; 4;))及0x0F0F0F0F0F0F0F0F;
    Y =(Y |(γ&下; 2))及0x3333333333333333;
    Y =(Y |(γ&所述;&所述; 1))及0x5555555555555555;    * D = X | (γ&所述;&。1);
}无效d2xy_morton_64bits(uint64_t中D,uint64_t中* X,uint64_t中* Y)
{
    // ????
}


解决方案

 无效xy2d_morton(uint64_t中的x,uint64_t中Y,uint64_t中* D)
{
    X =(X |(X LT;&下; 16))及0x0000FFFF0000FFFF;
    X =(X |(X LT;&下; 8))及0x00FF00FF00FF00FF;
    X =(X |(X LT; 4;))及0x0F0F0F0F0F0F0F0F;
    X =(X |(X LT; 2))及0x3333333333333333;
    X =(X |(X LT;&所述; 1))及0x5555555555555555;    Y =(Y |(γ&所述;&下; 16))及0x0000FFFF0000FFFF;
    Y =(Y |(γ&所述;&下; 8))及0x00FF00FF00FF00FF;
    Y =(Y |(γ&下; 4;))及0x0F0F0F0F0F0F0F0F;
    Y =(Y |(γ&下; 2))及0x3333333333333333;
    Y =(Y |(γ&所述;&所述; 1))及0x5555555555555555;    * D = X | (γ&所述;&。1);
}// morton_1 - 提取偶数位uint64_t中morton_1(uint64_t中X)
{
    X = X&放大器; 0x5555555555555555;
    X =(X |(X GT;→1))及0x3333333333333333;
    X =(X |(X GT;&→2))及0x0F0F0F0F0F0F0F0F;
    X =(X |(X GT;&→4))及0x00FF00FF00FF00FF;
    X =(X |(X GT;→8))及0x0000FFFF0000FFFF;
    X =(X |(X GT;> 16))及0xFFFFFFFFFFFFFFFF;
    返回X;
}无效d2xy_morton(uint64_t中D,uint64_t中* X,uint64_t中* Y)
{
    * X = morton_1(四);
    * Y = morton_1(d取代;大于1);
}

The first function encodes [x, y] as 64bit wide Morton code where x and y are 32bit wide integers using Interleave bits by Binary Magic Numbers.

What would be the reverse function?

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)
{
    // ????
}

解决方案

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);
}

这篇关于2D莫顿德code函数64位的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆