用Python生成3D Hilbert空间填充曲线的算法

20
我想将 RGB 颜色立方体中的点映射到 Python 中的一维列表中,并使颜色列表看起来好看和连续。我认为使用三维 Hilbert 空间填充曲线是一个不错的方法,但我搜索过后并没有找到针对这个问题的特别有用的资源。特别是在维基百科上,只提供了用于生成二维曲线的示例代码。
3个回答

15
这篇论文似乎引起了很多讨论:三维希尔伯特空间填充曲线清单
引用摘要:
“希尔伯特的二维空间填充曲线因其在许多应用中具有良好的局部性属性而备受赞赏。然而,不清楚将此曲线推广到填充更高维空间的最佳方法是什么。我们认为,在二维中使希尔伯特曲线独特的属性被10694807种结构不同的三维空间填充曲线所共享。”

8

我在尝试使用javascript完成相同的任务时遇到了您的问题。我自己解决了这个问题。以下是一个递归函数,将一个立方体分成8个部分,并旋转每个部分,使其按顺序遍历hilbert曲线。参数表示大小: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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接