|
function fern
%FERN MATLAB implementation of the Fractal Fern
% Michael Barnsley, Fractals Everywhere, Academic Press, 1993.
% This version runs forever, or until stop is toggled.
% See also FINITEFERN.
%分形厥的生成过程实际上是对平面上的一个点不断做变换。设x为一个含两个分量,x1和x2的向量,
%表示一个点。有四种不同的变换,都遵循下面的形式
%x-->Ax+b,
%而取不同的矩阵A和向量b。这被称为仿射变换。最常用的变换是
%A=[0.85 0.04;-0.04 0.85],b=[0;1.6];
%这个变换可缩短并旋转向量x,然后在他的第二个分量上加1.6。反复应用这个变换的将点向上,向右
%移动,朝着厥的顶尖生成点。这个过程中,偶尔也会随机的采用另外三种变换中的一个,他们分别
%将点移到右边的子厥,左边的子厥和茎干的位置上。
%shg%讲一个已有的绘图窗口置于最前,若没有则创建一个新的窗口
%clf reset%将大部分图的属性设置为默认
set(gcf,'color','white',...
'numbertitle','off','name','Fractal Fern')
x = [-1; 5];%设定初始点的坐标
h = plot(x(1),x(2),'.');
darkgreen = [0 2/3 0];
set(h,'markersize',1,'color',darkgreen,'erasemode','none');%使句柄h对应的点更小,改变它的颜色,并设置当点坐标改变时,屏幕上已绘制的这个点的图像不被抹去。
axis([-3 3 0 10])%设置坐标范围
%axis off%不显示坐标
stop = uicontrol('style','toggle','string','stop', ...
'background','white');%创建停止按钮
drawnow%重画
p = [ .85 .92 .99 1.00];%建立一个概率向量
A1 = [ .85 .04; -.04 .85]; b1 = [0; 1.6];
A2 = [ .20 -.26; .23 .22]; b2 = [0; 1.6];
A3 = [-.15 .28; .26 .24]; b3 = [0; .44];
A4 = [ 0 0 ; 0 .16];%定义四个仿射变换
cnt = 1;%初始哈一个计数器,用来记录绘制点的数目。
tic%启动计时器
while ~get(stop,'value')%没按停止按钮,一直继续
x = A2*x + b2;
set(h,'xdata',x(1),'ydata',x(2));%重新画点
drawnow
cnt = cnt + 1;
end
t = toc;
s = sprintf('%8.0f points in %6.3f seconds',cnt,t);
text(-1.5,-0.5,s,'fontweight','bold');
set(stop,'style','pushbutton','string','close','callback','close(gcf)')
%生成sierpinski三角形,
%令初始点x=[0;0];Ax+b
%迭代矩阵为A=[1/2,0;0,1/2];
%b从下面三个向量中随机等概率地选取:
%b=[0;0];b=[1/2;0];b=[1/4;sqrt(3)/4];
%r=ceil(4*rand);
你看行不? |
评分
-
1
查看全部评分
-
|