当前位置:文档之家› matlab第九讲教案(最新整理)

matlab第九讲教案(最新整理)

西南科技大学本科生课程备课教案

计算机技术在安全工程中的应用

——Matlab 入门及应用

授课教师:徐中慧

班级:

专业:安全技术及工程

第九章 高级绘图

课型:新授课

教具:多媒体教学设备,matlab 教学软件

一、目标与要求

掌握matlab 如何处理三种不同类型的图形文件,使用句柄图形指定绘图的句柄并调整特性,通过matlab

两种技术的任意一种创建动画。

二、教学重点与难点

本堂课教学的重点与难点在于引导学生掌握句柄图形的使用,并掌握 matlab 创建动画的方法。

三、教学方法

本课程主要通过讲授法、演示法、练习法等相结合的方法来引导学生掌控本堂课的学习内容。

四、教学内容

(1)火箭垂直向上发射。在 t=0 时火箭发动机关闭,此时火箭的高度为海拔 500,速度为 125m/s ,考虑重力加速度,根据等式

h (t ) = - 9.8

t 2 +125t + 500, t 0

2

①创建函数 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,计算下式:

-x2- 5x - 3 +e x

②用函数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

tax=500*0.05+1500*0.1+3000*0.15+(a-5000)*0.2;

elseif 20000

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

以下是下载内置图像文件的常用方法以及实现在当前目录中输入图像矩阵和色图的命令。

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 命令来实现质点运动轨迹动画的绘制,其常用格式为:

https://www.doczj.com/doc/7818689857.html,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 次

s t e p4:调用m o v i e2av i函数可以将矩阵中的一系列动画帧转换成视频文件 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')

MATLAB 提供了设置视点的函数 view。其调用格

最后一个 frame 的画面

式为:

view(az,el)

az 是a z i m u t h(方位角)的缩写,EL 是e l eva t i on

(仰角)的缩写。它们均以度为单位。系统缺省的

视点定义为方位角-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 被改变时,对于旧曲线的处理方式。

曲线的 E r a s e M o d e

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 随时间而便大(即改变正弦波的相角),使整条曲线

产生舞动的效果。

-x

y = sin(x +k )e 5

我们产生一条衰减的正弦曲线

让 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 的画面

在上例中,我们使用 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:跷

跷板加上滚球系统,您可以控制球的最后位置。

sltbu:倒车入库系统

(3)其它可视化方法

①透明度

利用 matlab 画出的曲面均采用不透明的色彩添加策略。对大多数曲面而言,这种方法很好,但是可能遮盖住其它的细节。例如:下面的命令行可以创建两个球形,一个球在另一个球当中

clear,clc,clf

n=20;

Theta=linspace(-pi,pi,n);

Phi=linspace(-pi/2,pi/2,n);

[theta,phi]=meshgrid(Theta,Phi);

X=cos(phi).*cos(theta);

Y=cos(phi).*sin(theta);

Z=sin(phi);

surf(X,Y,Z)

axis square

axis([-2,2,-2,2,-2,2])

hold on

pause(5)

surf(2*X,2*Y,2*Z)

pause(5)

alpha(0.3)

内部球被外部球遮挡,除非采用下面的透明度命令: alpha(0.3)

该命令被用来设置透明度的等级,数值 1 表示不透明,数值 0 表示完全透明。透明度能够被添加到曲面、图像和碎片对象。

②隐藏线

当创建网格绘图时,曲面被遮挡的部分不会被画出来,这通常看上去比较自然。

clear,clc,clf

n=20;

Theta=linspace(-pi,pi,n);

Phi=linspace(-pi/2,pi/2,n);

[theta,phi]=meshgrid(Theta,Phi);

X=cos(phi).*cos(theta);

Y=cos(phi).*sin(theta);

Z=sin(phi);

subplot(1,2,1)

mesh(X,Y,Z)

hidden on

subplot(1,2,2)

mesh(X,Y,Z)

hidden off

hidden on 表示图中遮挡部分的网络线被自动隐藏,使用命令 hidden off 后,被遮挡部分的网格线没有被隐藏起来。

③光源

Matlab 提供很多调整曲面光源的方法。可以改变真实光源的位置,也能够在播放动画期间进行调整。绝大多数绘图只是利用函数 camlight 实现光源的开启或关闭,该函数的默认值是关闭的。

照相机光源的默认位置是在“摄影镜头”的右上方,提供如下选项:

camlight right 摄影镜头的右上方(默认位置)

camlight left 摄影镜头的左上方

camlight headline 摄影镜头的位置

camlight(azimuth,elevation) 用户自主确定光源位置

camlight(‘infinite’)将光源定位于无穷远(如同太阳光)

sphere

camlight

“”

“”

At the end, Xiao Bian gives you a passage. Minand once said, "people who learn to learn are very happy people.". In every wonderful life, learning is an eternal theme. As a professional clerical and teaching position, I understand the importance of continuous learning, "life is diligent, nothing can be gained", only continuous learning can achieve better self. Only by constantly learning and mastering the latest relevant knowledge, can employees from all walks of life keep up with the pace of enterprise development and innovate to meet the needs of the market. This document is also edited by my studio professionals, there may be errors in the document, if there are errors, please correct, thank you!

相关主题
文本预览
相关文档 最新文档