MATLAB製作簡單動畫的方法

Matlab實現動畫形式主要有兩種,一種是電影形式:將所有動畫預存再像電影般地播放;另一種形式是對象形式:所有點所有曲線曲面均可以作爲一個對象,不斷抹去舊曲線,產生新曲線

1.先介紹一下第一種方式,電影法,也是常用的方法:

%製作動畫(這種方法很費內存)
plot(1,ut(1),'b');
axis([0 1000 3.3 4.2])%定義x軸(從0到100)和y軸的範圍(從3.3到4.2)
theAxes=axis;
M=moviein(1000); %前面要有plot幫助moviein初始化
for k=1:1000
% plot(k,ut(k),'b');hold on;
% plot(k,Usim(k),'r'); %這會實時在屏幕上繪製曲線動畫
%set(h,'xdata',k,'ydata',ut(k));
axis(theAxes)%定義x軸(從0到100)和y軸的範圍(從3.3到4.2)
M(:,k)=getframe; %抓取圖形作爲電影的畫面
end
movie(M,1,30);  %以每秒30幀的速度播放1次

%2.進階(用句柄畫多個對象,佔內存很小)
X_MIN=1;
X_MAX=14000; %指定顯示點的個數
Y_MIN=3.0;
Y_MAX=4.2;
% h1=line('color',[1,0,0],'marker','+','markersize',3);
% h2=line('color',[0,0,1],'marker','o','markersize',3); %none保留舊的曲線的點,不做任何處理
% set(h1,'EraseMode','none');
% set(h2,'EraseMode','none');

a1=line('Linestyle','-.','marker','+','Color',[1 0 0],'markersize',2,'EraseMode','none');
a2=line('Linestyle','-','marker','o','Color',[0 0 1],'markersize',2,'EraseMode','none');
a3=line('marker','s','Color',[0 1 0],'markersize',2,'EraseMode','none');
axis([X_MIN X_MAX Y_MIN Y_MAX]);
grid on
hleg1= legend(gca, [a1 a2 a3], 'Measured', 'Model Predict1','Model Predict2', 0); %爲兩條曲線創建圖例
set(hleg1,'Box','on','position',[0.6,0.75,0.2,0.1]);
set(get(gca,'Xlabel'),'String','Time(s)','FontName','Times New Roman','FontSize',10,...
'FontWeight','bold','FontAngle','normal');%設置座標軸刻度字體名稱,大小
set(get(gca,'Ylabel'),'String','Voltage(V)','FontName','Times New Roman','FontSize',10,...
'FontWeight','bold','FontAngle','normal');%設置座標軸刻度字體名稱,大小

for t=10:-1:1  %倒計時時間
    pause(1);
    fprintf('%d\r\n',t);
end
fprintf('ready\r\n');
for i=X_MIN:X_MAX
    set(a1,'xdata',i,'ydata',ut(i));
    set(a2,'xdata',i,'ydata',Usim(i));   
    set(a3,'xdata',i,'ydata',Usim2(i));
    drawnow;
    %pause(01)
end
fprintf('finished!')

%%
%3.再次進階,使用plot將上述動畫保存成逐幀打印的(保存爲AVI文件)
aviobj=VideoWriter('compare.avi');%新建叫example.avi的文件
open(aviobj); %打開example.avi的文件
X_MAX=1400; %指定顯示點的個數
% pause(5);
% fprintf('ready\r\n');
for i=1:X_MAX
    plot(i,ut(i),'marker','+','markersize',3,'color',[1,0,0]);
    hold on;
    plot(i,Usim(i),'marker','o','markersize',3,'color',[0,0,1]);
    axis([0 X_MAX 3.0 4.2]);
    grid on
    drawnow;
    currFrame = getframe;
    writeVideo(aviobj,currFrame);
    %pause(01)
end
close(aviobj); %關閉
fprintf('finished!\r\n');

%%
%保存爲GIF文件
filename='Curve_Compare4.gif';
X_MAX=1000; %指定顯示點的個數
plot(1,ut(1),'marker','+','markersize',3,'color',[1,0,0]);
hold on;
plot(1,Usim(1),'marker','o','markersize',3,'color',[0,0,1]);   
set(get(gca,'Xlabel'),'String','Time(s)','FontName','Times New Roman','FontSize',10,...
    'FontWeight','bold','FontAngle','normal');%設置座標軸刻度字體名稱,大小
set(get(gca,'Ylabel'),'String','Voltage(V)','FontName','Times New Roman','FontSize',10,...
    'FontWeight','bold','FontAngle','normal');%設置座標軸刻度字體名稱,大小
%set(gca,'position',[0.1 0.1 1 1]);
for i=1:X_MAX
    plot(i,ut(i),'marker','+','markersize',3,'color',[1,0,0]);
    hold on;
    plot(i,Usim(i),'marker','o','markersize',3,'color',[0,0,1]);
    axis([0 X_MAX 3.0 4.2]);
    grid on
    drawnow;
    f=getframe(gcf);  
    imind=frame2im(f);
    [imind,cm] = rgb2ind(imind,256);
    if i == 1
        imwrite(imind,cm,filename,'gif', 'Loopcount',1,'DelayTime',0); %0用最快的速度
    else
        imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0);
    end
    %pause(01)
end
fprintf('finished!\r\n');
close(gcf)
%%
%轉成avi
X_MAX=100; %指定顯示點的個數
plot(1,ut(1),'marker','+','markersize',3,'color',[1,0,0]);
hold on;
plot(1,Usim(1),'marker','o','markersize',3,'color',[0,0,1]);   
set(get(gca,'Xlabel'),'String','Time(s)','FontName','Times New Roman','FontSize',10,...
    'FontWeight','bold','FontAngle','normal');%設置座標軸刻度字體名稱,大小
set(get(gca,'Ylabel'),'String','Voltage(V)','FontName','Times New Roman','FontSize',10,...
    'FontWeight','bold','FontAngle','normal');%設置座標軸刻度字體名稱,大小
%set(gca,'position',[0.1 0.1 1 1]);
MOV=moviein(X_MAX);
for i=1:X_MAX
    plot(i,ut(i),'marker','+','markersize',3,'color',[1,0,0]);
    hold on;
    plot(i,Usim(i),'marker','o','markersize',3,'color',[0,0,1]);
    axis([0 X_MAX 3.0 4.2]);
    grid on
    drawnow;  
    MOV(i)=getframe(gcf);
    %pause(01)
end
movie2avi(MOV, 'mytest.avi','compression','None','FPS',60);
fprintf('finished!\r\n');
close(gcf)

%%
%4.這個是摘抄的例子實現了座標軸移動+avi視頻
aviobj=VideoWriter('example3.avi');%新建叫example.avi的文件
open(aviobj); %打開example.avi的文件
t=[0]
m=sin(t)
p = plot(t,m,'EraseMode','background','MarkerSize',5);
x=-1.5*pi;
axis([x x+2*pi -1.5 1.5]);
grid on;
for i=1:100
    t=[t 0.1*i];
    m=[m sin(0.1*i)];
    set(p,'XData',t,'YData',m)
    drawnow
    x=x+0.1;
    axis([x x+2*pi -1.5 1.5]);
    pause(0.01); %最快速度是10幀/s,即使註釋掉這句
    currFrame = getframe;
    writeVideo(aviobj,currFrame);
end
close(aviobj); %關閉
fprintf('finished!')

%%
%5.新的技術animatedline出錯??????animatedline是2014b引入的函數
a1 = animatedline('Color',[0 .7 .7]);
a2 = animatedline('Color',[0 .5 .5]);

axis([0 20 -1 1])
x = linspace(0,20,10000);
for k = 1:length(x);
    % first line
    xk = x(k);
    ysin = sin(xk);
    addpoints(a1,xk,ysin);

    % second line
    ycos = cos(xk);
    addpoints(a2,xk,ycos);

    % update screen
    drawnow limitrate
end

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章