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毫秒