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

时间:2013-01-25 09:53:27

标签: python algorithm 3d hilbert-curve

我希望将RGB颜色立方体中的点映射到Python中的一维列表,这样可以使颜色列表看起来很漂亮和连续。

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

3 个答案:

答案 0 :(得分:11)

本文似乎有一个很好的讨论: An inventory of three-dimensional Hilbert space-filling curves

引自摘要:

  

希尔伯特的二维空间填充曲线非常受欢迎   许多应用程序的良好位置属性。但事实并非如此   明确将此曲线推广到填充的最佳方法是什么   高维空间。我们争辩说,这些属性   希尔伯特的曲线在二维方面是独一无二的,由10694807共享   结构上不同的空间填充曲线三维。

答案 1 :(得分:5)

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

将此代码调整为python或其他过程语言应该很容易。

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

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

答案 2 :(得分:1)

工程实践中经常使用的不是Hilbert(Peano)曲线 - 它是Morton代码。

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

更容易计算。