%by markfang
%2018 6 24
function qunliu( xx,yy,r,ceng )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
hang=linspace(0,2*pi,7);
for i=1:1:ceng
for j=1:1:length(hang)
theta(i,i*j-i+1) = hang(j);
cx(i,i*j-i+1)=sqrt(3)*i*r*cos(theta(i,i*j-i+1)); %这是每层上角度为pi/3,2*pi/3...小区中心
cy(i,i*j-i+1)=sqrt(3)*i*r*sin(theta(i,i*j-i+1));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if(ceng>=2)
for i=2:1:ceng
for j=1:1:length(hang)-1
for k=1:1:i-1 %求那些非pi/3整数倍角度上的中心,依据第n层的是n分点
cx(i,i*j-i+1+k)=((i-k)*cx(i,i*j-i+1)+k*cx(i,i*j+1))/i;
cy(i,i*j-i+1+k)=((i-k)*cy(i,i*j-i+1)+k*cy(i,i*j+1))/i;
end
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
zx=cx+xx;
zy=cy+yy;
f=getframe(gcf);
imind=frame2im(f);
[imind,cm] = rgb2ind(imind,256);
imwrite(imind,cm,'正六边形组成多层图像动画绘制过程.gif','gif', 'Loopcount',inf,'DelayTime',0.5);%第一次必须创建!
for i=1:1:ceng
for j=1:1:6*i
cirliu(zx(i,j),zy(i,j),r);
text(zx(i,j),zy(i,j),num2str(i))
hold on;
pause(0.2)
f=getframe(gcf);
imind=frame2im(f);
[imind,cm] = rgb2ind(imind,256);
imwrite(imind,cm,'正六边形组成多层图像动画绘制过程.gif','gif','WriteMode','append','DelayTime',0.5);%动态图保存gif格式.
end
end
%1.matlab里要生成动态图像关键有两个:
%<1>图像数据,要准备多幅同样大小的图像或者将图像数据变化的过程保存下来;
%<2>正确调用imwrite函数,最主要有两个属性,1是DelayTime,控制图像切换的间隔,
%2是LoopCount,用于设置图像默认的循环次数,默认是无穷次(一般的GIF图都是无穷次),即不断循环,若要手动设置此值,0代表循环一次,1代表循环两次,以此类推。
%2.可以将Matlab本身用getframe获得的帧频记录转换成avi视频,函数为movie2avi(存储帧频的矩阵, avi名称)。
%解决方法一:如上所说先使用 overwrite mode ,之后再改回 append mode,这种方法可以,但是由于是附加操作,这样制作出了的gif的第一帧和最后一帧是一样的。
%解决方法二: 在使用 append mode,前加一条语句来创建*.gif文件,但要保证只在第一帧时创建.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function cirliu(xx,yy,r)
theta = linspace(pi/6,13*pi/6,7);
plot(r*cos(theta)+xx,r*sin(theta)+yy,'r-');
fill(r*cos(theta)+xx,r*sin(theta)+yy,'g');%填充颜色
hold on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%