Koch曲线是分形图案的一个代表,对其研究很有意义,在此不敢多说。请见matrix67的博客:
http://www.matrix67.com/blog/archives/243
用一个复数序列代表整个图形,序列首尾相连,在复平面上的依次相连就构成了每一次的图形;对复数序列进行一次迭代,可以生成更细分的图形。下面分析迭代的计算过程。
迭代次数用n表示,映射
代表了从这一次的图形到下一次这个迭代过程,第n次的序列
,这里共有几个点是用
来表示的。例如,
时,代表初始的正三角形,复数序列
。
之所以用复数来表示,是为了方便对每一段进行映射。上图三角形的三条边,都是按照如下流程
- 等分三段,第1个点和第5个点与原来一样;
- 添加第2个点,在原矢量 的 处;
- 添加第3个点,矢量 长度不变,方向顺时针转 ;
- 添加第4个点,在原矢量 的 处。
已知对复数乘以一个模值为1的复数 可以改变其辐角,而不改变其大小,改变的方向是逆时针 。所以对第一段 采取如下算法:
- ,
至于总共有多少段,那不必要求证,关键是对上一个序列 的每一个分段向量 都能进行如上计算。
Koch曲线代码
这个程序用MATLAB实现是极其简单的。
% Edited by NICAI001
% 通过复数曲线绘制Koch雪花
x_n=[1 (1+sqrt(3)*1i)/2 0 1];
slice=6; %这里是迭代次数
for n=1:slice
x_p=x_n;
lastSeg=length(x_n)-1;
for k=0:lastSeg-1
dX=(x_p(k+2)-x_p(k+1))/3;x_n(4*k+1)=x_p(k+1);
x_n(4*k+2)=x_p(k+1)+dX;
x_n(4*k+3)=x_n(4*k+2)+dX*(1/2-sqrt(3)*1i/2);
x_n(4*k+4)=x_p(k+1)+2*dX;
end
x_n(4*lastSeg+1)=x_p(lastSeg+1);
end
plot(x_n,'k--'),hold on;
axis equal;
类似地对代码稍作改动可以绘制以下图案
3次迭代
6次迭代
####代码如下
y=[1 1i+1 1i 0 1];
slice=5;
for k=1:slice;
x=y;n=length(x)-1;
for s=0:n-1
dz=(x(s+2)-x(s+1))/3;
y(5*s+1)=x(s+1);y(5*s+2)=x(s+1)+dz;
y(5*s+3)=y(5*s+2)-dz*1i;y(5*s+4)=y(5*s+3)+dz;
y(5*s+5)=y(5*s+4)+dz*1i;
end
y(5*n+1)=x(n+1);
end
plot(y),axis equal;
以上代码中y向量的初始值改成了正方形图案;dz没有变,仍然是原x向量三等分的值;但dz所乘的单位复数变为了-1i和1i,表示在dz方向上右偏或左偏90度;最后由于分割时原来一段上出现了5个点,最后要加上一个点 y(5)。
觉得之前的博客没有把问题说清楚,所以再来修改一下。