编辑: 枪械砖家 | 2019-09-19 |
1 分形原理 这是一类复杂的平面曲线,可用算法描述.从一条直线段开始,将线段中间三分之一部分用等边三角形的两条边代替,形成具有5个结点的图形(图1);
在新的图形中,又将图中每一直线段中间的三分之一部分都用一等边三角形的两条边代替,再次形成新的图形(图2),这时,图形中共有17个结点. 这种迭代继续进行下去可以形成Koch分形曲线.在迭代过程中,图形中的点将越来越多,而曲线最终显示细节的多少将取决于迭代次数和显示系统的分辩率. 1.2 算法分析 算法分析:考虑由直线段(2个点)产生第一个图形(5个点)的过程.设和分别为原始直线段的两个端点.现在需要在直线段的中间依次插入三个点 产生第一次迭代的图形(图1).显然,位于点右端直线段的三分之一处, 位于点右端直线段的三分之二处;
而点的位置可以看成是由点绕旋转60度(逆时针方向)而得到的,故可以处理为向量经正交变换而得到向量.算法如下: (1) ;
(2) ;
(3) ;
在(3)中, A为正交矩阵: 算法根据初始数据(和点的坐标),产生图1中5个结点的坐标.结点的坐标数组形成一个5*2矩阵,矩阵的第一行为的坐标,第二行为的坐标,……,第五行为的坐标.矩阵的第一列元素分别为5个结点的X坐标,第二列元素分别为5个结点的Y坐标. 进一步考虑Koch曲线形成过程中结点数目的变化规律.设第k次迭代产生结点数为,第k+1次迭代产生结点数为,则和之间的递推关系式为. 1.4 MATLAB实现 p=[0 0;
10 0];
n=2;
A=[cos(pi/3) -sin(pi/3);
sin(pi/3) cos(pi/3)];
for k=1:5 d=diff(p)/3;
m=4*n-3;
q=p(1:n-1,:);
p(5:4:m,:)=p(2:n,:);
p(2:4:m,:)=q+d;
p(3:4:m,:)=q+d+d*A';
p(4:4:m,:)=q+2*d;
n=m;
end plot(p(:,1),p(:,2),'k') axis equal axis off 程序运行后,可得如下分形曲线图形: 图1所示的简单图形被称为是koch曲线的生成元.下面给出其它几种生成元及对应曲线: 1.5 附源程序 第一种树形源程序: p=[0 0;
10 10];
n=2;
line(p(:,1),p(:,2),'Color','k');
A=[cos(pi/6) -sin(pi/6);
sin(pi/6) cos(pi/6)];
for k=1:4 i=1;
for j=1:2:n p1=p(j,:);
p2=p(j+1,:);
d=(p2-p1)/3;
r(i,:)=p1;
i=i+1;
q1=p1+d;
r(i,:)=q1;
i=i+1;
r(i,:)=q1;
i=i+1;
q2=q1+d*A';
r(i,:)=q2;
i=i+1;
r(i,:)=q1;
i=i+1;
q3=p1+2*d;
r(i,:)=q3;
i=i+1;
r(i,:)=q3;
i=i+1;
q4=q3+d*A;
r(i,:)=q4;
i=i+1;
r(i,:)=q3;
i=i+1;
r(i,:)=p2;
i=i+1;
xy=[q1;
q2];
line(xy(:,1),xy(:,2),'Color','k');
xy=[q3;
q4];
line(xy(:,1),xy(:,2),'Color','k');
end p=r;
n=5*n;
end axis equal axis off 第二种树形源程序 clear p=[0 0;
0 15];
b=pi/8;
e=1.5;
a=[cos(b) -sin(b);
sin(b) cos(b)];
n=2;
for k=1:4 i=1;
for j=1:2:n p1=p(j,:);
p2=p(j+1,:);
d=(p2-p1)/3;
new(i,:)=p1;
i=i+1;
q1=p1+d;
new(i,:)=q1;
i=i+1;
new(i,:)=q1;
i=i+1;
new(i,:)=p1+d+e*d*a';
i=i+1;
new(i,:)=q1;
i=i+1;
new(i,:)=p1+d+e*d*a;
i=i+1;
new(i,:)=p1+d;
i=i+1;
q2=p1+2*d;
new(i,:)=q2;
i=i+1;
new(i,:)=q2;
i=i+1;
new(i,:)=p1+2*d+d*a;
i=i+1;
new(i,:)=q2;
i=i+1;
new(i,:)=p1+2*d+d*a';
i=i+1;
new(i,:)=p1+2*d;
i=i+1;
new(i,:)=p2;
i=i+1;
end n=n*7;
p=new;
end for m=1:2:n line([p(m,1) p(m+1,1)],[p(m,2) p(m+1,2)],'Color','k');
end axis equal axis off 矩形生成元第一种曲线 p=[0 0;
10 0];
n=2;
A=[0 -1;
1 0];
for k=1:4 d=diff(p/3);
m=5*n-4;
q=p(1:n-1,:);
p(6:5:m,:)=p(2:n,:);
p(2:5:m,:)=q+d;
p(3:5:m,:)=q+d+1*d*A';
p(4:5:m,:)=q+2*d+1*d*A';
p(5:5:m,:)=q+2*d;
n=m;
end plot(p(:,1),p(:,2),'k') axis equal axis off 矩形生成元第二种曲线 p=[0 0;
10 0];
n=2;
A=[0 -1;
1 0];
for k=1:4 d=diff(p/3);
m=5*n-4;
q=p(1:n-1,:);
p(6:5:m,:)=p(2:n,:);
p(2:5:m,:)=q+d;
p(3:5:m,:)=q+d+.7*d*A';
p(4:5:m,:)=q+2*d+.7*d*A';
p(5:5:m,:)=q+2*d;
n=m;
end plot(p(:,1),p(:,2),'k') axis equal axis off