(1)句柄概念
在MATLAB中,每一个具体的图形都是有若干个不同的图形对象组成的,用句柄来标识对象,通过句柄来访问相应对象的属性。
例子:绘制多个图形,并保持图形句柄
t=0:pi/10:2*pi;
h1=plot3(t+pi,t-2*pi,sin(t),'r');
hold on
[x,y]=meshgrid(t);
z=sin(x);
h2=mesh(t-2*pi,t+pi,z);
[x3,y3,z3]=cylinder(t);
h3=surf(x3,y3,z3);
(2)访问图形对象
访问图形对象是指获取或设置图形对象的属性。不同图形对象具有的属性不同,但访问方法一样。
对象句柄.属性名
例子:
(3)获取特定图形对象句柄的函数
(1)图形对象的常用公共属性
例子:分别在两个子图中绘制曲线和曲面。然后设置子图1的背景颜色为黄色,曲线线条颜色为红色。设置子图2背景色为青色。
subplot(1,2,1)
h1=fplot(@(t)t.*sin(t),@(t)t.*cos(t),[0,6*pi]);
axis equal
subplot(1,2,2)
[x,y,z]=peaks(20);
h2=mesh(x,y,z);
h10=h1.Parent;
h10.Color='y';
h1.Color='r';
h2.Parent.Color='cyan';
(1)建立图形窗口对象
MATLAB通过figure函数来创建窗口对象,格式如下:
例子:建立一个图形窗口。该图形窗口没有菜单条,标题名为“图形窗口示例”,起始于屏幕左下角、宽度和高度分别为300像素点和150像素点,背景颜色为青色,且当用户从键盘按下任意一个键时,然后在窗口中单击鼠标左键,在鼠标指针所在位置将显示“Hello ,World!”
hf=figure;%按MATLAB默认的属性值建立图形窗口
hf.Color=[0,1,1];%窗口背景颜色为青色
hf.Position=[1,1,300,150];%指定图形窗口位置
hf.Name='图形窗口示例';%指定图形窗口的名称
hf.NumberTitle='off';%图形窗口的标题不以‘Figure n:’为标题前缀
hf.MenuBar='none';%图形窗口不具有菜单条
hf.ButtonDownFcn='gtext("Hello World!")';%定义鼠标键按下事件的响应
(1)建立坐标轴对象
使用axes函数,格式如下:
(2)坐标轴对象的属性
例子:利用坐标轴对象实现图形窗口的分割。
ha=axes('Position',[0.1,0.1,0.7,0.7]);%创建坐标轴,原点位于窗口0.1宽和0.7高交点处,坐标轴宽度和高度均为窗口的0.7
contour(peaks(20))%等高线
ha.Title=title('等高线');
ha.YLabel=ylabel('南北向');
ha.XLabel=xlabel('东西向');
hb=axes('Position',[0.65,0.7,0.28,0.28]);
surf(peaks);
hb.View=[-30,45];
x=[0,0];y=[0,1];
ha=axes;
ha.ColorOrder=[0,0,0;1,0,0;0,1,0;0,0,1];%定义四种颜色
hold on
plot(x,y,x+0.5,y,x+1,y,x+1.5,y,x+2,y,x+2.5,y);
ha.XLim=[-0.2,3];
ha.YLim=[-0.2,1.2];
(1)建立曲线对象
line函数的调用格式:
句柄变量=line(x,y,z,属性1,属性值1,属性2,属性值2,……)
其中,x,y,z存储数据点的坐标,与plot、plot3函数含义相同。
(2)曲线对象常用属性
例子:利用曲线对象绘制五环图案
t=-0.1:0.1:2*pi;
x=cos(t);y=sin(t);
line(x,y,'Color','b')
line(x+1.2,y-1,'Color','y')
line(x+2.4,y,'Color','k')
line(x+3.6,y-1,'Color','g')
line(x+4.8,y,'Color','r')
ha=gca;%获取当前坐标区的属性
for n=1:size(ha.Children)%将子对象(即所有线条)的线宽设置为5磅
ha.Children(n).LineWidth=5;
end
ha.XLim=[-2,7];
ha.YLim=[-3,2];
(1)建立曲面对象
使用surface函数,调用格式为:
句柄变量=surface(x,y,z,c,属性1,属性值1,属性2,属性值2,……)
其中,x,y,z存储数据点的坐标,与mesh、surf函数含义相同;c用于指定在不同高度下的曲面颜色。
surf函数每调用一次,就会刷新坐标轴,清空原有图形,在绘制新的图形。而surface函数生成的曲面则在已有图形上叠加显示。
利用surface函数建立的曲面对象,默认视点在图形正上方,即方位角为0°,仰角为90°。
(2)与曲面形态有关的属性
例子:利用曲面对象绘制立体圆环,圆环方程为:
{ x = ( 8 + 3 c o s v ) c o s u y = ( 8 + 3 c o s v ) s i n u z = 3 s i n v , u ∈ [ 0 , 2 π ] , v ∈ [ 0 , 2 π ] \left\{ \begin{aligned} x=(8+3cosv)cosu\\ y=(8+3cosv)sinu\\ z=3sinv \end{aligned} \right.,u∈[0,2\pi],v∈[0,2\pi] ⎩⎪⎨⎪⎧x=(8+3cosv)cosuy=(8+3cosv)sinuz=3sinv,u∈[0,2π],v∈[0,2π]
r=linspace(0,2*pi,100);
[u,v]=meshgrid(r);
x=(8+3*cos(v)).*cos(u);
y=(8+3*cos(v)).*sin(u);
z=3*sin(v);
axes('view',[-37.5,30]);
hs=surface(x,y,z);
axis equal;
hs.EdgeColor='none';
hs.FaceColor='interp';
(1)创建光源对象
light函数的调用格式:
对象句柄=light(属性1,属性值1,属性2,属性值2,……),其中属性指定光源的特性。
(2)光源对象的属性
(3)设置光照模式
利用lighting命令可以设置光照模式,格式如下:
lighting 选项
其中,选项可取值:
例子:绘制光照处理后的圆环面并观察不同光照模式下的效果。
r=linspace(0,2*pi,100);[u,v]=meshgrid(r);
x=(8+3*cos(v)).*cos(u);y=(8+3*cos(v)).*sin(u);z=3*sin(v);
axes('Position',[0.05,0.675,1.0,0.3],'view',[-37.5,30]);
hs1=surface(x,y,z);axis equal;
hs1.EdgeColor='none';hs1.FaceColor='interp';
axes('Position',[0.05,0.35,1.0,0.3],'view',[-37.5,30]);
hs2=surface(x,y,z);axis equal;
hs2.EdgeColor='none';hs2.FaceColor='interp';
light('Position',[0,0,8])%入射光源[0,0,8]
lighting flat%均匀洒落
axes('Position',[0.05,0.025,1.0,0.3],'view',[-37.5,30]);
hs2=surface(x,y,z);axis equal;
hs2.EdgeColor='none';hs2.FaceColor='interp';
light('Position',[0,0,8])%入射光源[0,0,8]
lighting phong%顶点插值处理
(1)图形用户界面GUI(Graphical User Interface):用户与计算机进行信息交流的窗口。
(2)设计图形用户界面的方法
(1)常用控件
(2)建立控件对象
句柄变量=uicontrol(图形窗口句柄,属性1,属性值1,属性2,属性值2,……)
其中,属性及其取值决定了控件的特征。若省略图形窗口句柄,默认在当前图形窗口建立控件对象。
(3)控件对象的基本控制属性
例子:在图形窗口建立三个按钮对象,当单机按钮时分别绘制正弦曲线、显示或隐藏坐标轴的网络、清楚坐标轴的图形。
ha=axes('Units','pixels','Position',[40,40,360,360]);
btgrid=uicontrol('Style','pushbutton','String','网格',...
'Position',[450,120,48,20],...
'Callback','grid');%grid显示或隐藏坐标轴的网络
btncla=uicontrol('Style','pushbutton','String','清除',...
'Position',[450,80,48,20],...
'Callback','cla');%cla清除坐标轴
btplot=uicontrol('Style','pushbutton','String','绘图',...
'Position',[450,160,48,20]);
btplot.Callback=@plot_sin;%绘图
建立回调绘图函数文件plot_sin.m
function plot_sin(source,callbackdata)
t=-pi:pi/20:pi;
plot(t,sin(t));
end
注:回调函数定义格式
function 函数名(source,evendata)
……
end
其中,参数source是发生事件的源控件对象句柄,evendata存储事件数据。
(1)建立菜单对象
uimenu函数用于创建、设置、修改菜单
(2)菜单属性
例子:在上例的界面中添加“图形选项”菜单项,其中包括一个二级菜单项“线型”,其下又有3个子菜单项,分别为“实线”、“虚线”、“双划线”。
主程序
%建立坐标轴
ha=axes('Units','pixels','Position',[40,40,360,360]);
%grid显示或隐藏坐标轴的网络
btgrid=uicontrol('Style','pushbutton','String','网格',...
'Position',[450,120,48,20],...
'Callback','grid');
%cla清除坐标轴
btncla=uicontrol('Style','pushbutton','String','清除',...
'Position',[450,80,48,20],...
'Callback','cla');
%绘图
btplot=uicontrol('Style','pushbutton','String','绘图',...
'Position',[450,160,48,20]);
btplot.Callback=@plot_sin;
%一级菜单项
hopt=uimenu(gcf,'Label','图形选项','Accelerator','L');
%建立二级菜单项,包括实线、虚线、双划线
hLStyle=uimenu(hopt,'Label','选项','Tag','LStyle','Enable','off');Enable为off菜单不可用
hL_Solid=uimenu(hLStyle,'Label','实线','Tag','Solid','Callback',@MLine_Type);
hL_Dotted=uimenu(hLStyle,'Label','虚线','Tag','Dotted','Callback',@MLine_Type);
hL_Dashed=uimenu(hLStyle,'Label','双划线','Tag','Dashed','Callback',@MLine_Type);
函数文件plot_sin.m
function plot_sin(source,callbackdata)
t=-pi:pi/20:pi;
plot(t,sin(t));
h1=findobj('Tag','LStyle');
h1.Enable='On';%将Tag属性为LStyle的Enable改为on,使得 “线型”菜单项可用
end
函数文件MLine_Type.m
function MLine_Type(source,callbackdata)
hline=findobj('Type','line');%返回类型为线型的对象
if strcmp(source.Tag,'Solid')==1%strcmp字符比较函数
hline.LineStyle='-';
elseif strcmp(source.Tag,'Dotted')==1
hline.LineStyle=':';
elseif strcmp(source.Tag,'Dashed')==1
hline.LineStyle='--';
end
end
程序运行结果,运行主程序生成图形界面,此时菜单中“图形选项”下的“选项”不可用。单机“绘图”按钮绘制曲线之后,“选项”可用,这时可以改变线型。
(1)打开GUIDE
(2)图形用户界面设计模板
从左到右依次是:
对齐对象工具、菜单编辑器、Tab键顺序编辑器、工具栏编辑器、代码编辑器、对象属性检查器、对象浏览器。
(1)对象属性检查器
用于检查/修改对象属性的工具
(2)菜单编辑器
(3)对象浏览器
用于查看图形对象和展示界面的组织架构。
(1)回调属性
(2)回调函数框架
function 对象标识_Callback(hObject,eventdata,handles)
,其中,hObject为发生事件的源控件,eventdata为事件数据,handles保存图形界面中所有对象的句柄。
(3)回调函数举例
function pushbutton1_Callback(hObject, eventdata, handles)
A=eval(handles.editfz.String);
f=eval(handles.editpl.String)/50;
theta=eval(handles.editxj.String)/180*pi;
x=linspace(0,2*pi,100);
if handles.Opsin.Value==1%判断是选择sin还是cos函数
y=A*sin(f*x+theta);
else
y=A*cos(f*x+theta);
end
plot(x,y);
handles.PStyle.Enable='On';
function Soild_Callback(hObject, eventdata, handles)
hline=findobj('Type','line');
hline.LineStyle='-';
handles.Solid.Checked='On';%指示菜单已经选中
handles.Dotted.Checked='Off';
handles.Dashed.Checked='Off';
function r_Callback(hObject, eventdata, handles)
hline=findobj('Type','line');
hline.Color='r';
handles.r.Checked='On';%指示菜单已经选中
handles.g.Checked='Off';
handles.b.Checked='Off';
(1)打开App Designer
(2)App Designer窗口
快速访问工具栏,功能区,App编辑器
(3)App编辑器
常用组件、容器组件、仪器组件
例1 :建立一个App用户界面,该界面包括1个坐标轴,2个旋钮,2个按钮和1个按钮。
(1)打开App设计器窗口,添加组
(2)利用属性面板设置组件对象的属性
(3)定义回调函数
App程序采用面向对象设计模式,声明对象、定义函数、设置属性和共享数据都封装在一个类中,一个MATLAB文件就是一个类的定于。
(1)类的基本结构
classdef 类名<matlab.apps.AppBase>
properties (Access=public)
……
end
methods (Access=private)
function 函数1(app)
……
end
function 函数2(app)
……
end
end
(2)访问权限
例2:实现例1界面的绘图功能。
(1)绘图按钮的回调函数
function Button_2Pushed(app, event)
f=eval(app.Knob_3.Value);%获取离散旋钮对象的Value属性值
theta=app.Knob_2.Value/180*pi;%获取旋钮对象的Value属性值
x=linspace(0,2*pi,100);
if app.sinxButton.Value==1
y=sin(f*x+theta);
else
y=cos(f*x+theta);
end
%plot的第一个参数必须是坐标轴对象句柄
%plot函数默认的线宽是1,App程序的线宽必须小于0.4
plot(app.UIAxes,x,y,'LineWidth',0.2)
end
(2)清空按钮的回调函数
function Button_3Pushed(app, event)
cla(app.UIAxes)
end
在今后的版本里,GUIDE将会被删除,目前版本会提示不建议使用。所以,建议使用APP设计工具。
if string(app.ChooseFun.Value)=='Peaks'
app.ChooseFun.UserData=peaks(34);
elseif string(app.ChooseFun.Value)=='Membrane'
app.ChooseFun.UserData=membrane;
elseif string(app.ChooseFun.Value)=='Sinc'
[x,y]=meshgrid(-8:0.3:8);
r=sqrt(x.^2+y.^2);
sinc=sin(r)./r;
app.ChooseFun.UserData=sinc;
end
guidata(app.UIAxes,app.ChooseFun.UserData)%更改数据,并在图窗中再次存储新数据
mesh(app.UIAxes,app.ChooseFun.UserData);
surf(app.UIAxes,app.ChooseFun.UserData);
contour3(app.UIAxes,app.ChooseFun.UserData);
if app.GridsSwitch.Value==1
app.UIAxes.XGrid='on';
app.UIAxes.YGrid='on';
app.UIAxes.ZGrid='on';
app.GridsSwitch.Text='隐藏网格';
else
app.UIAxes.XGrid='off';
app.UIAxes.YGrid='off';
app.UIAxes.ZGrid='off';
app.GridsSwitch.Text='显示网格';
end
el=app.Edit_el.Value;
az=app.Edit_az.Value;
app.UIAxes.View=[az,el];
colormap(app.UIAxes,app.ChooseMap.Value)
if app.Faceted.Value==1
shading(app.UIAxes,'faceted');
elseif app.Interpolated.Value==1
shading(app.UIAxes,'interp');
elseif app.Flat.Value==1
shading(app.UIAxes,'flat');
end
(1)添加组件,并设置相应的属性。
(2)编写“开始”按钮的回调函数
amr=eval(app.Knob.Value);
theta=app.Knob_2.Value;
x=linspace(0,10*pi,300);
y=sin(x)+sin(3*x+theta)/amr;
if strcmp(app.Switch.Value,'On')
y=awgn(y,30);
end
app.Gauge.Value=max(y);
plot(app.UIAxes,x,y,'LineWidth',0.1);