首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python生成三维希尔伯特空间填充曲线的算法

问用Python生成三维希尔伯特空间填充曲线的算法
EN

Stack Overflow用户
提问于 2013-01-25 17:53:27
回答 3查看 15.4K关注 0票数 16

我想将RGB颜色立方体中的点映射到Python中的一维列表,以使颜色列表看起来美观而连续。

我相信使用三维希尔伯特空间填充曲线会是一个很好的方法,但我已经搜索过了,还没有找到对这个问题非常有用的资源。维基百科特别提供了生成2D曲线的示例代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-25 18:03:22

这篇论文似乎有相当多的讨论:An inventory of three-dimensional Hilbert space-filling curves。

引述自摘要:

希尔伯特的二维空间填充曲线因其良好的局部性而在许多应用中受到赞赏。然而,目前还不清楚什么是将这条曲线推广到填充高维空间的最佳方式。我们认为,使希尔伯特曲线在二维中独一无二的特性,在三维空间中被10694807条结构不同的空间填充曲线所共享。

票数 13
EN

Stack Overflow用户

发布于 2014-11-23 00:59:21

我在尝试用javascript做同样的事情时遇到了你的问题。我自己想出来的。这是一个递归函数,它将一个立方体分成8个部分,并旋转每个部分,使其按顺序遍历希尔伯特曲线。参数表示立方体旋转轴的大小:S、位置:xyz和3个向量。示例调用使用一个256^3的立方体,并假设红、绿、蓝数组的长度为256^3。

将此代码改编为python或其他过程性语言应该很容易。

图片改编自:http://www.math.uwaterloo.ca/~wgilbert/Research/HilbertCurve/HilbertCurve.html

代码语言:javascript
复制
    function hilbertC(s, x, y, z, dx, dy, dz, dx2, dy2, dz2, dx3, dy3, dz3)
    {
        if(s==1)
        {
            red[m] = x;
            green[m] = y;
            blue[m] = z;
            m++;
        }
        else
        {
            s/=2;
            if(dx<0) x-=s*dx;
            if(dy<0) y-=s*dy;
            if(dz<0) z-=s*dz;
            if(dx2<0) x-=s*dx2;
            if(dy2<0) y-=s*dy2;
            if(dz2<0) z-=s*dz2;
            if(dx3<0) x-=s*dx3;
            if(dy3<0) y-=s*dy3;
            if(dz3<0) z-=s*dz3;
            hilbertC(s, x, y, z, dx2, dy2, dz2, dx3, dy3, dz3, dx, dy, dz);
            hilbertC(s, x+s*dx, y+s*dy, z+s*dz, dx3, dy3, dz3, dx, dy, dz, dx2, dy2, dz2);
            hilbertC(s, x+s*dx+s*dx2, y+s*dy+s*dy2, z+s*dz+s*dz2, dx3, dy3, dz3, dx, dy, dz, dx2, dy2, dz2);
            hilbertC(s, x+s*dx2, y+s*dy2, z+s*dz2, -dx, -dy, -dz, -dx2, -dy2, -dz2, dx3, dy3, dz3);
            hilbertC(s, x+s*dx2+s*dx3, y+s*dy2+s*dy3, z+s*dz2+s*dz3, -dx, -dy, -dz, -dx2, -dy2, -dz2, dx3, dy3, dz3);
            hilbertC(s, x+s*dx+s*dx2+s*dx3, y+s*dy+s*dy2+s*dy3, z+s*dz+s*dz2+s*dz3, -dx3, -dy3, -dz3, dx, dy, dz, -dx2, -dy2, -dz2);
            hilbertC(s, x+s*dx+s*dx3, y+s*dy+s*dy3, z+s*dz+s*dz3, -dx3, -dy3, -dz3, dx, dy, dz, -dx2, -dy2, -dz2);
            hilbertC(s, x+s*dx3, y+s*dy3, z+s*dz3, dx2, dy2, dz2, -dx3, -dy3, -dz3, -dx, -dy, -dz);
        }
    }
    m=0;
    hilbertC(256,0,0,0,1,0,0,0,1,0,0,0,1);
票数 8
EN

Stack Overflow用户

发布于 2018-04-24 01:31:27

在工程实践中经常使用的并不是严格意义上的希尔伯特(Peano)曲线,而是Morton代码。

https://en.wikipedia.org/wiki/Z-order_curve

计算起来要容易得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14519267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档