chap5 matlab.docx

上传人:b****5 文档编号:11976653 上传时间:2023-04-16 格式:DOCX 页数:40 大小:692.05KB
下载 相关 举报
chap5 matlab.docx_第1页
第1页 / 共40页
chap5 matlab.docx_第2页
第2页 / 共40页
chap5 matlab.docx_第3页
第3页 / 共40页
chap5 matlab.docx_第4页
第4页 / 共40页
chap5 matlab.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

chap5 matlab.docx

《chap5 matlab.docx》由会员分享,可在线阅读,更多相关《chap5 matlab.docx(40页珍藏版)》请在冰豆网上搜索。

chap5 matlab.docx

chap5matlab

第五章MATLAB的GUI程序设计

I程序的对象及相关概念

面向对象的程序设计,其程序是由对象组装起来的。

一个对象通常有自己的属性,事件和方法,它们都不是严格定义的。

按通常的理解,属性确定对象是什么,事件向对象发布消息使其处于活动状态,方法是对象的行为。

以下是它们的要点,大家要在实践中加以总结

1.对象是程序的基本元件。

2.对象通常有属性,属性确定该对象形(外观)。

3.对象通常有行为(方法),行为确定该对象做什么。

4.对象通常有事件,事件向对象传递消息。

5.通常可以为对象编写代码,该代码确定对象的行为。

6.程序中的对象通常处在静止状态,事件可以激活对象,处在活动状态的对象才有行为。

7.属性,事件和方法从属于一个确定的对象。

同一个对象可以有不同的属性,事件和方法,同样的属性,事件和方法也可以从属于不同的对象。

8.对象从属于程序,它通常不能单独运行。

一个程序把一组对象合理的组装起来,通过事件驱动它们。

9.对象有相对的独立性,同一个对象可以从属于不同的程序。

10.Matlab的对象有3类。

一是我们学习过的函数对象,它用函数句柄来表示;二是图形对象,它用各种图形句柄来表示,我们将在下面学习它的使用;三是外部对象,我们以后会学到。

IIMatlab的图形对象及其层次结构

Matlab的图形对象是其程序对象的一种,它是由图形句柄对象来表示的,简称为图形句柄。

图形句柄是Matlab创建图形用户界面(GUI)的基本元素。

这些图形对象及它们的层次结构如下

根屏幕(Root)

图形窗(Figure)

轴(Axes)控件(Uicontrol)菜单(Uimenu)

ImageLineRectangleTextLightPatchSurface

根屏幕(root)

“根屏幕”对应于计算机屏幕,它不需要创建,但可以设置属性值。

其它图形对象都是该对象的“子”。

图形窗(figure)

图形窗是显示图形的窗口,“根屏幕”下可以有多个图形窗,但只有一个是当前窗口。

控件(Uicontrol)

图形窗下的控件主要包括:

按钮,列表框,文件框,滑块等,它是人机交互界面的主要组成部分

菜单(Uimenu)

图形窗下的菜单是下拉式菜单,它是调用子程序的按钮。

轴(axis)

在图形窗口中,“轴对象”定义一个区域,该区域是图形窗的子,同时也是图像,光照,线条等对象的父。

所有绘图指令(如plot,surf,mesh和bar等)都可以创建轴对象。

如果图形窗中有多个轴对象,则只有一个是当前轴对象。

图像(Image)

在轴对象下,一个图像对象由数据矩阵和色数矩阵组成,根据矩阵的不同类型又分索引图像,灰度图像和全彩色图像。

线条(Line)

在轴对象下的“线条”对象为基本的图形元素,用于绘制二,三维图形等。

绘图指令Plot,plot3创建的就是图形对象。

块(Rectangle)

在轴对象下的“块”对象为带有边缘的多边形,绘图指令fill,fill3和contour3创建的是块对象。

文本(Text)

在轴对象下的“文本”对象表示字符串,title,xlabel,ylabel,gtext,text等都可以创建文本对象。

光照(Light)

在轴对象下的“光照”对象设置光源,以影响块和表面对象,用户可以设置光源属性控制颜色,位置和方向等。

表面对象(surface)

在轴对象下由绘图指令做的二三维图形都是表面对象。

III对象句柄属性及意义

1.对象句柄都有各自的属性。

不同的对象句柄也可以有相同的属性

2.每个属性通常都有自己的属性值,决定对象不同的特性。

它通常表现为该对象不同的外观。

3.对象用函数生成。

一个对象在生成时,同时赋予了其属性和属性值

4.对象的属性值,可用set函数改变,可用get函数获取

5.如果不改变属性值,当生成该对象时系统自动取属性的缺省值

6.如果改变属性值,则生成该对象时取该对象属性的当前值

例5.1用set函数对象的属性值

(1)用set函数设置根屏幕的颜色

sphere

set(0,'DefaultFigureColor','b');

sphere

(2)用set函数设置图形边沿的颜色

peaks;

h=get(gcf)

set(gcf,'DefaultSurfaceEdgeColor','r')

peaks;shg

例5.2在两个轴对象上设置不同的属性

t=0:

pi/20:

2*pi;

s=sin(t);

c=cos(t);

figh=figure('position',[30100800350],'DefaultAxesColor',[.8.8.8]);

axh1=subplot(1,2,1);gridon

set(axh1,'DefaultLineLineStyle','-.')

line('Xdata',t,'Ydata',s)

line('Xdata',t,'Ydata',c)

text('Position',[3.4],'string','Sine')

text('Position',[2.3],'string','Cosine','HorizontalAlignment','right')

axh2=subplot(1,2,2);gridon

set(axh2,'DefaultTextRotation',90)

line('Xdata',t,'Ydata',s)

line('Xdata',t,'Ydata',c)

text('Position',[3.4],'string','Sine')

text('Position',[2.3],'string','Cosine','HorizontalAlignment','right')

IV对象句柄的获取,设置与调用

例5.3mesh函数获取peaks图形的句柄,用get函数取图形的图柄(gcf)和轴柄(gca)。

clfreset;H_mesh=mesh(peaks(20))

H_grand_parent=get(get(H_mesh,'Parent'),'Parent')

disp('图柄轴柄'),disp([gcfgca])

说明:

H_mesh是图形peaks的句柄,H_grand_parent是图形窗口的句柄(它是peaks的grandfather),它的缺省值是gcf。

图柄H_mesh的father是轴柄,它的缺省值是gca。

例5.4低层指令绘图,获得句柄;获取同轴上字对象的句柄和相应对象类型。

clfreset,t=(0:

100)/100*2*pi;

H_line=line('Xdata',t,'Ydata',sin(t))

text(pi,0.8,'\fontsize{14}sin(t)')

H_c=get(get(H_line,'parent'),'children')

T=get(H_c,'Type')

说明:

H_line=100.0005是y=sin(t)的图形句柄,H_c是轴柄(gca)的children的句柄,它有两个对象,一个是正弦曲线sin(t)(句柄值为100.0005),另一个是文本“sin(t)”(其句柄值为102.0002)。

例5.5findobj指令的使用。

clfreset,t=(0:

pi/100:

2*pi)';tt=t*[111];yy=sin(tt)*diag([0.511.5]);

plot(tt,yy),Hb=findobj(gca,'Color','r')

点评:

1)作图函数(如mesh,line,plot)作出图形,通常可返回函数的句柄,用get函数可取得图形及其parent,children的句柄,gcf,gca,gco是预定义的句柄常量,可接受当前图形,轴和最近点击的图形句柄。

Hb=findobj(gca,'Color','r')可获得当前轴下不同颜色的句柄。

2)图形上的不同对象对应于不同的句柄

3)以后会看到不同的图形句柄也可以组装成新的图形

例5.6对象属性的获取和设置

clfreset,x=0:

pi/12:

2*pi;

PN1={'Color','LineWidth','Marker'};

%设置属性名元胞数组

PV1={[100],5,'d'};%设置属性值

plot(sin(x),cos(x),PN1,PV1)%根据属性值画图

axissquare

PS.Color=[0.70.70];PS.LineWidth=2;

%用构架数组设置属性名和属性值

line(sin(7*x),cos(7*x),PS);%根据属性值画图

说明:

如本例所示,可用元胞数组和构架数组来设置属性名和属性值

例5.7在不同对象上设置属性和属性值

(1)指令中直接指定线型或/和颜色:

clfreset,t=(0:

pi/50:

2*pi)';k=0.4:

0.1:

1;Y=cos(t)*k;

line(t,Y,'Color',[100],'LineStyle','-.')

 

(2)轴对象属性'LineStyle'和'ColorOrder'的影响:

clfreset

set(gca,'ColorOrder',[000;0.70.70.7],'LineStyle','-|:

')

line(t,Y)

(3)在“图对象”上,对轴的缺省属性'DefaultAxesLineStyleOrder'和'DefaultAxesColorOrder'设置所产生的影响

clfreset

set(gcf,'DefaultAxesLineStyleOrder','-|:

');

set(gcf,'DefaultAxesColorOrder',[100;001]);

line(t,Y)

说明:

如本例所示,在图形的上级对象上对属性值的设置都会对该图形产生影响

例5.8高层绘图文件的形成

高层作图函数surf.m文件与低层作图指令surface的关系。

[surf.m]

functionh=surf(varargin)

cax=newplot;%建立图形窗和轴,并返回轴句柄

ifnargin==0

error('Notenoughinputarguments.')

%如果没有输入项(即surf),则显示出错信息

elseifnargin==1

%如果输入项只有一项,则进行以下测试

ifmin(size(varargin{1}))==1

%如果输入项只有一项,且该项是1维数组或多维数组的最小维数是

1,则显示以下错误信息

error('Inputargumentmustbeamatrixnotavectororascalar')

else

hh=surface(varargin{1});

%用surface函数画数据varargin{1}

(这里vargargin{1}至少是一个2维数组,且最小维数是大于1)的图形,并返回图形句柄

end

else

hh=surface(varargin{:

});

%输入项至少是两项时,用surface作图

end

if~ishold%如果不处在holdon状态,则进行以下操作

view(3)

gridon

end

ifnargout==1%如果输出宗量为1,则返回图形句柄

h=hh;

end

例5.9演示高层指令mesh,surf等指令是如何由surface衍生而得。

clfreset,t=(0:

20)/20;

r=2.5-cos(2*pi*t);[x,y,z]=cylinder(r,40);

fc=get(gca,'color');

h=surface(x,y,z,'FaceColor',fc,'EdgeColor','flat','FaceLighting','none','EdgeLighting','flat');

view(3);gridon

图9.4-1低层指令产生的网线图

set(h,'FaceColor','flat','LineStyle','-','EdgeColor',[.8.8.8])

图9.4-2通过属性重置获得着色曲面图

set(h,'FaceColor','interp','MeshStyle','column')

图9.4-3通过重置获得新型瀑布水线图

例5.10任意布置子图和轴外注释

本例演示:

axes轴位框设计、rectangle的运用、及轴外注释(图9.5-2)。

所谓轴外注释,实际上是使用了两个轴位框。

一个轴位框充满全部图形窗,其坐标框被隐去,而只写注释文字。

而另一个比较小的轴位框用于绘图。

从外表看去,注释就处于那小轴位框的外部。

clf

zeta2=[0.20.40.60.81.0];n=length(zeta2);%该段录入数据

fork=1:

n;Num{k,1}=1;Den{k,1}=[12*zeta2(k)1];end

S=tf(Num,Den);

t=(0:

0.4:

20)';

[Y,x]=step(S,t);%step是一个函数,产生函数值y

tt=t*ones(size(zeta2));%tt是作图数据点

clfreset,H=axes('Position',[0,0,1,1],'Visible','off');%定义轴H

str{1}='\fontname{隶书}二阶系统阶跃响应';%以下定义字符串

str{2}='y(t)=1-\beta^{-1}e^{-\zetat}sin(\betat+\theta)';

str{3}='';str{4}='\fontname{隶书}其中:

';

str{5}='\beta=(1-\zeta^{2})^{0.5}';

str{6}='\theta=arctg(\beta/\zeta)';

str{7}='\zeta=.2,.4,.6,.8,1';

set(gcf,'CurrentAxes',H)%把轴H放置到当前图形窗(figure)上

text(0.01,0.73,str,'FontSize',12)%把字符串str放置到指定位置

h1=axes('Position',[0.45,0.45,0.5,0.5]);%定义新轴h1

ribbon(tt,Y,0.4)%在新轴上用ribbon函数作图

set(h1,'XTickLabelMode','manual','XTickLabel','0|0.4|0.8|1.2');

%对x轴按指定数据标号,并作网格线

set(h1,'ZTickLabel','0|1.0|2.0');

set(get(h1,'XLabel'),'String','\zeta\rightarrow','Rotation',17.5)

%对x轴标号,以下两句类似

set(get(h1,'YLabel'),'String','\leftarrowt','Rotation',-25)

set(get(h1,'Zlabel'),'String','z\rightarrow')

h2=axes('Position',[0.03,0.08,0.27,0.27]);

%定义新轴h2

plot(tt,Y)

h3=axes('Position',[0.37,0.04,0.63,0.32]);

%定义新轴h3

set(h3,'Xlim',[0,1.2],'Ylim',[0,0.5])

%设置x,y轴的范围,数据比,及颜色

set(h3,'DataAspectRatio',[111])

set(h3,'ColorOrder',[0,0,0])

set(h3,'Visible','off')%h3不可见

hh1=rectangle('Position',[0.5,0.2,0.4,0.2],'Curvature',[0,0]);

%在h3上的指定位置做图(Curvature=[0,0]表示矩形)

hh2=rectangle('Position',[0.2,0.26,0.08,0.08],'Curvature',[1,1]);

%在h3上的指定位置做图(Curvature=[1,1]表示园)

xx1=0.05:

0.01:

0.2;xx2=0.28:

0.02:

0.5;%以下取新数据点

xx3=0.9:

0.02:

1.1;xx4=0.24:

0.02:

1;

yy5=0.1:

0.02:

0.26;yy6=0.1:

0.02:

0.3;

yy1=0.3*ones(size(xx1));yy2=0.3*ones(size(xx2));

yy3=0.3*ones(size(xx3));yy4=0.1*ones(size(xx4));

xx5=0.24*ones(size(yy5));xx6=ones(size(yy6));

%以下按新数据点画线,并标注文字

line(xx1,yy1);line(xx2,yy2);line(xx3,yy3);line(xx4,yy4);

line(xx5,yy5);line(xx6,yy6)

line(0.17,0.3,'Marker','>','MarkerFaceColor','k')

line(0.47,0.3,'Marker','>','MarkerFaceColor','k')

line(1.1,0.3,'Marker','>','MarkerFaceColor','k')

line(0.24,0.23,'Marker','^','MarkerFaceColor','k')

line(0.17,0.35,'Marker','+')

text(0.27,0.23,'-')

text(0.05,0.35,'u(t)')

text(1,0.35,'y(t)')

text(0.6,0.26,'s{^2}+2{\zeta}s');

xx7=0.56:

0.02:

0.84;yy7=0.3*ones(size(xx7));line(xx7,yy7)

text(0.68,0.35,'1')

点评:

1)在同一个图形窗口(Figure)可以设置几个轴(h1,h2,h3),它们的位置由图形窗口(Figure)的轴H设定,如:

h1=axes('Position',[0.45,0.45,0.5,0.5])

这里(0.45,0.45)是h1相对于H的位置,而(0.5,0.5)是h1中x,y轴的长度。

2)每一个图形都是在一个确定的轴下作出的。

在同一个图形窗口上的多个轴,只有一个处在激活状态,图形总是在当前激活的轴下画出的。

3)set(h1,'XTickLabelMode','manual','XTickLabel','0|0.4|0.8|1.2')一句,是在h1轴上设定x轴的刻度。

4)下面的语句是取h1轴上x坐标轴的句柄,并对文字进行标注和旋转

set(get(h1,'XLabel'),'String','\zeta\rightarrow','Rotation',17.5)

5)下面的语句是作矩形对象,Position后面的参数是位置和大小;Curvature后面的参数是指形状,[0,0]表示矩形,[1,1]表示园。

hh1=rectangle('Position',[0.5,0.2,0.4,0.2],'Curvature',[0,0]);

V图形用户界面(GUI)制作

Matlab程序的用户界面,可以用图形句柄通过代码来制作,也可以GUI(GraphicUserInterface)编辑器来制作,或二者结合起来做。

我们分别用下面的例子来加以说明

一.用代码来制作GUI界面

例5.11对于传递函数为

的归一化二阶系统,制作一个能绘制该系统单位阶跃响应的图形用户界面。

本例演示:

(A)图形界面的大致生成过程;

(B)静态文本和编辑框的生成;

(C)坐标网格控制键的形成;

(D)如何使用该界面。

(1)产生图形窗和轴位框:

如图5.1-1所示。

clfreset

%set(0,'DefaultFigureColor','b')

H=axes('unit','normalized','position',[0,0,1,1],'visible','off');

%建立轴,并取轴句柄H

set(gcf,'currentaxes',H);%在当前图形窗口上安置坐标轴H

str='\fontname{隶书}归一化二阶系统的阶跃响应曲线';

text(0.12,0.93,str,'fontsize',13);%在H上,相对于左下角的取值

h_fig=get(H,'parent');%取H的父句柄h_fig=gcf

set(h_fig,'unit','normalized','position',[0.1,0.2,0.7,0.4]);

%设置图形窗口h_fig的位置[0.1,0.2,0.7,0.4](相对于轴H?

h_axes=axes('parent',h_fig,...

'unit','normalized','position',[0.1,0.15,0.55,0.7],...

'xlim',[015],'ylim',[01.8],'fontsize',8);

%在H窗口上指定位置画新轴

图5.1-1产生坐标轴

 

(2)在坐标框右侧生成作解释用的“静态文本”和可接收输入的“编辑框”:

如图10.1-2所示。

h_text=uicontrol(h_fig,'style','text',...

'unit','normalized','position',[0.67,0.73,0.25,0.14],...

'horizontal','left','string',{'输入阻尼比系数','zeta='});

%在图形窗口(h_fig)指定位置[0.67,0.73,0.25,0.14]上生成文本标签

h_edit=uicontrol(h_fig,'style','edit',...

'unit','normalized','position',[0.67,0.59,0.25,0.14],...

'horizontal','left',...

'callback',[...

'z=str2num(get(gcbo,''string''));',...

't=0:

0.1:

15;',...

'fork=1:

length(z);',...

'y(:

k)=step(1,[12*z(k)1],t);',...

'plot(t,y(:

k

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1