1.3分形叶
在M文件fern.m和finitefern.m中产生分形叶,一种在Michael Barnsley 的《Fractal Everywhere》书中描述的图象。它们可以在平面上产生并描绘出一连串任意无限的点。命令如下:
fern
不停的运行,产生越来越稠密的图形。命令:
finitefern(n)
产生N个点和如图1.3的图形。命令:
finitefern(n,'s')
同时显示产生的点。命令:
F = finitefern(n);
产生N个点,并返回到由稀疏矩阵和图象处理函数产生的,由0和1组成的数组中。但不画出图象。
图 1.3. Fractal fern
NCM集也包括fern.png,一个可以通过浏览器查看的由50万的点组成的768*1024的图形。
F = imread('fern.png');
image(F)
如果你喜欢这张图片,你可以将它选为你电脑的桌面背景。然而,你应当实际的在你自己电脑上运行fern,看看fern图像出现的动态分解过
程。
Fern 图像是反复的改变平面上点的位置而形成的。假设x 为一含两分量x x 21,的一向量,表示的为平面上的一个点。这样就有四种如下形式的
变换
b Ax x +→
不同变换中,矩阵A 和向量b 不同,这被称作仿射变换。其中量常用的变换是
⎪⎪⎭
⎫ ⎝⎛=⎪⎪⎭⎫ ⎝⎛-=6.10,85.04.04.85.b A 这个变换使得x 稍微变短并旋转一定角度,然后将它的第二个分量加上1.6。重复进行这个变换过程,将点向上和向右移向fern 图像中的尖端。每隔一段时间,其它三个变换中的一个会随机地被选取
下面就是完整的fractal fern 程序
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.
shg clf reset
set(gcf,'color','white','menubar','none', ... 'numbertitle','off','name','Fractal Fern')
x = [.5; .5]; h = plot(x(1),x(2),'.');
darkgreen = [0 2/3 0]; set(h,'markersize',1,'color',darkgreen,'erasemode','none');
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')
r = rand;
if r < p(1)
x = A1*x + b1;
elseif r < p(2)
x = A2*x + b2;
elseif r < p(3)
x = A3*x + b3;
else
x = A4*x;
end
set(h,'xdata',x(1),'ydata',x(2));
cnt = cnt + 1;
drawnow
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)')
shg
表示显示图形窗口。它将产生一个存在的图形出口,如果需要的话,可以新建一个。
clf reset
.把图形的性质重设为缺省值。
set(gcf,'color','white','menubar','none', ...
'numbertitle','off','name','Fractal Fern')
把图形窗口的背景颜变成白,并给窗口赋上标题。
x = [.5; .5];
给该点赋上初始值。.
h = plot(x(1),x(2),'.');
画出该点,并保存它以便过后我们可以修改该图形的性质。
darkgreen = [0 2/3 0];
定义一种颜:在空白出由红和兰组成,其他2/3由绿组成。
set(h,'markersize',1,'color',darkgreen,'erasemode','none');
使有附注H的点改变颜,详细说明当它的坐标改变时,它在屏幕上的图形的点不被搽掉。这些旧的点由电脑图形硬件保存(直到该图形被重
设),但MATLAB 本身不记忆它们。
axis([-3 3 0 10])
axis off
详细说明描绘的图形应覆盖这一区域。
100,3321≤≤≤≤-x x
但AXES 不画出。
stop = uicontrol('style','toggle','string','stop', ...
'background','white');
在图形的左下角的不履行地方创建一个环接口用户控制界面,注明“STOP ”并把它的颜设置为白。
drawnow
t 使包括初始点在内的初始图形在电脑的屏幕上描绘出来。
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];
定义这4个仿身变换。语句:
cnt = 1;
初始化计数器并保持描点的轨迹。
tic
初始化停止时间计时器。
while ~get(stop,'value')
只要当停止环的值为0时就开始运行。点击停止环,改变它在0到1之间的值,然后终止这个环。
r = rand;
在0到之间产生一个伪随机性,组成IF 语句:
if r < p(1) x = A1*x + b1;
elseif r < p(2) x = A2*x + b2;
elseif r < p(3) x = A3*x + b3;
else x = A4*x;
end
选择4个仿身变换的一个,由于P(1)是0.85,所以其他的选择机会会很少。
set(h,'xdata',x(1),'ydata',x(2));
改变H点的坐标为新的(X1,X2)并描出该点。
cnt = cnt + 1;
计算更多的点。.
drawnow
命令MATLAB去重画这个图形,并随着旧的图形一起展示新的点。没有这个命令将什么都不会画出来,直到点击stop。
end
与环的初始保持一致,最后
t = toc;
.读出时间:
s = sprintf('%8.0f points in %6.3f seconds',cnt,t);
text(-1.5,-0.5,s,'fontweight','bold');
当TIC被访问时,显示花费的时间和描点的最终数目,最后:set(stop,'style','pushbutton','string','close', ...
'callback','close(gcf)')
1.4幻方
幻方给我们提供了一组有趣的样本矩阵,输入命令:help magic或者helpwin magic将会得到:
MAGIC(N) is an N-by-N matrix constructed from the integers
1 through N^
2 with equal row, column, and diagonal sums.
字符串处理函数 如果是a展示bProduces valid magic squares for all N > 0 except N = 2.
早在公元前两千多年前,中国就已经发现了幻方这一问题。一个3*3的矩阵被称为“洛书”,在公元前23世纪,“洛书”被用铭文刻在一种在洛河爬行的龟的龟壳上,它为“风水”学说提供了一个数学基础,是一种古代中国关于平衡与和谐的哲学。MA TLAB可以用下面的语句产生一个“洛书”:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论