码迷,mamicode.com
首页 > 其他好文 > 详细

matlab画动画

时间:2015-08-04 15:26:34      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

一般来说,matlab制作动画有四种方式。
第一 、以质点运动轨迹的方式显示
使用comet、comet3函数,前者是二维,后者是三维
comet(y)显示质点绕向量y,comet(x,y)显示质点绕向量y与x,comet(x,y,p),其中为轨迹尾巴的长度
以comet(x,y)为例,
显示平抛运动
   vx = 40;
   t = 0:0.001:10;
   x = vx*t;
   y = -9.8*t.^2/2;
   comet(x,y)
显示导弹发射
   vx = 100*cos(1/4*pi);
   vy = 100*sin(1/4*pi);
   t = 0:0.001:15;
   x = vx*t;
   y = vy*t-9.8*t.^2/2;
   comet(x,y)
匀速圆周运动
   sita = 0:0.0001:2*pi;
   r = 10;
   x=r*cos(sita);
   y=r*sin(sita);
   comet(x,y)
comet3与comet的用法相类似,可以在帮助文件里的例子
       t = -10*pi:pi/250:10*pi;
       comet3((cos(2*t).^2).*sin(t),(sin(2*t).^2).*cos(t),t)

第二、以电影播放的方式显示
保存想要产生动画的图片,存储为一系列各种类型的二维、三维图,再像放电影的方式按次序播放出来。步骤由getframe函数将当前的图片抓取为电影的画面,再由movie函数将动画显示出来。
如:
[x,y] = meshgrid([-1.05:.2:3.75]);
z = x.*exp(-x.^2-y.^2);
axis tight;
set(gca,‘nextplot‘,‘replacechildren‘);
for j = 1:40
      surf(x*sin(pi*j/100),y*sin(pi*j/100),z*sin(-pi*j/100));
      m(j) = getframe
end
movie(m)
第三、以对象方式显示
设置对象的属性EraseMode,更新对象来产生新图,drawnow()函数进而覆盖旧图,从而使得图形不断发生变化。
例:
x = -pi:pi/30:pi;
h = plot(x,cos(x),‘o‘,‘MarkerEdgeColor‘,‘k‘,‘MarkerFaceColor‘,‘r‘,‘MarkerSize‘,8,‘EraseMode‘,‘Xor‘)
for j = 1:10000
       y = 1/2*sin(3*x+0.006*j);
       set(h,‘ydata‘,y);
       drawnow;
end
第四、以旋转颜色的方式显示
matlab中如何输出avi格式影片文件
以上文《穿越(fly through)图形动画实例》为基础,将屏幕上显示的动画保存到avi格式文件中。
clc; %清屏
clear all; %清除所有变量
load wind; %加载matlab自带数据程序
wind_speed = sqrt(u.*u + v.*v + w.*w);  
%计算风速
hpatch=patch(isosurface(x,y,z,wind_speed,35)); %isosurface计算wind_speed=45的等势面
%patch命令绘制等势面
isonormals(x,y,z,wind_speed,hpatch); %isonormals计算等势面的正交向量,使画面更光滑
set(hpatch,‘FaceColor‘,‘red‘,‘EdgeColor‘,‘none‘); %设定等势面的表面颜色为红色
daspect([1 1 1]); ?ta aspect
[f verts]=reducepatch(isosurface(x,y,z,wind_speed,45),.05);
% reducepatch ,减少需要描绘等势面所需要表面数, 减少至 5%
hcone=coneplot(x,y,z,u,v,w,verts(:,1),verts(:,2),verts(:,3),2); %绘制穿越等势表面的圆锥流体
set(hcone,‘FaceColor‘,‘blue‘,‘EdgeColor‘,‘none‘);
camproj perspective  %设置该图形的投影方式为透视
camva(25); %设置视角为25度
hlight = camlight(‘headlight‘); %在照相机出创建光源.
set(hpatch,‘AmbientStrength‘,.1,...  %设置环境光的光度为0.1,表面环境光近乎为黑色
    ‘SpecularStrength‘,1,...   %设置块对象的镜面反射强度为1
    ‘DiffuseStrength‘,1);     %设置快对象的漫反射强度为1
set(hcone,‘SpecularStrength‘,1);  %设置锥形流体的镜面反射强度为1
set(gcf,‘Color‘,‘k‘); %将图像窗的颜色设置为黑色
lighting phong  %sets the lighting to phong.
set(gcf,‘Renderer‘,‘zbuffer‘); %设置光源的着色属性为zbuffer,也可以尝试openGL
 
hsline=streamline(x,y,z,u,v,w,80,30,11);  %创建一个从点(80,30,11)开始的流线
xd = get(hsline,‘Xdata‘);  %取得这条流线的x,y,z坐标
yd = get(hsline,‘Ydata‘);
zd = get(hsline,‘Zdata‘);
delete(hsline); %流线已无用,可删除
 
%以下为此动画的核心部分
aviobj=avifile(‘fly_through.avi‘,‘fps‘,3);
%创建avi对象,命名为fly_through.avi, 3帧每秒
for i=1:length(xd)-50   %从点(80,30,11)开始,到终点前的50个点出结束。
    campos([xd(i),yd(i),zd(i)]);   %设定照相机的位置为当前点位置
    camtarget([xd(i+5),yd(i),zd(i)]);  %设置照相机的目标位置,在照相机位置向前5个点出
    camlight(hlight,‘headlight‘);  %光源也移至照相机处
    drawnow  %绘制移动后的图形
    frame=getframe(gcf);  %获取当前frame
    aviobj=addframe(aviobj,frame);  %将当前图像加入到avi对象中
end
aviobj=close(aviobj);  %结束时关闭avi对象
%注意,此方法,运行时不能移动或改变动画窗口的大小。
function makeavi(filepath,frames,format)
% This function make AVI video from images
% filepath:    the location of target image
% frames:     the numbles of frame that you want to use  
% fromat:     the format of images
%================设置相关属性======================
location=filepath;
 
fig=figure;
 
set(fig,‘DoubleBuffer‘,‘on‘);
 
set(gca,‘xlim‘,[-80 80],‘ylim‘,[-80 80],...
 
    ‘NextPlot‘,‘replace‘,‘Visible‘,‘off‘)
 
aviObj=avifile(‘examples.avi‘); % Create a new AVI file
 
aviObj.Quality = 100;  %只对压缩格式有效,[0,100],default:75
 
aviObj.fps=1;    %the speed of the AVI movie in frames per second (fps),default:15 fps
 
aviObj.Compression=‘None‘;  % compression codec指定压缩编解码器
%=======设置黑白图像属性===========
%cola=0:1/255:1;   
 
%cola=[cola;cola;cola];
%cola=cola‘;
 
%aviobj.colormap=cola;
% =====多帧循环开始,读序列图像=================
for num=1:frames
 
    Im_origin = imread( strcat(location,‘\‘,num2str(num),‘.‘,format) );
 
    Im= im2uint8(Im_origin);
 
    % F = getframe(gca);
 
    aviObj = addframe(aviObj,uint8(Im));
 
end
 
aviObj=close(aviObj);
 
mov = aviread(‘examples.avi‘);
 
movie(mov);
 
close all;
 
转载自:http://blog.sina.com.cn/s/blog_6b7d710b0101m39u.html

matlab画动画

标签:

原文地址:http://www.cnblogs.com/sddne/p/4701996.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!