8.21 希尔伯特曲线及其绘制方法简述

绘制效果:

操作要点

希尔伯特曲线是一种奇妙的分形,图形美观漂亮。当阶数无穷大时,它能充满单位正方形(或正方体)中所有点。它是一条处处连续而又不可导的曲线。

如何绘制m阶的曲线呢?图霸教程的分形(一)中的例4.8.3介绍了一种迭代方法。本文再介绍一种从起点到终点一笔画动态生成的算法。
我们先从二维开始,再推广到三维。

首先明白曲线的生成过程。平面内一个正方形分成4个小正方形,依次连接每个小正分形中心,即得到一阶的希氏曲线。这个形状(n形)称为基元,如图。依序计算出4个顶点坐标是绘制的前提。

再把每个小正方形分成4个更小的正方形,把基元变换后放到4个部分,用三线段连接4个部分即得到二阶曲线,…,类似地做下去,将k阶曲线变换后放到它的的4个部分中,并用三线段连接4个部分即可得到k+1阶的曲线。

因此,算法的关键是依次计算各个正方形中心的坐标。为了计算方便,将曲线的起点作原点,各阶小正方形的边长均设为1,所有中心点的坐标均为自然数。计算到最后再缩小并平移到中心位置。

把每个图中4个部分依序编号为1,2,3,4,可以发现基元与2,3两个部分形状一样,只要作平移变换。基元到1号元要做关于y=x的反射,4号元又可以由1号元对称得到。k阶生成后作为新的基元,对各点作4次与前述类似变换(平移量不同)即生成k+1阶顶点数据。变换公式可以由图形观察得出,也可以用图霸中仿射变换生成。尽量最后作1号变换,因为其它各变换要用其数据。

在图霸中,先从一个原点(0阶)开始,变换4次后生成4个顶点,得到1阶,再变换4次得16个顶点,得到2阶,…,最后用迭代连接各顶点,用参数控制迭代深度,可以得到动态生成的动画。

计算顶点坐标的代码如下:

for(set(0,0)+set(1,0)+set(1000,1),get(1000)<No1,(for((set(1001,0),set(1002,get(1000)^2)),get(1001)<get(1002),(set(1003,2*get(1001)),set(1004,get(1003)+2*get(1002)),set(1005,get(1003)+4*get(1002)),set(1006,get(1003)+6*get(1002)),set(get(1004),get(get(1003))),set(get(1004)+1,get(get(1003)+1)+get(1000)),set(get(1005),get(get(1003))+get(1000)),set(get(1005)+1,get(get(1003)+1)+get(1000)),set(1011,get(get(1003))),set(1012,get(get(1003)+1)),set(get(1003),get(1012)),set(get(1003)+1,get(1011)),set(get(1006),2*get(1000)-1-get(get(1003))),set(get(1006)+1,get(1000)-1-get(get(1003)+1)),accum(1001)),1),set(1000,get(1000)*2)),for((set(1001,0),set(1002,2*No1^2),set(1003,16*(1/No1-1))),get(1001)<get(1002),(set(get(1001),get(get(1001))*32/No1+get(1003)),accum(1001)),No1^2))

三维曲线与二维类似,但要作8个变换。由于基元有多种,同一种基元组成下一阶图形的结构形式也有多种,所以变换不同,用仿射变换计算出公式比较方便。下面给出其中一种基元及其构建的三种形式:

图霸中分别对应下列三种图形:

第一图切换视角,即为希尔伯特龙:

我们也可以根据顶点坐标用曲线参数方程表示曲线。比如线段AB可以写成(1-t)*A+t*B,t从0到1。折线可以把t取整get对应的线段起点,t的小数部分作为线段上点值参数。

改变曲线中参数t的取值范围,构成动画:

还可以构造曲线上的点,进行拖动,如图:

当阶数增大为4时,对电脑要求较高,切换不同的投影方式与视角,可以欣赏更多精美的图形。

参考:

1.迪威模型:希尔伯特龙

2.三维希尔伯特曲线的构造与绘制

3.Hilbert曲线简单介绍及生成算法

4.c语言希尔伯特曲线的算法分析

 

返回帮助目录