前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Morton码

Morton码

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-07-10 17:25:12
3.1K0
发布2019-07-10 17:25:12
举报

版权声明:本文为博主原创文章,转载请注明原文出处!

写作时间:2019-07-08 17:11:27

Morton码的计算

Morton码是对栅格格网进行编码的一种算法,在Google中搜索Morton,搜索结果第一位是Wikipedia的Z-order Curve,这是因为Morton码编码结果展现为一种Z形的填充曲线。下面简要说一下如何计算四进制和十进制的Morton码。

Morton码
Morton码

四进制Morton码计算

四进制编码对左上,右上,左下,右下的顺序对四个格网单元分布编码为0,1,2,3。

其计算方式为:二进制的行列号rrr、lll(从第0行0列开始),四进制编码M=2∗l+rM=2*l+ rM=2∗l+r;那么这里就是:第5行(101)第7列(111):M=2∗101+111=313M=2*101+111=313M=2∗101+111=313(313对应的十进制是55)

十进制Morton码计算

十进制的编码规则:首先,行列号转为二进制(从第0行0列开始);然后行列号交叉排列;最后将二进制结果转为十进制。十进制Morton编码是按左上,右上,左下,右下的顺序从0开始对每个格网进行自然编码的。

对于第5行(101)第7列(111),交叉排列得到110111,然后转为十进制就是55。和四进制的编码结果是一样的。

下面给出十进制Morton码的C++实现:

代码语言:javascript
复制
#include <iostream>

using std::cout;

int main() {
    uint32_t row = 5;
    uint32_t col = 7;
    uint64_t morton = 0;

    for (int i = 0; i < sizeof(row) * 8; i++) {
        morton |= (row & (uint64_t)1 << i) << i | (col & (uint64_t)1 << i) << (i + 1);
    }
    cout << morton << '\n';
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Morton码的计算
    • 四进制Morton码计算
      • 十进制Morton码计算
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档