matlab分形作图(一) |
您所在的位置:网站首页 › 分形维数图像分割怎么做出来的 › matlab分形作图(一) |
〇雪花图形的复数三点同时作图法 cc; new=[0,1,1/2+1i*sqrt(3)/2,0]; subplot(2,3,1);%第一个图是三角形,顶点new plot(new) axis equal for k=1:5; old=new; n=length(old)-1;%第一次时n=3,4个点之间有3条线 diff=(old(2:n+1)-old(1:n))/3;%就是三角形三条边的向量缩小三倍 new(1:4:4*n-3)=old(1:n);%要plot出第二个图形,new要有这几个图形的顶点坐标,这是三角形三个顶点的坐标 new(2:4:4*n-2)=old(1:n)+diff;%相当于对三个顶点分别沿其方向平移 new(3:4:4*n-1)=new(2:4:4*n-2)+diff*exp(-1i/3*pi);%diff可以角度变换 顺时针-i,逆时针i new(4:4:4*n)=old(1:n)+diff+diff; new(4*n+1)=old(n+1);%最后回到原点 subplot(2,3,k+1) plot(new) axis equal end ②分形树的字符数组画法 % 图形可视为长短不一走向不同的线段组合 % 用字符系统表示各种线段的画法和组合 % 画图就是按照字符系统来画线段 %画分形树 初始元F 生成元FF-[-F+F+F]+[+F-F-F] %转角 pi/8 压缩因子1/3 clear init='F';%初始元 fund='FF-[-F+F+F]+[+F-F-F]';%生成元 A=pi/2; z=0; b=pi/8; zA=[0,A]; for i=2:5 init=strrep(init,'F',fund);%把init中的‘F’字符替换成fund字符串,此时的init还是一维的 n=(1/3)^(i-1); end S=length(init); figure; axis equal; hold on for k=1:S switch init(k);%比较init中的每一位字符,那上面蕴含变换信息 case 'F', plot([z,z+n*exp(1i*A)],'linewidth',2) z=z+n*exp(1i*A); case '+' A=A+b; case '-' A=A-b; case '[' %因为plot是'一笔画',所以分形到枝杈的地方要回去,先记录之前的位置和角度 zA=[zA;[z,A]]; case ']' z=zA(end,1); A=zA(end,2); zA(end,:)=[]; otherwise end end ③分形树相似平移法 u=[0,1i];%直线 for k=1:4 m=u/3;%对直线缩小三倍 uu=[m,... %缩小三倍的直线 1i/3+m*exp(1i*(pi/6)),... %旋转30°并向上平移1/3 m+1i/3,... 2i/3+m*exp(-1i*pi/6),... m+2i/3]; %对应图1的五条长度1/3的直线 subplot(2,2,k) plot(uu) %相似平移法在画分形时非常好用好理解 hold on pause(1) axis([-0.5 0.5 0 1]); u=uu; end ④相似平移对矩阵的操作 u=[0;1;0.5+0.5i*sqrt(3); 0];%这里用列向量 polt实际上变成了对矩阵作图 for k=1:4 m=0.5*u; u=[m m+0.5 m+0.25+0.25i*sqrt(3)];%加的这个数与k无关 因为m始终是一个1/4的大小 这是平移思想的体现 subplot(2,2,k) plot(real(u),imag(u),'g')%直接写plot(u)也行 end ⑤用相似移动法做作业 %相似移动法画分形图 因为是直线 所以用把初始值设成[0,i],然后第一幅图的 % 直线个数是1[0,i],第二幅图的直线个数是6:通过对[0,i]进行放缩和平移实现作图 % 第三幅图的直线个数是36(使用相似移动就不用考虑之后的东西了 cc figure i=1i; u=[0,i]; subplot(2,3,1) plot(u) axis([-0.5 0.5 0 3]) hold on for k=1:5 uu=[u,... 0.56*i+0.33*u*exp(i*pi/6),... 0.56*i+0.33*u*exp(-i*pi/6),... NaN,... i+0.26*u*exp(i*pi/6),... i+0.26*u*exp(-i*pi/6),... i+0.6667*u]; subplot(2,3,k+1) plot(uu) pause(1) u=uu; end ⑥画四面体分形 figure Xabc=[0,1,1/2,0]; Yabc=[0,0,sqrt(3)/2,0]; Zabc=[0,0,0,0]; Xbcd=[1,1/2,1/2,1]; Ybcd=[0,sqrt(3)/2,sqrt(3)/6,0]; Zbcd=[0,0,2/3,0]; Xcda=[1/2,1/2,0,1/2]; Ycda=[sqrt(3)/2,sqrt(3)/6,0,sqrt(3)/2]; Zcda=[0,2/3,0,0]; Xdab=[1/2,0,1,1/2]; Ydab=[sqrt(3)/6,0,0,sqrt(3)/6]; Zdab=[2/3,0,0,2/3]; init=[Xabc,Xbcd,Xcda,Xdab;Yabc,Ybcd,Ycda,Ydab;Zabc,Zbcd,Zcda,Zdab]; nan=[NaN;NaN;NaN]; subplot(2,2,1) plot3(init(1,:),init(2,:),init(3,:),'g') u=1/2*init;%初始化u for k=1:3 u1=[u(1,:)+0.5;u(2,:);u(3,:)]; u2=[u(1,:)+0.25;u(2,:)+sqrt(3)/4;u(3,:)]; u3=[u(1,:)+0.25;u(2,:)+sqrt(3)/12;u(3,:)+1/3]; uu=[u,nan,u1,nan,u2,nan,u3,nan]; subplot(2,2,k+1) plot3(uu(1,:),uu(2,:),uu(3,:),'g')%暂时没想出来怎么改写成fill3的形式 pause(1) u=uu/2; end %方法 先考虑了三维坐标下 一个面的分形(这样只有三组数,否则有12组) %发现写成[X;Y;Z]形式 可以非常方便地plot3出来,并且能相对容易的进行平移伸缩变换 以上为计算物理上课笔记 封面 i=1i; x=linspace(-2.0,1.0,400); y=linspace(-1.5,1.5,400); [Re,Im]=meshgrid(x,y); C=Re+i*Im; B=0; Z=0; for I=1:50 Z=Z.*Z+C; % B=B+(abs(Z) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |