(完整版)matlab第九讲教案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西南科技大学本科生课程备课教案
计算机技术在安全工程中的应用
——Matlab入门及应用
授课教师:徐中慧
班级:
专业:安全技术及工程
第九章 高级绘图
课型:新授课 教具:多媒体教学设备,matlab 教学软件
一、目标与要求
掌握matlab 如何处理三种不同类型的图形文件,使用句柄图形指定绘图的句柄并调整特性,通过matlab 两种技术的任意一种创建动画。
二、教学重点与难点
本堂课教学的重点与难点在于引导学生掌握句柄图形的使用,并掌握matlab 创建动画的方法。
三、教学方法
本课程主要通过讲授法、演示法、练习法等相结合的方法来引导学生掌控本堂课的学习内容。
四、教学内容
(1)火箭垂直向上发射。
在t=0时火箭发动机关闭,此时火箭的高度为海拔500,速度为125m/s ,考虑重力加速度,根据等式
2
9.8()125500,02
h t t t t =-
++f ①创建函数heigh t ,以时间为输入变量,火箭的飞行高度为输出变量。
利用函数对下面的②和③进行求解。
②时间增量为0.5秒,变化范围0到30秒,画出函数height 与时间的关系曲线。
③计算火箭开始向地面降落的时间(可以使用函数max )。
④创建函数height 的函数句柄height_handle 。
⑤以height_handle 作为函数fplot 的输入参数,画出0到60秒内的函数曲线。
⑥用函数fzero 求火箭返回地面所用的时间(当火箭返回地面时,函数height 的值应该等于0)。
fzero 是复合函数,可以用函数或函数句柄作为输入参数。
调用方法如下:
fzero(function_handl e ,x_guess)
函数fzero 的两个输入参数分别是函数句柄和函数值接近0时的x 的估算值。
读者可以根据绘出的曲线选择合理的x_guess 值。
①function output=height(t)
output=-4.9.*t.^2+125.*t+500;
②
%% two t=0:0.5:30; h=height(t); plot(t,h,'o-r') hold on %% three [a,b]=max(h); t_max=t(b) %% four
height_handle=@(t) height(t);
%% five
fplot(height_handle,[0,60]);
%% six
fzero(height_handle,30)
(2)①创建匿名函数my_function,计算下式:
253x
---+
x x e
②用函数fplot画出x在-5到+5之间的函数曲线。
函数句柄可以作为函数fplot的输入参数。
③在此x范围内,用函数fminbnd求函数的最小值。
fminbnd是复合函数,其输入参数可以是函数也可以是函数句柄。
调用方法如下:
fminbnd(function_handle,xmin,xmax)
函数fminbnd有三个输入参数:函数句柄、x的最小值和x的最大值。
利用该函数求在x的最小值和最大值之间函数的最小值。
my_function=@(x) -x.^2-5.*x+exp(x);
fplot(my_function,[-5,5]);
a=fminbnd(my_function,-5,5)
(3)西科大安家费提取利息计算。
根据相关规定我国公民个人每月收入超过2000元需缴纳个人所得税。
我国个人所得税采用阶梯税率,当月收入越高,所缴税款越多。
西科大安家费的提取有多种形式:可以一次性提取,也可以等额多次提取。
问题1:编写函数M文件,计算每月定额提取一定数额的安家费所缴纳的税款及提取期限。
(假设每月工资收入为4000元)
问题2:调用问题1编写的函数M文件,绘制总税款随定额提取金额和总税款随提取期限变化的二维图形
⏹问题一
①定义主函数M文件;
②计算当月应缴税工资部分;
③调用子函数计算缴纳的总税款和缴税的总期
限;
④编写子函数计算每月应缴纳的税款。
输入:安家费总金额,每月提取定额
输出:缴纳的总税款,缴税期限⏹问题二
①建立脚本M文件
②调用问题一建立的函数文件,计算总利息和
提取期限
③计算总利息随每月安家费提取金额变化的
二维图形
④计算总利息随提取期限变化的二维图形
(1)function [tax,duration]=mytax(s,x)
Y=4000+x;
Y1=Y-2000;
if rem(s,x)==0
duration=s./x;
tax=(myfunction(Y1)-myfunction(4000)).*duration;
else duration=fix(s./x)+1;
b=myfunction(s-x.*(duration-1));
tax=myfunction(Y1).*(duration-1)-myfunction(4000).*duration+b;
end
function tax=myfunction(a)
if a<=5000
tax=500*0.05+1500*0.1-25+(a-2000)*0.15;
elseif 5000<a<=20000
tax=500*0.05+1500*0.1+3000*0.15+(a-5000)*0.2;
elseif 20000<a<=40000
tax=500*0.05+1500*0.1+3000*0.15+15000*0.2+(a-20000)*0.25
else disp('error')
end
(2)x=2500:100:40000;
[a,b]=mytax(80000,x);
subplot(2,1,1)
plot(x,a,'-')
xlabel('money/permonth')
ylabel('tax')
grid
subplot(2,1,2)
plot(b,a,'-')
xlabel('month')
ylabel('tax')
grid
引言
工程中常用的基本图形是x-y坐标、极坐标和曲面等图形,常用于商业用途的图形是饼图、条形图和
柱状图。
Matlab提供了重要的图形控制功能,使人们不仅可以处理图形(如数字照片),还能够创建物理过程的数据和模型的三维表示(曲面图形除外)。
图像的相关特性引入。
绝大多数的图形图像软件教程都会浅显地介绍一下位图、矢量图、分辨率、像素等基本概念。
网上也有很多文章可以查阅了。
矢量图
矢量图使用线段和曲线描述图像,所以称为矢量,同时图形也包含了色彩和位置信息。
例如树叶的矢量图,就是利用大量的点连接成曲线来描述树叶的轮廓线.然后根据轮廓线,在图像内部填充一定的色彩. 矢量图更多的用于工程作图中,比如我们用CAD作的图。
位图
位图就是我们称为像素的一格一格的小点来描述图像.大家的计算机屏幕其实就是一张包含大量像素点的网格.在位图中,上面我们看到的树叶图像将会由每一个网格中的像素点的位置和色彩值来决定.每一点的色彩是固定的,当我们在更高分辨率下观看图像时,每一个小点看上去就像是一个个马赛克色块, 像素
像素指一幅位图里面最小组成单位,像素不能再被划分为更小的单位。
在一般情况下,它是一块正方形,带有颜色、明暗、相对于整个图像的坐标等信息,
一定数量的颜色有别的正方形小块排列组合,用以表示一幅点阵图像,也就是位图图像。
通过数码相机拍摄、扫描仪扫描或位图软件输出的图像都是位图。
分辨率
分辨率:像素不可以再被划分为更小的点,但实际上像素是有大有小的。
单位面积内容纳的正方形小块的数目,就是一幅图像的分辨率。
单位面积内,容纳的像素越多,单个像素也越小,图像质量越高;反之,单位面积内容纳的像素越少,单个像素越大,图像质量越低。
为表示方便,图像分辨不用面积来表示,而是用矩形的一边上的单位长度内所容纳的像素数来表示,长度单位一般是英寸,我们常说的印刷图像的分辨率是300,即表示这幅图像一英寸长度(合2.54厘米)内含有300个像素,一平方英寸内则有9万像素。
数字图像在计算机上以位图(bitmap)的形式存在,位图是一个矩形点阵,其中每一点称为像素(pixel),像素是数字图像中的基本单位。
一幅m×n大小的图像,是由m×n个明暗度不等的像素组成的。
数字图像中各个像素所具有的明暗程度由灰度值(gray level)所标识。
灰度是指黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0。
而由黑到白之间的明暗度均匀地划分为256个等级。
故黑白图片也称灰度图像,在医学、图像识别领域有很广泛的用途对于黑白图像,每个像素用一个字节数据来表示,而在彩色图像中,每个像素需用三个字节数据来表述。
彩色图像可以分解成红(R)、绿(G)、蓝(B)三个单色图像,任何一种颜色都可以由这三种颜色混合构成。
在图像处理中,彩色图像的处理通常是通过对其三个单色图像分别处理而得到的。
(1)图像
因为Matlab是一个矩阵运算程序,所以它将图像存储为矩阵。
在图像存储于矩阵中时,通常从图像的左上角开始,由左向右,自上而下来表示数据。
在Matlab中有两个函数采用这种格式显示图像,它们分别是image和imagesc。
imshow也常用。
在图像存储于矩阵中时,通常从图像的左上角开始,由左向右,自上而下来表示数据。
最大正值通常表示红色。
最小值通常表示蓝色。
Eg:x=[1:99;2:100;3:101];imagesc(x)
EG: peaks
①图像类型
Matlab可以识别三种不同的存储和表示图像的技术:
●亮度(或灰度)图像。
●索引图像。
●RGB(或真彩色)图像。
关键概念:两个函数用于显示图像,即imagesc和image。
亮度(或灰度)图像
利用尺度图像函数(imagesc)可以将山峰函数表示为灰度图像。
在这种方法中,图像的色彩取决于色图。
对存储于图像矩阵中的数值进行标度,并将其与一幅已知的图相关联。
图jet colormap是默认的方式。
当显示的参数与实际色彩不相关时,这种方法具有较好的运行效果。
例如:函数peaks通常用于比较山峰和山谷的范围,但是用红色表示海拔高度并不明确,从美学的角度看,这是可以随意选择的。
色图也可以提高图像中感兴趣的特征。
观察这样一个例子,传统的X光图像是胶片曝光后产生的结果,现如今许多X光图像不再使用胶片,而是被处理为数字图像,并存储在数据文件中。
因为X光图像的亮度与颜色无关,所以根据需要可随意对文件进行操作。
Matlab中包含一个实例文件,是一张数字化的脊椎X光胶片图像,该图像适用于尺度图像函数显示。
下载文件:
load spine
该文件包含许多矩阵(查看工作窗口)。
灰度矩阵被命名为X(大写),表示为
imagesc(x)
该函数所产生的图像的颜色取决于当前的colormap,其默认状态为jet。
如果使用色图bone,那么这幅图看起来更像是传统的X光图片:
colormap(bone)
虽然通常把图像数据视为矩阵,但这些数据不一定要用标准的图形格式存储。
Matlab中包含一个函数imfinfo,它能够读出标准图形文件的数据,并确定文件中包含的数据类型。
命令行为: imfinfo(‘xxx.jpg’)
为了从这个图形文件中创建Matlab矩阵,使用图像读取函数imread,并给结果赋予变量名:
X=imread(‘mimas.jpg’);
imagesc(X)
索引图像
当图像的颜色很重要时,创建图像的技术称为索引图像。
此时,矩阵不再是亮度值的列表。
而是颜色的列表。
所创建的图像更像是一幅由数字标出各区域颜色的图画。
每元素包含一个与颜色对应的数字。
颜色列表在另一个称为色图的n×3矩阵中,它定义n种不同的颜色,每种颜色用红、绿、蓝三原色来表示。
每一幅图像有自己的定制色图,也可以使用内置的色图。
考虑一个内置的有关狒狒的样本图像,利用下面的命令获得:
load mandrill
文件包含索引矩阵X和色图map(检查工作窗口确认这些文件已经被下载;图像的名称通常用来对Matlab程序的存储)。
函数image用于显示索引图像:
image(X)
colormap(map)
Matlab图像填满整个窗口显示,所以图像看上去有些扭曲。
利用命令axis可以强制按正确的比例显示:
axis image
函数image和imagesc类似,然而,它们会给出不同的结果。
在亮度图像中,色图gray与存储的色彩并不对应。
确定被显示图像的文件类型非常重要,这有助于选择最佳的图像显示方式。
索引图像通常以
GIF图片格式存储。
但是,当使用函数imfinfo指定了文件参数后,文件格式就不会是这样。
真彩色(RGB)图像
第三种图像存储技术是将图像数据存储于m×n×3的三维矩阵中。
三维矩阵包含行、列和页等三部分。
真彩色图像文件包含三个页,每个页对应红、绿、蓝中的一种颜色亮度。
真彩色图像文件包含三个页,每个页对应红、绿、蓝中的一种颜色亮度。
读写图像文件
读图像信息
①将图像信息读入matlab的最简单的方法可能是利用交互式的import wizard。
在当前目录窗口中,只要双击要输入的图像文件名即可。
②对于大多数标准的图像格式而言,例如.jpg或.tif,函数imread是比较方便的方法。
③如果文件是.mat或者.dat格式,那么,调用函数load是最简单的输入数据的方法。
对于.mat文件,可以不包括扩展名.mat。
然而,对于.dat文件,则需要包含扩展名.dat。
load <filename.dat>
以下是下载内置图像文件的常用方法以及实现在当前目录中输入图像矩阵和色图的命令。
load cape
image(X)
colormap(map)
axis image
axis off
存储图像文件
①Matlab图像的保存方法与一般图形文件的保存方法相同。
选择
File——Save as……再选择保存图像的文件类型和位置。
②函数imwrite也可以对文件进行保存。
根据需要保存数据类型,这个函数可以接受许多不同的输入。
如果输入数据是强度(灰度)数组或者真彩色(RGB)数组,那么,函数imwrite希望的输入形式为 imwrite(arrayname,’filename.format’)
arrayname 是Matlab数组名称;
filename是保存数据的文件名称;
format是文件扩展名,例如:jpg和tif
若保存RGB图像到一个名为flowers的.jpg文件中,则命令语句为
imwrite(X,’flowers.jpg’)
存储索引图像(具有定制色图的图像)需要同时保存数据矩阵和色图:
imwrite(arrayname,colormap_name,’filename.format’)
(2)句柄图形
句柄是分配给Matlab对象的昵称。
Matlab使用体系化结构来组织绘图信息。
基本的绘图对象是图形。
图形包含许多不同的对象,其中之一是坐标系。
坐标覆盖在图形窗口的上面。
坐标也可以包含许多不同的对象,其中之一是绘图。
绘图覆盖在坐标的上面。
不论在命令窗口,还是在M文件,使用函数plot以后,matlab自动创建一个图形和一个恰当的坐标,然后,在坐标上绘制图形。
Matlab对许多图形对象的特性使用默认值。
例如,第一条曲线经常使用蓝色,除非用户要改变它。
①绘图的句柄
为一个绘图分配一个名称(称为句柄),可以简单方便的查询Matlab列出的绘图对象特征。
x=1:10;
y=x.*1.5;
h=plot(x,y)
其中变量h是绘图的句柄,当然也可以选择其它的变量名。
利用函数get查询绘图的特性:
get(h)
DisplayName: ''
Annotation: [1x1 hg.Annotation]
Color: [0 0 1]
EraseMode: 'normal'
LineStyle: '-'
LineWidth: 0.5000
Marker: 'none'
MarkerSize: 6
MarkerEdgeColor: 'auto'
MarkerFaceColor: 'none'
XData: [1 2 3 4 5 6 7 8 9 10]
YData: [1.5000 3 4.5000 6 7.5000 9 10.5000 12 13.5000 15]
ZData: [1x0 double]
颜色特性列为[0 0 1]。
颜色被描述为光线的每一种基本颜色:红、绿、蓝。
数组[0 0 1]表示指定颜色没有红色和绿色,而是100%蓝色。
②图形的句柄
为操作方便,可以对图形直接指定句柄。
因为前面用来绘图的图形窗口名称为figure1
H=figure(1)
get(H)
Alphamap = [ (1 by 64) double array]
CloseRequestFcn = closereq
Color = [0.8 0.8 0.8]
Colormap = [ (64 by 3) double array]
CurrentAxes = [171.005]
CurrentCharacter =
CurrentObject = []
CurrentPoint = [0 0]
DockControls = on
DoubleBuffer = on
可以看出图形窗口的特性列表与绘图曲线的特性列表是不相同的。
例如:颜色Color = [0.8 0.8 0.8],它指定了红、绿、蓝具有相同的强度,当然结果是一个白色的背景。
如果没有图形指定句柄,则可以使用命令gcf(取得当前图形)查询Matlab,以确定当前图形的句柄名称:
get(gcf)
③坐标的句柄
与图形和绘图的句柄一样,通过函数gca(取得当前坐标)可以指定一个坐标的句柄:
x=1:10;
y=x.*1.5;
plot(x,y)
h_axis=gca;
get(h_axis)
ActivePositionProperty = outerposition
ALim = [0 1]
ALimMode = auto
AmbientLightColor = [1 1 1]
Box = on
CameraPosition = [5.5 7.5 17.3205]
CameraPositionMode = auto
CameraTarget = [5.5 7.5 0]
CameraTargetMode = auto
④注释坐标
除上面描述的三种组件外,还有一个叠加在绘图中的透明层。
该层用来插入一些注释对象到图窗口中,例如线型、图例说明和文本框。
⑤使用句柄操作图形
利用函数set可以改变对象的特性。
函数set的第一个输入内容是对象句柄,然后用不同的字符串指定特性的名称,紧随其后是一个新的特性值。
set(h,'color','red')
set(h,'name','My graphy')
或者set(gcf,'name','My graphy')
在图形菜单栏选择view,并选择特性编辑器,可以交互式的完成上述功能:
View——property editor
(2)动画
MATLAB 产生动画的方式有两种:
电影方式:
以影像的方式预存多个画面,再将这些画面快速的呈现在屏幕上,就可以得到动画的效果。
此种方式类似于电影的原理,可以产生很缤纷亮丽的动画,但是其缺点为每个画面都必需事先备妥,无法进行及时成像(Real-time Rendering),而且每个画面,以至于整套动画,都必需占用相当大的内存空间。
对象方式:
在 MATLAB 的「握把式图形」(Handle Graphics)概念下,所有的曲线或曲面均可被视为一个对象,MATLAB 可以很快的抹去旧曲线,并产生相似但不同的新曲线,此时就可以看到曲线随时间而变化的效果。
使用对象方式(即握把式图形)所产生的动画,可以呈现实时的变化,也不需要太高的内存需求,但其缺点是较难产生太复杂的动画。
质点方式:
用comet或comet3等函数绘制彗星图,它能演示一个质点的运动。
①以质点的形式产生动画
质点运动轨迹动画方式是最简单的动画产生方式,顾名思义,就是产生一个顺着曲线轨迹运动的质点来操作。
Matlab中提供了comet和comet3命令来实现质点运动轨迹动画的绘制,其常用格式为:
et(xdata,ydata,p)
2.p是指彗星的尾巴的长度,可以是常数或者size(x)大小的向量
该方法的使用一般使用步骤如下:
step1:求解出质点完整的运动轨迹坐标x,y和z
step2:使用comet或者comet3直接绘制动点
t=0:pi/50:10*pi;
x=30*sin(t);
y=30*cos(t);
z=t;
comet3(x,y,z,0.5)
平抛运动
vx = 40;
t = 0:0.01: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,0.05)
②以电影方式产生动画
电影动画的好处就是,运行一次可以多次播放,甚至可以直接生成avi文件,直接独立与Matlab环境播放。
这是其它两种动画制作方法所不具备的。
以电影方式来产生动画,可由下列几个步骤来达成:
step1:调用moviein函数对内存进行初始化(该步骤在Matlab5.3以上均可省略),创建一个足够大的矩阵,使之能够容纳基于当前坐标轴大小的一系列指定的图形(此处称为帧)。
step2:调用getframe函数生成每个帧。
该函数返回一个列矢量,利用这个矢量,就可以创建一个电影动画矩阵。
getframe函数可以捕捉动画帧,并保存到矩阵中。
一般将该函数放到for循环中得到一系列的动画帧。
该函数格式有:
(1)F=getframe,从当前图形框中得到动画帧
(2)F=getframe(h),从图形句柄h中得到动画帧
(3)F=getframe(h,rect),从图形句柄h的指定区域rec中得到动画帧
step3:调用movie函数按照指定的速度和次数运行该电影动画。
当创建了一系列的动画帧后,可以利用movie函数播放这些动画帧。
该函数的主要格式有:
(1)movie(M),将矩阵M中的动画帧播放一次
(2)movie(M,n),将矩阵M中的动画帧播放n次
(3)movie(M,n,fps),将矩阵M中的动画帧以每秒fps帧的速度播放n次
step4:调用movie2avi函数可以将矩阵中的一系列动画帧转换成视频文件avi 文件。
这样,即使脱离了matlab环境都可以播放动画。
movie2avi一般是将Matlab本身用getframe获得的帧频记录转换成avi视频
movie2avi的调用格式:
movie2avi(存储帧频的矩阵, avi名称)
movie2avi(mov, 'move.avi')
电影动画之范例一
在下例中,我们将以不同的角度来显示 peaks 函数,并将其结果以电影的方式来呈现动画。
范例: movie01.m
clear M % 清除电影资料矩阵 M
n = 50; % 抓取 50 个画面
peaks;
fprintf('抓取画面中...\n');
for i = 1:n
view([-37.5+i*360/n, 30]); % 改变观测角度
M(i) = getframe; % 抓取画面,并存入电影资料矩阵 M
end
fprintf('播放电影中...\n');
movie(M, 3); % 播放电影三次
movie2avi(M,'1.avi')
最后一个 frame 的画面
MATLAB提供了设置视点的函数view。
其调用格
式为:
view(az,el)
az是azimuth(方位角)的缩写,EL是elevation
(仰角)的缩写。
它们均以度为单位。
系统缺省的
视点定义为方位角-37.5°,仰角30°。
当x轴平行观察者身体,y轴垂直于观察者身体时,
az=0;以此点为起点,绕着z轴顺时针运动,az为
正,逆时针为负。
电影动画之范例二
将 peaks 函数画在圆盘上,然后再变换此函数的高度,以动画呈现范例: movie02.m clear M % 清除电影资料矩阵 M
r=linspace(0, 4, 30); % 圆盘的半径
t=linspace(0, 2*pi, 50); % 圆盘的极坐标角度
[rr, tt]=meshgrid(r, t);
xx=rr.*cos(tt); % 产生圆盘上的 x 坐标
yy=rr.*sin(tt); % 产生圆盘上的 y 坐标
zz=peaks(xx,yy); % 产生 peaks 在极坐标的数据
n = 30; % 抓取 30 个画面
scale = cos(linspace(0, 2*pi, n));
fprintf('抓取画面中...\n');
for i = 1:n
surf(xx, yy, zz*scale(i)); % 画图
axis([-inf inf -inf inf -8.5 8.5]); % 固定图轴的范围
box on
M(i) = getframe; % 抓取画面,并存入电影资料矩阵 M
end
fprintf('播放电影中...\n');
movie(M, 5); % 播放电影 5 次
最后一个 frame 的画面
电影动画之范例三
改变影像的色盘矩阵,让影像出现「从正片变到负片」的效果范例: movie03.m
clear M % 清除电影资料矩阵 M
load clown.mat
image(X); colormap(map); % 画出小丑脸
n = 30; % 抓取 30 个画面
fprintf('抓取画面中...\n');
for i = 1:n
colormap(((i-1)*(1-map)+(n-i)*map)/n); % 改变色盘矩阵
M(i) = getframe; % 抓取画面,并存入电影资料矩阵 M
end
fprintf('播放电影中...\n');
movie(M, -5); % 播放电影 5 次(含正向与逆向播放)
在上述范例中,正片(如下张投影片图左)的色盘矩阵是 map ,而 1-map 则是负片(如下张投影片图右)的色盘矩阵,因此我们在抓影片时,让色盘矩阵进行渐进式的变化,因此呈现的电影就有「从正片变到负片」的效果。
另外,movie(M, -5) 代表电影将播放 5 次,但由于第二个参数是负数,所以每次播放会包含一次「正向播放」及一次「逆向播放」。
正片 色盘矩阵是 map 负片
色盘矩阵是 1-map
③以对象方式产生动画
⏹ 以电影方式产生动画可以说是「暴力法」,因为此方法占掉了许多内存空间。
另一个技巧性较高的
方法则是以对象方式产生动画,此种方法不需要大量的内存,而且可以产生「实时」(Real-time )或「交互式」(Interactive )的动画。
⏹ MATLAB 的所有图形组件(曲线、曲面、图轴等)都是对象,您可以控制这些对象的各种性质,此
种特性称为「握把式图形」(Handle Graphics )。
握把式图形包含的层面很广,但牵涉到动画部份的基本概念并不复杂,以下我们以曲线的动画来说明。
曲线的动画
⏹ 我们可以快速地改变图形对象的性质(如颜色、坐标等),就可以达到动画的效果
⏹ 每一条曲线都有下列三种性质:
xdata :此为一向量,代表曲线的 x 坐标值
ydata :此为一向量,代表曲线的 y 坐标值
EraseMode :此为一字符串,代表曲线被抹除的方式,亦即当 xdata 或 ydata 被改变时,对于旧曲线的处理方式。
曲线的 EraseMode
EraseMode 对于动画的呈现相当重要,此字符串可是下列几种选择:
normal :重画整个画面。
xor :将旧曲线的点以 xor 的方式还原。
background :将旧曲线的点改成背景颜色。
none :保留旧曲线的点,不做任何处理。
在上述四种 EraseMode 中,耗费时间的次序是
normal > xor > background > none
xor 和 background 很接近,但是 background 会抹去其它旧曲线所扫过的其它对象(如图轴、网格线、另一条曲线等),所以较少用到,所以一般在产生动画时,最常用到的 EraseMode 就是 xor 。
MATLAB 中,创建擦除重绘动画的过程分为以下三步:
step1:设置重绘对象的擦除模式'EraseMode'模式
Matlab 的图形绘制函数允许采用不同的擦除模式来擦除原来的对象,不同的擦除模式将产生不同的动画效果。
擦除模式是通过没置“EraseMode”属性来完成的,一共有三种擦除模式:
none :重新绘制图形对象时不擦除原来的对象,这种模式可动态演示图形的生成过程,如曲线和旋转曲线的生成过程
background :在重新绘制图形对象之前。
用背景色重绘对象来达到擦除原来图形对象的目的。
该模式会擦除任何对象和它下面的任何图形
Xor :在重新绘制图形对象之前,只擦除原来的对象,不会擦除其他对象或图形。
这种模式能产生图形对象移动的效果
step2:在循环语句中使用set 更改图形的xdata,ydata 和zdata 等坐标数据
step3:使用darwnow 命令刷新屏幕
曲线的动画
⏹ 有了这些概念后,产生曲线的动画就很容易了!其主要步骤有两点:
⏹ 产生一条曲线,其 EraseMode 为 xor ,background ,或 none 。
⏹ 在 for-loop 之中,改变此曲线的 xdata 或 ydata (或两者)。
⏹ 我们产生一条随 x 而衰减的正弦曲线,并让 k 随时间而便大(即改变正弦波的相角),使整条曲
线产生舞动的效果。
我们产生一条衰减的正弦曲线
让 k 随时间而变大(即改变正弦波的相角),使整条曲线产生舞动的效果。
x = 0:0.1:8*pi;
h = plot(x, sin(x).*exp(-x/5), 'EraseMode', 'xor');
axis([-inf inf -1 1]); % 设定图轴的范围
grid on % 画出网格线
for i = 1:5000
y = sin(x+i/50).*exp(-x/5);
set(h, 'ydata', y); % 设定新的 y 坐标
drawnow % 立即作图
end
最后一个 frame 的画面
5
)sin(x
e k x y -+=
在上例中,我们使用 set 指令,总共改变曲线的 y 坐标 5000 次,并以 xor 的方式抹掉旧曲线。
drawnow 的作用是使 MATLAB 立刻处理 set 指令,若无 drawnow,MATLAB 会累积 set 指令,直到
for-loop 结束时再一并处理图形的变化,这时就不会看到动画的效果。
如果您将上例的 EraseMode 改成 background,则会发现曲线会“抹掉”图形中的网格线及代表图轴的直线。
如果您将上例的 EraseMode 改成 none,则旧的曲线会被保留下来,产生不同的效果。
对象动画之范例: MATLAB
MATLAB 有很多对象动画之范例:
lorenz:以3D动画呈现的 Lorenz 混沌方程式(Chaotic Equation),好像慧星在运行。
truss:一座桥梁在地震时的震动方式,共有 12 种喔!
travel:显示如何以杂乱搜寻(Random Search)的方式来解 Traveling Salesperson Problem.
fitdemo:显示如何以 Downhill Simplex Search 来解决非线性曲线拟合(Nonlinear Curve Fitting)的问题。
spinner:常见的屏幕保护程序。
xphide:试试您的眼力…。
对象动画之范例: MATLAB
若您有安装 Simulink,可试试下列动态系统仿真加上动画呈现:
onecart:传统的弹簧加上砝码的动态系统。
dblcart1:一条弹簧加上两个砝码的动态系统。
simppend:简单的单摆系统。
dblpend1:两截的摆动系统。
dblpend2:更复杂的摆动系统。
penddemo:倒单摆系统。
对象动画之范例: 模糊工具箱
如果您有安装 Fuzzy Logic Toolbox,可以试试由张老师开发的各项模拟及动画展示:
fcmdemo: Fuzzy C-means Clustering。
juggler:用板子接皮球。
invkine:两截机器手臂的 Inverse Kinematics。
slcp1:倒单摆,杆子长度随时间而变,您可以控制所欲到达的位置。
slcpp1:双倒单摆,其中一个杆子的长度随时间而变,您可以控制所欲到达的位置。
slbb:跷跷板加上滚球系统,您可以控制球的最后位置。