2D莫顿德code函数64位 [英] 2D Morton decode function 64bits
本文介绍了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屋!
查看全文