MATLAB动画绘制
来源:互联网 发布:国内如何上google知乎 编辑:程序博客网 时间:2024/06/06 14:17
Matlab动画制作
Matlab的动画制作:
质点动画:最简单的动画产生方式,产生一个顺着曲线轨迹运动的质点来操作。
电影动画:首先保存一系列的图形,然后按照一定的顺序像电影一样的播放。
程序动画:在图形窗口中按照一定的算法连续擦除和重绘图形对象。
质点动画
使用comet、comet3函数来产生质点动画,其步骤如下:
step1:求解出质点完整的运动轨迹坐标x,y和z。
step2:使用comet或者comet3直接绘制动点。
函数comet和comet3调用格式
调用格式
说明
comet(y)
显示质点绕着向量y的动画轨迹(二维)
comet(x, y)
显示质点绕着向量y与x的动画轨迹(二维)
comet(x, y, p)
同上面的效果,但额外地定义轨迹尾巴线的长度p*length(y),
其中p是介于0和1之间的数,默认为0.1
实例:
% 最简单的动画形式,使用comet、comet3函数% 产生一个顺着曲线轨迹运动的质点 % step1:求解出质点完整的运动轨迹坐标x,y和z% step2:使用comet或者comet3直接绘制动点 % 使用函数comet建立质点绕圆运动的动画clf;clear;%{ linspace是Matlab中的一个指令,用于产生指定范围内的指定数量点数,相邻数据跨度相同,并返回一个行向量。 调用方法:linspace(x1,x2,N) 功 能:用于产生x1,x2之间的N点行矢量,相邻数据跨度相同。其中x1、x2、N分别为起始值、终止值、元素个数。若缺省N,默认点数为100。 举例如下:X = linspace(5, 100, 20) % 产生从5到100范围内的20个数据,相邻数据跨度相同 X = 5 10 15 20 25 30 35 40 45 5055 60 65 70 75 80 85 90 95 100 ps:这和X = [5 : 5 : 100]的效果是一样的。%}% 圆周运动t = linspace(0, 2*pi, 10000);x = cos(t);y = sin(t);% 以便比较comet是否跟着轨迹走% plot(x, y);axis([-1, 1 -1, 1]); axis square;hold on; grid on;% comet(x, y, p); p:定义轨迹尾巴的长度,范围在0-1之间,默认时为0.1comet(x, y, 0.03);
% 平抛运动clf;clear;grid on;vx = 40;dt = linspace(0,10,1000);dx = vx*dt;dy = -9.8*dt.^2/2;comet(dx, dy);
% 导弹发射clf;clear;grid on;vx = 100*cos(1/4*pi);vy = 100*sin(1/4*pi);t = 0:0.01:15;dx = vx*t;dy = vy*t-9.8*t.^2/2;comet(dx, dy);
% 使用函数comet3建立质点绕圆运动的动画figure();grid on;tt = 0:pi/500:10*pi;plot3(sin(t),cos(t),t);comet3(sin(tt), cos(tt), tt, 0.5);
电影动画
1、调用moviein函数对内存进行初始化,创建一个足够大的矩阵,使之能够容纳基于当前坐标大小的一系列指定的图形(此处称为帧)。
2、调用getframe函数生成每个帧。该函数返回一个列矢量,利用这个矢量,就可以创建一个电影动画矩阵。
3、调用movie函数按照指定的速度进行指定次数播放该电影动画。例如:movie(M, n)可以播放由矩阵M所定义的画面n次,默认n时只播放一次。
getframe函数和movie函数详解:getframe函数可以捕捉动画帧,并保存到矩阵中。该函数的主要格式有:
1、f = getframe,从当前图形框中得到动画帧;
2、f = getframe(h),从图形句柄h中得到动画帧;
3、f = getframe(h,rect),从图形句柄h的指定区域rect中得到动画帧。
当创建了一系列动画帧后,可利用movie函数播放这些动画帧。该函数的主要格式有:
1、movie(M),将矩阵M中的动画帧播放一次;
2、movie(M, n),将矩阵M中的动画帧播放n次
3、movie(M, n, fps),将矩阵M中的动画帧以每秒fps帧的速度播放n次。
电影动画程序的一般结构:
% 记录电影for j = 1:n % 旋转并记录每个画面 Plot_command; % 以绘画函数来产生动画 M(j) = getframe; % 抓取画面值endMovie(M); % 播放动画
实例1:演示山峰函数绕Z轴旋转的动画。
clc; clear; % peaks是一个函数,其中有2个变量。由平移和放缩高斯分布函数获得。% 参数为30,得到的X、Y、Z为30*30的矩阵。[X, Y, Z] = peaks(30);% surf绘制三维曲面图surf(X,Y,Z); axis([-3,3,-3,3,-10,10]);% 关闭所用坐标轴上的标记、格栅和单位标记。但保留由text和gtext设置的对象axis off;%{ shading:是用来处理色彩效果的,分以下三种: 1、no shading 一般的默认模式 即shading faceted 2、shading flat 在faceted的基础上去掉图上的网格线 3、shading interp 在flat的基础上进行色彩的插值处理,使色彩平滑过渡%}shading interp;%{ colormap:设定和获取当前的色图。 1、colormap(map):设置颜色图为矩阵map。如果map中的任何值在区间[0,1]之外,MATLAB返回错误。 2、colormap('default'):将当前的颜色图设置为默认的颜色图。 3、cmap=colormap:返回当前的颜色图。返回的值都在区间[0,1]内。 map是一个3列矩阵,其元素数值定义在区间[0,1]。矩阵的每行元素表示1一个真色彩向量,即红、绿、蓝3基色的系数。 hot为matlab中预定义的色图样式中的一种,表示:黑、红、黄、白色浓淡交错。%}colormap(hot); % 建立一个20列的大矩阵M = moviein(20);for i = 1:20 % 改变视点 view(-37.5+24*(i-1),30); % 将图形保存到M矩阵 M(i) = getframe;end% 播放画面2次movie(M,2);
实例2:动态展示plot画图
clc; clear; % 初始化一个电影矩阵M = moviein(16);% 创建电影for k = 1:16 plot(fft(eye(k+16))); axis equal; % 调用getframe函数生成每个帧 M(k) = getframe;end% 调用movie函数将电影动画矩阵M(k)播放5次movie(M, 5); % 将前面创建的电影动画中添加一个垂直的滚动条h = uicontrol('style','slider','position',[10 50 20100],'Min',1,'Max',16,'Value',1);for k=1:16 plot(fft(eye(k+16))); axis equal; set(h,'Value',k); % gcf为返回当前图形窗口句柄 M(k) = getframe(gcf);endclf;axes('Position',[0 0 11]);movie(M,5);
实例3:改变色彩矩阵,让影片展示从正片到负片的效果
% 清除电影资料矩阵Mclear M; % 加载图片文件,并画出load clown.mat;% 画出小丑图像image(X); colormap(map);% 抓取30个画面n = 30;scale = cos(linspace(0, 2*pi, n));fprintf('抓取画面中...\n'); M = moviein(n);for i = 1:n % 改变色彩矩阵(让影片呈现出从正片到负片的效果) colormap(((i-1)*(1-map)+(n-i)*map)/n); % 抓取画面,并存入电影资料矩阵M M(i) = getframe;endfprintf('播放电影中...\n');% 播放电影5次(含正向与逆向播放)movie(M, -5);
程序动画
在MATLAB中,可以采用重绘图形对象的方法来创建程序动画。改变对象的方法可以触发MATLAB对该对象进行重绘。
创建程序动画的典型步骤是:
1、绘制一个图形对象;
2、通过在一个程序循环中改变该对象的x,y和z坐标值来实现该对象的移动,从而形成动画。
在创建MATLAB的程序动画时,图形擦除也是非常重要的。
图形动态绘画中三种重要的擦除模式:(通过没置“EraseMode”属性来完成)
1、None:在移动图形对象时,MATLAB不进行擦除;
2、Background:在图形对象移走以后,MATLAB在原来的位置用背景色进行重绘。在这种模式下,MATLAB将原来的对象完全擦除,包括该对象下面的所有图形,如栅格线等;
3、Xor:与Background模式相比,这种模式只擦除对象本身。大多数的MATLAB程序动画都采用这种擦除模式。
目前新版本的Matlab已经不支持EraseMode属性了,坐标图的动画显示实现要依赖animatedline对象,配合drawnow函数使用。
animatedline:创建动画行,使用的语法格式及说明如下:
h = animatedline:创建一个没有数据的动画行,并将其添加到当前轴。在循环中添加点以创建线条动画。
h = animatedline(x, y):创建由初始数据点x和y定义的动画线。
h = animatedline(x, y, z):创建由初始数据点x、y和z定义的动画线。
h = animatedline(___, Name, Value):使用一个或多个Name, Value对参数指定动画行属性。例如,'Color', 'r'将线条颜色设置为红色。需要在输入成对的参数组合之后使用此选项。
h = animatedline(ax, ___):在轴指定的轴ax上创建动画线,而不是在当前轴gca中。如果不指定轴对象,则animatedline使用当前轴。
如果有另一个函数想从当前图形中获得数据,用animateline的getpoints方法:[xdata, ydata] = getpoints(h);
animatedline动画线属性
animatedline动画可以指定可选的逗号分隔的Name,Value参数对。 Name是参数名称,Value是相应的值。Name必须出现在单引号(' ')中。你可以按照任何顺序指定多个名称和值对参数Name1,Value1, ..., NameN, ValueN。
常用的animatedline动画属性
属性名称
说明
备注
Color
线条颜色
线条颜色,指定为RGB三元组,或颜色名称的字符向量,或'none'。默认的RGB值[0 0 0]对应于黑色。若指定'none',那么该行不可见的。
LineStyle
线条样式
'-':实线(默认);'--':虚线();'none':没有线
':':虚线() '-.':点划线();
LineWidth
线条宽度
线宽,默认0.5。如果线条具有标记,则线宽也会影响标记边缘。
Marker
标记符号
默认情况下,没有标记。指定标记符号会在每个数据点或顶点添加标记。
MarkerSize
标记大小
标记大小,以点数表示为正值。(默认为6)
MarkerEdgeColor
标记边缘的颜色
1、'auto':使用Color属性中指定的相同颜色。2、'none':不使用颜色,未填充的标记不可见。3、RGB三元组或颜色名称的字符向量。
MarkerFaceColor
标记内部的颜色
1、'none':不使用颜色,这使内部看不见。2、'auto':使用与Color轴属性相同的颜色。3、RGB三元组或颜色名称的字符向量
MaximumNumPoints
存储和显示的最大点数
动画行存储和显示的最大点数,指定为正值或Inf。默认值是百万。如果点数超过最大值,则动画行将保留最近添加的点,并从该行的起始处删除点。这些丢弃点不再显示,使用getpoints时不会返回。若指定为Inf,则动画行不会丢弃任何点,但存储的点数受限于可用内存量。
颜色属性常用取值
长名称
简称
RGB值
说明
'yellow'
'y'
[1 1 0]
黄色
'magenta'
'm'
[1 0 1]
品红
'cyan'
'c'
[0 1 1]
青色
'red'
'r'
[1 0 0]
红色
'green'
'g'
[0 1 0]
绿色
'blue'
'b'
[0 0 1]
蓝色
'white'
'w'
[1 1 1]
白色
'black'
'k'
[0 0 0]
黑色
标记符号取值
值
描述
值
描述
'o'
圈
'^'
上三角形
'+'
加号
'v'
下三角形
'*'
星号
'>'
右三角形
'.'
点
'<'
左三角形
'x'
交叉
'pentagram'
or 'p'
五角星
'square'
or 's'
矩形
'hexagram'
or 'h'
六角星
'diamond'
or 'd'
菱形
'none'
没有标记
实例1:基本实现
% 动态绘制椭圆 % clf用来清除图形的命令。一般在画图之前用。clf;clc;axis([-2,2,-2,2]);% axis square 当前坐标系图形设置为方形,刻度范围不一定一样,但是一定是方形的。% axis equal 将横轴纵轴的定标系数设成相同值,即单位长度相同,刻度是等长的,但不一定是方形的。axis equal;grid on; h = animatedline('Marker', 'o', 'color', 'b', 'LineStyle', 'none');t = 6*pi*(0:0.02:1);for n = 1:length(t) addpoints(h, 2*cos(t(1:n)),sin(t(1:n))); % 一般是为了动态观察变化过程 pause(a)暂停a秒后执行下一条指令 pause(0.05); % 可以用drawnow update加快动画速度 drawnow update;end
实例2:加快刷新速度
% 加快刷新的技巧,每次循环中都只向结构体中增加一个点,实时显示的话有可能刷新速度跟不上% 所以可以考虑一次循环中向里面添加多个点,这样就可以加快刷新了 h = animatedline;axis([0,4*pi,-1,1]); numpoints = 100000;x = linspace(0, 4*pi, numpoints);y = sin(x);for k = 1:100:numpoints-100 xvec = x(k:k+99); yvec = y(k:k+99); addpoints(h,xvec,yvec); drawnowend
实例3:控制动画的速度,有时候,希望动画显示的慢一点,上面介绍的都是加快动画的,如果要想控制动画速度,可以配合tic函数与toc函数,相当于一个记录程序运行的秒表,调用tic表示按一下开始计时,调用toc表示按一下结束及时,两个之间的时间差就是这一段程序运行的时间,下面这段代码表示控制帧速度在1000。
h = animatedline;axis([0,4*pi,-1,1]);numpoints = 10000;x = linspace(0, 4*pi, numpoints);y = sin(x);% start timera = tic;for k = 1:numpoints addpoints(h,x(k),y(k)); %check timer b =toc(a); if b >(1/1000) % update screen every 1/1000 seconds drawnow; % reset timer after updating a = tic; endend
实例4:
A = [-8/3 0 0; 0 -10 10; 0 28 -1];y = [35 -10 -7]';h = 0.01; p = animatedline('color', 'g');axis([0 50 -25 25 -25 25])hold on; grid on; for i = 1:4000 A(1,3) = y(2); A(3,1) = -y(2); ydot = A*y; y =y+h*ydot; % 更改坐标值 addpoints(p, y(1), y(2), y(3)); drawnow;end
- matlab绘制动画
- MATLAB动画绘制
- 如何用matlab来绘制动画?
- matlab 轻松绘制出曲线的动画效果
- matlab动画
- iOS动画 绘制和动画
- Matlab绘制螺旋线
- Matlab 绘制矢量图
- MATLAB曲线绘制
- matlab绘制立体图
- matlab绘制一元函数图像
- MATLAB曲线绘制
- Matlab绘制二维图
- MATLAB曲线绘制
- Matlab绘制二维图
- MATLAB曲线绘制
- Matlab绘制条形图
- MATLAB旋转体的绘制
- 【BUG玩一天系列】Java spilt方法需要注意的地方
- UltraEdit 取消文件自动备份
- 反射学习笔记
- libevent部分解析
- 关于Linux的alias命令
- MATLAB动画绘制
- Linux
- Eclipse更改maven项目名
- 逻辑运算符&& || !
- sqlAlchemy的ORM经典教程
- 使用Spring JDBCTemplate简化JDBC的操作
- [js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)
- SourceTree图谱 颜色区分哪个分支
- PAT_1084. Broken Keyboard