Matlab 版 (精华区)
发信人: ramjet (史努比狗), 信区: Matlab
标 题: [合集]发布一个分形程序
发信站: 哈工大紫丁香 (2002年06月14日19:40:40 星期五), 站内信件
────────────────────────────────────────
zjliu (fly) 于 Wed Jun 12 20:26:15 2002) 说道:
function tree_leaf(N)
%IFS生成“带梗的植物叶子”(建议运行10000次以上)
x=0;y=0;bbs=rand(1,N);
AA=[0,0,0.16,0,0,0;0.85,-2.5/180*pi,0.85,-2.5/180*pi,0,1.6;...
0.3,49/180*pi,0.34,49/180*pi,0,1.6;0.3,120/180*pi,0.37,-50/180*pi,0,0.44];
figure; hold on;
for ss=1:N;
if bbs(1,ss)<=0.005;
[x,y]=IFS(x,y,AA(1,1),AA(1,2),AA(1,3),AA(1,4),AA(1,5),AA(1,6));
elseif bbs(1,ss)<=0.805;
[x,y]=IFS(x,y,AA(2,1),AA(2,2),AA(2,3),AA(2,4),AA(2,5),AA(2,6));
elseif bbs(1,ss)<=0.9025;
[x,y]=IFS(x,y,AA(3,1),AA(3,2),AA(3,3),AA(3,4),AA(3,5),AA(3,6));
else
[x,y]=IFS(x,y,AA(4,1),AA(4,2),AA(4,3),AA(4,4),AA(4,5),AA(4,6));
end
plot(x,y,'r');
end
function [xp,yp]=IFS(x,y,r,thita,s,phi,h,k)
xp=r*x*cos(thita)-s*y*sin(phi)+h;
yp=r*x*sin(thita)+s*y*cos(phi)+k;
axis square off;
title('带梗的植物叶子')
────────────────────────────────────────
xuedy (dingyu) 于 2002年06月13日06:11:28 星期四 说道:
程序很好,但提点修改意见:
程序循环时,plot语句应该是最费时的,所以建议在每步计算时得出x,y的值不马上绘制
,而将结果暂存起来,在循环结束后一次性绘图。
另外,还可以考虑用cmex方式编写循环部分。
我修改的程序段如下:
figure; xx=[]; yy=[];;
for ss=1:N;
if bbs(1,ss)<=0.005;
[x,y]=IFS(x,y,AA(1,1),AA(1,2),AA(1,3),AA(1,4),AA(1,5),AA(1,6));
elseif bbs(1,ss)<=0.805;
[x,y]=IFS(x,y,AA(2,1),AA(2,2),AA(2,3),AA(2,4),AA(2,5),AA(2,6));
elseif bbs(1,ss)<=0.9025;
[x,y]=IFS(x,y,AA(3,1),AA(3,2),AA(3,3),AA(3,4),AA(3,5),AA(3,6));
else
[x,y]=IFS(x,y,AA(4,1),AA(4,2),AA(4,3),AA(4,4),AA(4,5),AA(4,6));
end
xx=[xx,x]; yy=[yy,y];
end
plot(xx,yy,'.r');
────────────────────────────────────────
billsun (MMMMMMMMM) 于 2002年06月13日07:28:55 星期四 说道:
真的很漂亮,能讲一下原理吗?,俺不懂怎么生成的
────────────────────────────────────────
zjliu (fly) 于 2002年06月13日08:37:07 星期四 说道:
首先感谢您的意见,不过我觉得您的修改会改变本程序的
目的,plot(xx,yy)若xx,yy是一个向量的时候它画出来的是一
条直线,而本程序目的是利用一系列用循环的办法来画出图形
来,我按您的修改试了一下结果很不理想,出现了一些乱线,
其只能生出叶子的轮廓。我用plot(x,y)的目的就是为了画出
一系列的点。
我再试试cmex方式编写循环,其实for的方式循环确实慢,
本程序很费时间的。
再次感谢您的指点!
────────────────────────────────────────
xuedy (dingyu) 于 2002年06月13日10:55:26 星期四 说道:
我给你附的修改就是用点画,注意 '.r'选项。:)
────────────────────────────────────────
zjliu (fly) 于 2002年06月13日16:34:38 星期四 说道:
谢谢,是我粗心了!
────────────────────────────────────────
zjliu (fly) 于 2002年06月13日16:59:47 星期四 说道:
我试了一下,感觉这样画出来的点大了些,叶子的感觉有点粗糙!
────────────────────────────────────────
yidday (龙溪) 于 2002年06月13日17:08:14 星期四 说道:
这么短时间就出来了,
你的机器不错。
我才令N=20000,
现在机器还没算完
────────────────────────────────────────
zjliu (fly) 于 2002年06月13日17:11:35 星期四 说道:
我是用N=10000算的!N=20000稍费些时间吧!
────────────────────────────────────────
zjliu (fly) 于 2002年06月13日17:14:07 星期四 说道:
N=20000我用了2分钟
────────────────────────────────────────
yidday (龙溪) 于 2002年06月13日17:15:35 星期四 说道:
ft,我的机器已经死了
太烂了
────────────────────────────────────────
zjliu (fly) 于 2002年06月13日17:20:54 星期四 说道:
建议你用xuedy修改后的程序算,这样能快些!
────────────────────────────────────────
hjdwg (小鱼儿) 于 2002年06月13日17:38:46 星期四 说道:
xuedy的程序还不是最快的,呵呵,看看我改过的,能快20倍。
变量能否进行预分配其实是很影响速度的,另外,我把点改小了点。
function [xx,yy]=tree_leaf(N)
%IFS生成“带梗的植物叶子”(建议运行10000次以上)
x=0;y=0;bbs=rand(1,N);
AA=[0,0,0.16,0,0,0;0.85,-2.5/180*pi,0.85,-2.5/180*pi,0,1.6;...
0.3,49/180*pi,0.34,49/180*pi,0,1.6;0.3,120/180*pi,0.37,-50/180*pi,0,0.44];
figure;
xx=zeros(N,1); yy=zeros(N,1);
for ss=1:N;
if bbs(1,ss)<=0.005;
[x,y]=IFS(x,y,AA(1,1),AA(1,2),AA(1,3),AA(1,4),AA(1,5),AA(1,6));
elseif bbs(1,ss)<=0.805;
[x,y]=IFS(x,y,AA(2,1),AA(2,2),AA(2,3),AA(2,4),AA(2,5),AA(2,6));
elseif bbs(1,ss)<=0.9025;
[x,y]=IFS(x,y,AA(3,1),AA(3,2),AA(3,3),AA(3,4),AA(3,5),AA(3,6));
else
[x,y]=IFS(x,y,AA(4,1),AA(4,2),AA(4,3),AA(4,4),AA(4,5),AA(4,6));
end
xx(ss)=x; yy(ss)=y;
end
plot(xx,yy,'.g','markersize',2);
axis square off;
title('带梗的植物叶子')
function [xp,yp]=IFS(x,y,r,thita,s,phi,h,k)
xp=r*x*cos(thita)-s*y*sin(phi)+h;
yp=r*x*sin(thita)+s*y*cos(phi)+k;
return
────────────────────────────────────────
yidday (龙溪) 于 2002年06月13日17:49:59 星期四 说道:
呵呵,第一次不死机
确实快了很多
────────────────────────────────────────
zjliu (fly) 于 2002年06月13日18:12:09 星期四 说道:
确实,改得不错!
────────────────────────────────────────
flythunder (一生不变) 于 Thu Jun 13 21:33:40 2002) 说道:
太帅了,还有没有这方面的了,看着太舒服了
────────────────────────────────────────
jb (无名氏) 于 2002年06月14日08:45:03 星期五 说道:
这个程序怎么运行?
什么时候给N赋值呀
────────────────────────────────────────
zjliu (fly) 于 2002年06月14日08:48:21 星期五 说道:
把程序拷到相应的工作路径,在命令窗输入tree_leaf(10000)
就行了
────────────────────────────────────────
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.277毫秒