MATLAB 第9章 图形对象

转载于《MATLAB基础与应用教程(第2版)》蔡旭晖 刘卫国 蔡立燕 | 微信读书链接

MATLAB 的图形是由不同图形对象组成的。
MATLAB 用句柄来标识对象,我们可以通过句柄来访问相应对象的属性。MATLAB R2014b以后的版本采用OpenGL作为默认图形渲染器,加强和扩展了通过图形对象句柄对各种图形对象进行修改和控制的方法。
第4章介绍的绘图函数主要通过命令参数控制图形的绘制过程,图形每一部分的属性都是按默认属性或命令中选项的指定值进行设置,适用于绘制简单界面、单一图形,充分体现了 MATLAB 语言的实用性。
相对于命令参数的自定义绘图,通过句柄设置对象属性,绘图操作控制和表现图形的能力更强,可以对图形对象进行更灵活、精细的控制,充分体现了MATLAB语言的开放性。
【学习目标】
● 了解图形对象和图形对象句柄的基本概念。
● 掌握图形对象属性的基本设置方法。
● 掌握利用图形对象控制绘图操作的方法。
● 熟悉图形对象优化方法。

9.1 图形对象及其句柄

MATLAB的图形系统是面向对象的,图形类是MATLAB为了描述具有类似特征的图形元素而定义的具有一些公共属性的抽象的元素集合,而由图形类定义的图形对象是用于控制图形显示和生成用户界面的基本要素。

9.1.1 图形对象的基本概念

MATLAB 的图形对象包括图形窗口、坐标轴、用户界面控件、曲线、曲面、文本、图像等。在MATLAB中,每一个具体的图形都是由若干个不同的图形对象组成的,例如绘图操作中,曲线、曲面、坐标轴、图形窗口,都是图形对象。图形对象是有层次的,其层次结构如图9.1所示,系统将各种图形对象按树形结构组织起来。一个项目可以包含一个或多个图形窗口,一个图形窗口可包含一组或多组坐标轴,每一组坐标轴上又可绘制多种图形,如曲线、曲面、文本等。
图形窗口(Figure)对象是显示图形的窗口和与用户进行交互的界面,其他图形对象都是图形窗口对象的子对象。图形窗口是根对象下的一级对象,坐标轴和用户界面对象是图形窗口的子对象,图形对象(曲线、曲面、文本)和图表等是坐标轴的子对象。通常,我们直接在坐标轴中放置图形对象和图表,但有时为方便管理,也可以用组对象作为容器,容纳相关联的图形对象和图表。
图9.1 图形对象的层次结构9.1 图形对象的层次结构

创建图形对象的函数与所创对象的类型有相同名称。例如,text函数创建Text(文本)对象, figure函数创建Figure(图形窗口)对象。
在 MATLAB 系统中建立一个对象,系统就会建立一个映射该对象的句柄,用于存储相应对象的属性。在MATLAB中,我们可以通过句柄对图形对象进行操作。

9.1.2 图形对象句柄

在以前的MATLAB 版本中,图形句柄(Handle)是一个实数,从R2014b起,图形句柄成为对象句柄。一个句柄对应着一个图形对象,可以用对象句柄设置和查询对象属性。
MATLAB提供了若干个函数用于识别特定图形对象,如表9.1所示。
表9.1 常用图形对象的识别函数
[插图]
可以利用图形对象的Parent属性获取包容此图形对象的容器,Children属性获取此对象所容纳的图形对象。在获取对象的句柄后,可以通过句柄来获取或设置对象的属性。
【例9.1】 绘制曲线并查看有关对象的属性。
命令如下:

>> x=linspace(-pi,pi,30);
>> plot(x,5*sin(x),'rx',x,x.^2,x,1./x);
>> h1=gca;    %获取当前坐标轴的句柄
>> h1.Children  %查询当前坐标轴的子对象
ans =
  3x1 Line 数组:
  Line
  Line
  Line

结果显示当前坐标轴中有3个曲线对象,要查看其中某个对象的属性,如第1个对象,使用以下命令:

>> h1.Children(1)
  Line (具有属性):
       Color: [0.8500 0.3250 0.0980]
    LineStyle: '-'
    LineWidth: 0.5000
     Marker: 'none'
     MarkerSize: 6
      MarkerFaceColor: 'none'
        XData: [1x30 double]
     YData: [1x30 double]
      ZData: [1x0 double]
      显示 所有属性

单击最后一行的链接“所有属性”,则会显示该对象的所有属性值。

9.1.3 图形对象属性

每种图形对象都具有各种各样的属性(Property),MATLAB 就是通过对属性的操作来控制和改变图形对象的外观和行为的。
1.属性名与属性值
同一类对象有着相同的属性,属性的取值决定了对象的表现。例如,LineStyle是曲线对象的一个属性,它的值决定着线型,取值可以是’-’ 、’:’、’-.’、’–’或’none’。在属性名的写法中,不区分字母的大小写,而且在不引起歧义的前提下,属性名可以只写前一部分。例如,lines就代表LineStyle。
2.属性的操作
访问图形对象是指获取或设置图形对象的属性。不同图形对象所具有的属性不同,但访问的方法是一样的。MATLAB 2014b及以后的版本,一般使用点运算符来访问对象属性,一般形式是:对象句柄.属性名。例如,h1.Color表示引用图形对象h1的Color属性。
(1)设置图形对象属性

H.属性名=属性值

其中,H是图形对象的句柄。绘制二维和三维曲线时,可以通过设置已有图形对象的属性修改曲线的颜色、线型和数据点的标记符号等。例如,绘制正弦曲线,然后将曲线线型修改为虚线,线条颜色为红色,可使用以下命令:

 >>h1=fplot(@(x)sin(x),[0,2*pi]);
 >>h1.Color=[1 0 0];
 >>h1.LineStyle=':'

这种设置图形对象属性的方法每次只能作用于一个图形对象。若同时设置一组图形对象的属性,可以使用set函数。set函数的调用格式为

set(H,Name,Value)
set(H,NameArray,ValueArray)

其中,H用于指明要操作的图形对象,如果H是一个由多个图形对象句柄构成的向量,则操作施加于H的所有对象。第1种格式,Name指定属性,属性名要用单撇号括起来,Value为该属性的值。第2种格式中,NameArray、ValueArray是单元数组,存储了H所有对象的属性,NameArray存储属性名,ValueArray存储属性值。要为m个图形对象中的每个图形对象设置n个属性值,则NameArray是有n个元素的行向量,ValueArray应为m×n的单元数组。例如,绘制3条曲线,然后将曲线线型全部修改为虚线,线条颜色为蓝色,可以使用以下命令:

>> hlines=fplot(@(x)[sin(x),sin(2*x),sin(3*x)],[0,2*pi]);
>> set(hlines,'Color',[0 0 1],'LineStyle',':')3条曲线分别采用不同颜色、不同线型,则可以使用以下命令:
>> hlines=fplot(@(x)[sin(x),sin(2*x),sin(3*x)],[0,2*pi]);
>> NArray={'LineStyle','Color'};
>> VArray={'--',[1 0 0]; ':',[0 1 0]; '-.',[0 0 1]};
>> set(hlines,NArray,VArray)

(2)获取图形对象属性

V=H.Name

其中,H是图形对象的句柄,Name是属性名。例如,以下命令用来获得前述曲线h1的颜色属性值:

>> hcolor=h1.Color   %或hcolor=get(h1,'Color')
hcolor =
  1   0   0

这种方法每次只能获取一个图形对象的属性。若需要获取一组图形对象的属性,可以采用get函数。get函数的调用格式为

V=get(H,Name)

其中,H是图形对象句柄,选项Name指定要访问的属性,V存储返回的属性值。如果在调用get函数时省略Name,将返回对象所有的属性值。例如,hlines是前面绘制的一组图形对象的句柄,包含3条曲线,要得到这些曲线的属性,可以使用以下命令:

>> hlines_p=get(hlines,{'Color','LineStyle'})
hlines_p =
  3×2 cell 数组
   {1×3 double} {'--'}
   {1×3 double} {':' }
   {1×3 double} {'-.'}

(3)属性检查器
可通过inspect函数打开属性检查器,查询和修改图形对象的属性。inspect函数的调用格式如下:

inspect(H)
inspect([h1,h2,])

其中,参数H、h1、h2等是图形对象句柄。第2种格式在打开属性检查器后,只显示所列图形对象都拥有的属性。例如:

>> x=linspace(0,2*pi,100);
>> h1=plot(x,log(x).*sin(x),'r:');
>> inspect(h1);
>> h2=text(1,0,'example');
>> inspect([h1,h2])

执行命令“inspect(h1)”打开图9.2(a)所示检查器,执行命令“inspect([h1,h2])”打开图9.2 (b)所示检查器。
在这里插入图片描述
图9.2 图形对象属性检查器
3.对象的公共属性
图形对象具有各种各样的属性,有些属性是所有对象共同具备的,有些属性则是各对象所特有的。这里先介绍图形对象的常用公共属性,即大部分对象都具有的属性。

  1. Children属性。属性值是所有子对象的句柄构成的一个数组。
  2. Parent属性。属性值是该对象的父对象句柄。
  3. Color属性。属性值是一个颜色值,既可以用字符表示,又可以用RGB三元组表示。
  4. Position属性。属性值是一个由4个元素构成的行向量,其形式为[x, y, w, h]。这个向量定义了图形对象在上层对象上的位置和大小,其中x和y分别为对象左下角的横坐标、纵坐标, w和h分别为图形对象的宽度和高度。
  5. Units属性。定义图形对象所使用的长度单位,由此决定图形对象的大小与位置。该属性的取值可以是下列字符串中的任何一种:‘pixel’(像素)、‘normalized’(依据父对象进行归一化)、‘inches’(英寸)、‘centimeters’(厘米)、‘points’(磅,1磅=1/72英寸)和’characters’(字符)。Units属性值除了’normalized’以外,其他单位都是绝对度量单位。'normalized’指的是相对于父对象大小的比例,将父对象的左下角映射为(0,0),而右上角映射为(1.0,1.0),Position属性值在0~1。Units属性将影响一切定义大小的属性,如前面的Position属性。
  6. Tag 属性。属性值是对象的标识名。当一个程序中包含很多类型、名称各不相同的对象时,我们可以通过Tag属性给每个对象建立标识,方便对这些对象管理。
  7. Type属性。属性值是对象的类型,这是一个只读属性。
  8. Visible属性。属性值是’On’(默认值)或’Off’,决定着图形对象在图形窗口中是否可见。
  9. CreateFcn 属性和DeleteFcn属性。用于指定创建图形对象和删除图形对象时调用的函数或执行的命令,可取值为函数句柄、由函数句柄和参数构成的单元数组、函数名或命令字符串。
  10. KeyPressFcn属性。用于指定键盘按键事件发生时调用的函数或执行的命令。
  11. WindowButtonDownFcn或ButtonDownFcn属性。用于指定鼠标按键事件发生时调用的函数或执行的命令。
  12. WindowButtonMotionFcn属性。用于指定鼠标光标移动事件发生时调用的函数或执行的命令。

【例 9.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'

9.2 图形窗口对象与坐标轴对象

所有图形对象都可以由与之同名的绘图函数创建。所创建的对象置于某个父对象中,当父对象不存在时,MATLAB会自动创建它。例如,用plot函数画一条曲线,假如在画线之前,坐标轴已经存在,则在当前坐标轴上画线;若坐标轴不存在,MATLAB会自动创建它们。
前面介绍了图形对象的公共属性,本节介绍图形窗口对象和坐标轴对象的创建方法及特殊属性。

9.2.1 图形窗口对象

图形窗口是显示图形及与用户交互的窗口。每一个图形窗口可以作为其他图形对象的父对象,即当作坐标轴、控件等对象的容器。MATLAB的一切图形图像的输出都是在图形窗口中完成的。掌握好图形窗口的控制方法,对于充分发挥 MATLAB 的图形功能和设计高质量的用户界面是十分重要的。
1.图形窗口的基本操作
MATLAB通过figure函数来创建窗口对象,其调用格式为

句柄变量=figure(属性名1,属性值1,属性名2,属性值2,)

其中,属性用于设置图形窗口的呈现方式。如果调用时不带参数,则按图形窗口的默认属性值建立图形窗口。
如果figure函数的参数是窗口句柄,即

figure(窗口句柄)

则设定该句柄对应的窗口为当前窗口,随后的操作都是在这个窗口中实施的。
要关闭图形窗口,应使用close函数,其调用格式为

close(窗口句柄)
close all

“close all”命令关闭所有的图形窗口。
要清除图形窗口的内容,但不关闭窗口,则使用clf函数,其调用格式为

clf(窗口句柄)

不带参数的clf函数,表示清除当前图形窗口的内容。
2.图形窗口的属性
图形窗口除公共属性外,还有控制图形窗口外观、交互控制、回调执行控制、键盘控制、鼠标控制、窗口控制等多类属性,常用属性如下。

  1. Name属性。属性值是一个字符串,用于指定图形窗口的标题,默认为空。一般情况下,图形窗口的默认标题形式为Figure n,这里n是图形窗口的序号。
  2. Number属性。它是图形窗口的序号。
  3. NumberTitle属性。决定着在图形窗口的标题中是否以“Figure n:”为标题前缀。属性值可以是’on’(默认值)或’off’。
  4. MenuBar 属性。用于控制图形窗口是否具有菜单栏。属性值可以是’figure’(默认值)或’none’。如果值为’none’,则表示该图形窗口没有菜单栏;如果值为’figure’,则该窗口将显示图形窗口默认的菜单栏。
  5. ToolBar属性。用于控制图形窗口是否具有工具栏,属性值可以是’auto’(默认值)、‘figure’或’none’。如果值为’auto’,表示沿用MenuBar属性的设置。
  6. Pointer 属性。用于指定光标指针样式,属性值是一个字符串,可取值包括’arrow’(默认值)、‘ibeam’、‘watch’、‘circle’、‘cross’、'hand’等,分别对应典型的光标指针。
  7. SizeChangedFcn 和ResizeFcn 属性。用于指定当窗口大小发生改变和窗口大小重新定义时调用的函数或命令。
  8. KeyPressFcn 和 KeyReleaseFcn 属性。用于指定当键盘键按下、键盘键释放时调用的函数或执行的命令。
  9. ButtonDownFcn、WindowButtonMotionFcn、WindowButtonUpFcn、WindowScrollWheelFcn属性。分别用于指定鼠标键按下、鼠标光标移动、鼠标键释放、鼠标轮滚动时调用的函数或执行的命令。

图形窗口对象的默认度量单位(Units)为’pixels’,即像素。
【例 9.3】 建立一个图形窗口。该图形窗口没有菜单条,标题名称为“图形窗口实例”。图形窗口位于距屏幕左下角(2, 2)(单位:cm)处,宽度和高度分别为24cm和16cm。当用户在键盘上按下任意键时,在图形窗口绘制正弦曲线。
程序如下:

hf=figure;
hf.MenuBar='None';
hf.NumberTitle='Off';
hf.Name=’图形窗口实例’;
hf.Units='centimeters'; %设置度量单位为cm
hf.Position=[2,2,24,16];
hf.KeyPressFcn='fplot(@(x)sin(x),[0,2*pi])'

9.2.2 坐标轴

坐标轴是在图形窗口中定义的一个画图区域。坐标轴对象是图形窗口的子对象,每个图形窗口中可以定义多个坐标轴,但只有一个坐标轴是当前坐标轴。坐标轴对象是图形对象的父对象,即当作图形图像的容器。在没有指明坐标轴时,所有的图形图像都是在当前坐标轴中输出。
1.坐标轴的基本操作
建立坐标轴对象使用axes函数,其调用格式为
句柄变量=axes(parent,属性名1,属性值1,属性名2,属性值2,…)
其中,属性用于设置坐标轴的特征,选项parent用于指定坐标轴的父对象,可以是图形窗口对象、面板对象或选项卡对象的句柄。若调用axes函数时不带参数,则按坐标轴的默认属性在当前图形窗口创建坐标轴。
如果axes函数的参数是坐标轴句柄,即

axes(坐标轴句柄)

则设定该句柄代表的坐标轴为当前坐标轴,随后绘制的图形都显示在这个坐标轴中。
要清除坐标轴中的图形,则使用cla函数,其调用格式为

cla(坐标轴句柄)

不带参数的cla函数,表示清除当前坐标轴中的图形。
2.坐标轴的属性
坐标轴除公共属性外,还有控制坐标轴外观、标度、刻度、网格、视图等特征的属性,常用属性如下。

  1. Box属性。决定坐标轴是否带有边框,可取值为’on’或’off’。
  2. GridLineStyle属性。用于定义网格线的类型,可取值是’-’(默认值)、’:’、’-.’、’–’或’none’。
  3. Title属性。用于设置和修改坐标轴标题,值是通过title函数建立的标题对象的句柄。
  4. XLabel、YLabel、ZLabel属性。用于设置和修改x、y、z轴的标签,取值分别是通过xlabel、ylabel、zlabel函数建立的标签对象的句柄。
  5. XLim、YLim、ZLim 属性。取值是二元向量[Lmin,Lmax],分别定义 x、y、z 轴的下限和上限,默认为[0,1]。
  6. XScale、YScale、ZScale 属性。用于定义x、y、z轴的刻度类型,取值是’linear’(默认值)或’log’,即线性坐标或对数坐标,默认采用线性坐标。
  7. XTickLabel、YTickLabel、ZTickLabel属性。用于定义x、y、z轴的刻度线标签,取值是字符串矩阵。例如,将坐标轴的x轴刻度线标签改为循环使用字母A~F,可执行以下命令:ax.XTickLabel=['A';'B';'C';'D';'E';'F'];
  8. Xdir、Ydir、Zdir属性。用于定义沿x、y、z轴逐渐增加的值的方向,取值是’normal’(默认值)或’reverse’,分别表示值正向递增或反向递增。
  9. View 属性。用于定义视点,取值是二元向量[azimuth,elevation],azimuth 指定观察方位角,elevation指定仰角,默认为[0,90]。

坐标轴对象的默认度量单位(Units)为’normalized’,即根据容器(图形窗口或面板)进行归一化,容器的左下角映射为(0,0),右上角映射为(1,1)。
【例9.4】 利用坐标轴对象实现图形窗口的任意分割。
程序如下:

[x,y]=meshgrid(0:0.1:pi/2,0:0.05:pi);
z=sin(x.^2)+cos(y.^2);
ha1=axes('Position',[0.05,0.6,0.3,0.3]);
plot(x,z);
ha1.YDir='reverse'; %设置y轴反向递增
ha2=axes('Position',[0.45,0.6,0.5,0.35]);
plot3(x,y,z);
ha2.View=[45,-45];  %设置视点方位角和仰角
ha3=axes('Position',[0.1,0.05,0.8,0.5]);
plot3(x,y,z);
grid on;       %显示网格线

程序执行结果如图9.3所示。利用axes函数可以在不影响图形窗口上其他坐标轴的前提下建立一个新的坐标轴,从而实现图形窗口的任意分割。
在这里插入图片描述
图9.3 利用坐标轴对象分割图形窗口

9.3 图形数据对象

MATLAB将曲线、矩形、曲面、文本,以及图形中的标注、图例等均视为图形数据对象,本节介绍图形数据对象的操作。

9.3.1 曲线对象

曲线对象既可以定义在二维坐标系中,又可以定义在三维坐标系中。曲线对象除了用第4章介绍的plot、plot3函数创建外,还可以用line函数创建。line函数调用格式为

h=line(ax,x,y,属性名1,属性值1,属性名2,属性值2,)
h=line(ax,x,y,z,属性名1,属性值1,属性名2,属性值2,)

其中,输入参数x、y、z的含义和用法与plot、plot3函数一样,属性的设置与前面介绍过的figure、axes函数类似。选项ax用于指定曲线所属坐标轴,默认在当前坐标轴绘制曲线。
曲线对象除具有Parent、Color、Type、Tag、Visible等公共属性外,还有一些控制曲线外观、行为等特征的属性,常用属性如下。

  1. LineStyle属性。用于定义线型,可取值参见表4.1,默认值为’-’。
  2. LineWidth属性。用于定义线宽,默认值为0.5磅。
  3. LineJoin属性。用于定义线条边角的样式,可取值是’round’(默认值)、‘miter’、‘chamfer’,分别表示圆角、尖角、方角。
  4. Marker属性。用于定义标记符号,可取值参见表4.3,默认值为’none’。
  5. MarkerSize属性。用于定义标记符号的大小,默认值为6磅。
  6. MarkerEdgeColor属性。用于定义标记符号边框的颜色,默认值为’auto’。
  7. MarkerFaceColor属性。用于定义标记符号内的填充色,默认值为’none’。
  8. XData、YData、ZData属性。属性值是数值向量,分别存储曲线对象各个数据点的位置数据,XData、YData默认为[0,1],ZData默认为空矩阵。

曲线的默认度量单位(Units)为磅。plot函数每调用一次,就会刷新坐标轴,清空原有图形,再绘制新的曲线,而line函数生成的曲线则在已有图形上叠加显示。

【例9.5】 利用line函数绘制曲线 y = e − t s i n 2 π t y=e^{−t}sin2πt y=etsin2πt y = c o s ( π t / 2 ) y=cos(\pi t/2) y=cos(πt/2)
程序如下:

t=linspace(0,4,100);
y=sin(2*pi*t).*exp(-t);
figure('Position',[120,100,480,320]);
ha=axes('GridLineStyle','-.');
htitle=get(ha,'Title');
htitle.String='e^{-t}sin(2{\pi}t) 和 cos({\pi}t/2)';
hl1=line('XData',t,'YData',sin(2*pi*t).*exp(-t));
hl1.LineStyle='-.';
hl2=line('XData',t,'YData',cos(pi/2*t));
hl2.LineStyle=':';
grid on

程序执行结果如图9.4所示。
[插图]
图9.4 利用曲线对象绘制曲线

9.3.2 曲面对象

1.建立曲面对象
建立曲面对象除了使用第4章介绍的mesh、surf等函数外,还可以使用surface函数,其调用格式为:

h=surface(ax,Z,C,属性名1,属性值1,属性名2,属性值2,)
h=surface(ax,X,Y,Z,C,属性名1,属性值1,属性名2,属性值2,)

一般情况下,参数X、Y、Z是同型矩阵,X、Y是平面网格坐标矩阵,Z是网格点上的高度矩阵。当输入参数只有一个矩阵Z时,将Z每个元素的行和列索引用作x和y坐标,将Z每个元素的值用作z坐标绘制图形。选项C用于指定在不同高度下的曲面颜色。C省略时,MATLAB认为C=Z,亦即颜色的设定是正比于图形高度的。选项ax用于指定曲面所属坐标轴,默认在当前坐标轴绘制图形。
曲面对象除具有Parent、Type、Tag、Visible等公共属性外,还有一些与曲面形态有关的特有属性,常用属性如下。

  1. EdgeColor属性。用于定义曲面网格线的颜色。属性值是代表某颜色的字符或RGB向量,还可以是’flat’、‘interp’或’none’,默认为[0 0 0](黑色)。
  2. FaceColor 属性。用于定义曲面网格片的颜色或着色方式。属性值是代表某颜色的字符或RGB 向量,还可以是’flat’(默认值)、‘interp’、‘texturemap’或’none’。'flat’表示每一个网格片用单一颜色填充;'interp’表示用渐变方式填充网格片;'none’表示网格片无颜色;'texturemap’表示用Cdata属性定义的颜色填充网格片。
  3. FaceAlpha属性。用于定义曲面的透明度,可取值为0(完全透明)~1(完全不透明)之间的数或’flat’、‘interp’、texturemap,默认为1。
  4. FaceLighting 属性。用于定义投影到曲面的灯光的效果,可取值为’flat’(默认值)、‘gouraud’、‘none’。
  5. BackFaceLighting属性。用于定义背光效果,可取值为’reverslit’(默认值)、‘unlit’、‘lit’。
    曲面的默认度量单位(Units)为磅。surf、mesh函数每调用一次,就会刷新坐标轴,清空原有图形,再绘制新的图形,而surface函数生成的曲面则在已有图形上叠加显示。

【例9.6】 利用曲面对象绘制三维曲面z = x2− 2y2。
程序如下:

[x,y]=meshgrid(-10:0.5:10);
z=x.^2-2*y.^2;
axes('view',[-37.5,30],'Position',[0.05,0.1,0.4,0.85]);
hs1=surface(x,y,z);
hs1.FaceColor='none'; %设置网格片无填充
hs1.EdgeColor='b';  %设置网格片边框为蓝色
hT1=get(gca,'Title');
set(hT1,'String',’网格曲面’,'FontSize',12,'Position',[5,10]);
axes('view',[-37.5,30],'Position',[0.55,0.1,0.4,0.85]);
hs2=surface(x,y,z);
hs2.FaceColor='interp'; %设置网格片用渐变色填充
hs2.EdgeColor='flat';  %设置网格片边框为单一颜色
hT2=get(gca,'Title');
set(hT2,'String',’着色曲面’,'FontSize',12,'Position',[5,10])

执行程序,绘制出的图形如图9.5所示。
2.设置曲面颜色
曲面对象的CData属性称为颜色索引,用于定义曲面顶点的颜色。CData 属性的定义有以下两种方法。
[插图]
图9.5 利用曲面对象绘制的网格曲面和着色曲面
(1)使用色图
若 CData 属性值是一个 m×n(与输入参数 X、Y、Z 同型)的矩阵 C,则 C 中数据与色图(Colormap)中的颜色相关联,曲面网格顶点(i, j)的颜色为C(i, j)在色图中对应的颜色。MATLAB默认将CData属性完整的数据范围映射到色图上,颜色索引的最小值映射到色图矩阵的第一个RGB三元组,最大值映射到色图矩阵的最后一个 RGB 三元组,所有中间值线性映射到色图矩阵中间的RGB三元组。
【例9.7】 绘制三维曲面 z = x 2 − 2 y 2 z = x^2− 2y^2 z=x22y2。生成一个与z同型的随机矩阵C,将其作为CData属性值,观察曲面颜色与矩阵C的对应关系。
程序如下:

[X,Y]=meshgrid(-10:1:10);
Z=X.^2-2*Y.^2;
%生成元素值在[11,19]的随机矩阵
C=randi(9,size(Z))+10;
axes('view',[-37.5,30]);
h1=surface(X,Y,Z);
h1.CData=C;
colorbar
Cmap=colormap(gray)

执行程序,绘制出的图形如图9.6所示。“colorbar”命令用于显示颜色栏,颜色栏的数据标记显示出数据与颜色的对应关系。程序中使用gray色图,C的最小值11映射到色图的第1个颜色(黑色,[0 0 0]),最大值19映射到色图的最后1个颜色(白色,[255 255 255]),其他值线性映射到色图中间的其他颜色。
CData 属性仅影响 CDataMapping 属性为’scaled’的图形对象。如果 CDataMapping 属性值为’direct’,则颜色索引的所有值不进行比例缩放,小于1的值都将裁剪映射至色图中的第一种颜色,大于色图长度的值则裁剪映射至色图中的最后一种颜色。
(2)使用自定义颜色
若CData是一个m×n×3(输入参数X、Y、Z是m×n矩阵)的三维数组,则曲面网格顶点使用CData的第3维的RGB三元组定义的颜色。
在这里插入图片描述
图9.6 曲面对象的颜色映射

9.3.3 文本对象

使用text函数可以创建文本对象。text函数的调用格式为

h=text(ax,x,y,说明文本,属性名1,属性值1,属性名2,属性值2,)
h=text(ax,x,y,z,说明文本,属性名1,属性值1,属性名2,属性值2,)

其中,x、y、z定义文本对象的位置。说明文本中除使用标准的ASCII字符外,还可使用TeX的标识。选项ax用于指定文本对象所属坐标轴,默认在当前坐标轴输出文本。例如,执行以下命令:

h=text(10,8,50,'{\gamma}={\rho}^2');

将在当前坐标轴的指定位置输出 γ = ρ 2 γ = ρ2 γ=ρ2
文本对象除具有公共属性和曲线对象的属性(用于指定文本对象边框属性)外,还有一些与文本呈现效果有关的特有属性,常用属性如下。

  1. String属性。指定显示的文本,属性值可以是数、字符数组、单元数组。
  2. Interpreter属性。用于控制对文本字符的解释方式,属性值是’tex’(默认值,使用TeX标记子集解释字符)、‘latex’(使用LaTeX标记子集解释字符)或’none’。常用TeX标识符参见表4.5。
  3. 字体属性。这类属性有FontName、FontSize、FontAngle等。FontName属性用于指定文本使用的字体的名称,取值是系统支持的字体名称或’FixedWidth’,如’楷体’;FontSize属性指定字体大小,度量单位默认为磅,FontSize 默认值取决于操作系统和区域设置;FontWeight 属性用于指定文本字符是否加粗,取值是’normal’(默认值)或’bold’(加粗);FontAngle 属性用于设置文本字符是否倾斜,取值是’normal’(默认值)或’italic’(倾斜)。
  4. Rotation 属性。用于定义文本旋转方向,取正值时表示逆时针方向旋转,取负值时表示顺时针方向旋转。属性值是以度为单位的数,默认为0。
  5. HorizontalAlignment属性。控制文本水平方向的对齐方式,其取值为’left’(默认值)、‘center’或’right’。
  6. VerticalAlignment属性。控制文本垂直方向的对齐方式,其取值为’middle’(默认值)、‘top’、‘bottom’、‘baseline’或’cap’。

【例9.8】 利用曲线对象绘制曲线并利用文本对象完成标注。
程序如下:

x=-pi:0.1:pi;
y1=sin(x);
y2=cos(x);
h1=line(x,y1,'LineStyle',':');
h2=line(x,y2,'LineStyle','--');
xlabel('{-\pi}{\leq}{\Theta}{\leq}{\pi}');
ylabel('sin{\Theta}');
text(-pi/4,sin(-pi/4),'{\leftarrow}sin(-{\pi}{\div}4)','FontSize',12)

程序执行结果如图9.7所示。
[插图]
图9.7 利用曲线对象绘制曲线并标注

9.3.4 其他图形数据对象

1.补片对象
补片对象是由一个或多个多边形构成的。在MATLAB中,创建补片对象的函数是patch函数,通过定义多边形的顶点和多边形的填充颜色来实现。patch函数的调用格式为

patch(ax,X,Y,C,属性名1,属性值1,属性名2,属性值2,)
patch(ax,X,Y,Z,C,属性名1,属性值1,属性名2,属性值2,)

其中,X、Y、Z定义多边形顶点。若X、Y、Z是有n个元素的向量,则绘制一个有n个顶点的多边形;若X、Y、Z是m × n的矩阵,则每一列的元素对应一个m边形,绘制n个m边形。参数C指定填充颜色。选项ax用于指定补片对象所属坐标轴,默认在当前坐标轴绘制图形。
补片对象除具有曲面对象的基本属性外,还具有控制补片对象特征的特有属性,常用属性如下。

  1. Vertices和Faces属性。取值是一个m × n的矩阵。Vertices属性定义每个顶点的坐标。Faces属性定义每个面的顶点连接,值矩阵的每一行指定一个面的所有顶点,图形由m个面构成,每个面最多有n个顶点。
  2. FaceVertexCData属性。用于指定每个补片的面和顶点的颜色。
  3. XData、YData和ZData属性。其取值是向量或同型矩阵,分别定义各顶点的x、y、z坐标。若它们为矩阵,则每一列对应一个多边形。

【例9.9】 用patch函数绘制两个三角形。
三角形可以当成有3个顶点的多边形处理,程序如下:

x=[0;3;0;1;4;1];
y=[1;1;3;3.5;2;5];
X=[x(1:3,1),x(4:6,1)];
Y=[y(1:3,1),y(4:6,1)];
C=rand(size(X));
patch(X,Y,C)

程序执行结果如图9.8所示。下面通过指定补片对象的Vertices和Faces属性绘制这些图形,程序如下:

x=[0;3;0;1;4;1];
y=[1;1;3;3.5;2;5];
v=[x,y];
f=[1,2,3;4,5,6];
col=rand(6,1);
patch('Faces',f,'Vertices',v,'FaceVertexCData',col, ...
'FaceColor','interp')

在这里插入图片描述
图9.8 利用补片对象绘制的多边形
2.矩形对象
在 MATLAB 中,矩形、椭圆及二者之间的过渡图形(如圆角矩形),都称为矩形对象。创建矩形对象的函数是rectangle,该函数调用格式为

rectangle(属性名1,属性值1,属性名2,属性值2,)

除公共属性外,矩形对象还有Curvature属性,定义水平和垂直方向的曲率。Curvature属性用二元向量[x, y]定义,x和y的取值范围为[0,1],x指定水平方向的曲率,y指定垂直方向的曲率。如果Curvature设置为[0, 0],则生成直角矩形;Curvature设置为[1, 1],则生成椭圆。如果值用标量定义,则表示两个方向的曲率一致。Curvature的默认值为[0, 0]。
【例9.10】 在同一坐标轴中绘制矩形、圆角矩形、椭圆和圆。
程序如下:

rectangle('Position',[0,0,40,30],'LineWidth',2,'EdgeColor','r');
rectangle('Position',[5,5,20,30],'Curvature',.4,'LineStyle','-.');
rectangle('Position',[10,10,30,20],'Curvature',[1,1],'LineWidth',2);
rectangle('Position',[0,0,30,30],'Curvature',[1,1],'EdgeColor','b');
axis equal

程序执行结果如图9.9所示。
[插图]
图9.9 不同样式的矩形对象

9.3.5 动画对象

MATLAB 中可以使用多种方法创建动画。第4章介绍了通过捕获多帧图像并连续播放的方法创建逐帧动画,本节介绍生成动画的其他方法。
1.创建轨迹动画
描绘质点运动轨迹的动画,称为轨迹动画。MATLAB提供了comet和comet3函数展现质点在二维平面和三维空间的运动轨迹。函数调用格式为

comet(x,y,p)
comet3(x,y,z,p)

其中,x、y、z组成曲线数据点的坐标,用法与plot和plot3函数相同。参数p用于设置绘制的彗星轨迹线的彗长,彗长为p倍y向量的长度,p可为0~1之间的数,默认p为0.1。例如,以下程序用彗星运动轨迹演示曲线 的绘制过程。
{ x = s i n t + t c o s t y = c o s t − t s i n t z = t \begin{cases}x=sint+tcost \\ y=cost-tsint\\z=t \end{cases} x=sint+tcosty=costtsintz=t

0 < = t < = 10 π 0<=t<=10\pi 0<=t<=10π

t=linspace(0,10*pi,200);
x=sin(t)+t.*cos(t);
y=cos(t)-t.*sin(t);
comet3(x,y,t)

执行程序,动画中的一个画面如图9.10所示。
2.创建线条动画
线条动画是通过修改动画线条对象的属性后刷新显示,产生动画效果。创建线条动画包括以下3个步骤。
(1)创建动画线条对象
MATLAB提供animatedline函数创建动画线条对象,函数的调用格式为

h=animatedline(ax,x,y,z,属性名1,属性值1,属性名2,属性值2,)

其中,选项ax指定动画线条对象的父对象,默认为当前坐标轴。x、y、z定义动画线条对象的起始位置。动画线条对象的属性含义与用法(如线条颜色、线型、标记符号等)与 line 函数相同。
[插图]
图9.10 轨迹动画播放画面
(2)添加数据点
在动画线条对象上添加数据点使用addpoints函数,函数的调用格式为

addpoints(h,x,y)
addpoints(h,x,y,z)

其中,h是动画线条对象句柄,x、y、z是要加入的数据点的坐标。为了不影响绘制速度,一般先计算出所有数据点的坐标,然后逐个添加。
(3)更新显示
使用“drawnow”或“drawnow limitrate”命令控制显示更新。在数据量大的情况下,“drawnow limitrate”命令的更新比“drawnow”命令更快。
当动画中的所有数据点只有位置不同,而其他属性相同时,可以使用这种动画形式。为了控制坐标轴不会随图形的每一次刷新而变化,在创建动画之前,先设置坐标轴范围(XLim、YLim、ZLim),或将与之关联的模式属性(XLimMode、YLimMode、ZLimMode)改为手动模式。
【例9.11】 绘制螺旋线 ,展示其绘制过程。 { x = s i n t + t c o s t y = c o s t − t s i n t z = t \begin{cases}x=sint+tcost \\ y=cost-tsint\\z=t \end{cases} x=sint+tcosty=costtsintz=t

0 < = t < = 10 π 0<=t<=10\pi 0<=t<=10π
程序如下:

ha=axes('view',[-37.5,30]);
ha.XLim=[-30,30];
ha.YLim=[-30,30];
ha.ZLim=[0,30];
h=animatedline;
%生成数据
t=linspace(0,10*pi,200);
x=sin(t)+t.*cos(t);
y=cos(t)-t.*sin(t);
%逐个添加数据点并绘制
for k=1:length(t)
  addpoints(h,x(k),y(k),t(k));
  drawnow;
end

3.创建变换动画
在 MATLAB 中,还可以通过变换对象沿着线条移动一组对象,产生动画效果。变换对象是一种特殊的图形对象,通过改变其属性可以控制图形对象的外观和行为。创建变换对象使用hgtransform函数,函数的调用方法为

h=hgtransform(ax,属性名1,属性值1,属性名2,属性值2,)

其中,选项ax用于指定变换对象的父对象,默认为当前坐标轴。
创建变换对象后,通过将变换指定给变换对象的Matrix属性,将变换应用于图形对象。Matrix属性值是一个4×4的矩阵,用makehgtform函数创建。makehgtform函数简化了执行旋转、转换和缩放来构造矩阵的过程,函数的调用方法如下:

M=makehgtform
M=makehgtform('translate',tx, ty, tz)
M=makehgtform('scale',s)
M=makehgtform('scale',sx,sy,sz)
M=makehgtform('xrotate',t)
M=makehgtform('yrotate',t)
M=makehgtform('zrotate',t)
M=makehgtform('axisrotate',[ax,ay,az],t)

第1种格式创建恒等变换矩阵;第2种格式创建沿x、y和z轴按tx、ty和tz进行转换的变换矩阵,平移图形对象;第3种格式创建等比例缩放的变换矩阵;第4种格式创建分别沿x、y和z轴按sx、sy和sz进行缩放的变换矩阵;第5、6、7种格式分别创建绕x、y、z轴方向旋转t弧度的变换矩阵;第8种格式创建绕轴[ax, ay, az]旋转t弧度的变换矩阵。
【例9.12】 绘制螺旋线 ,并在其上添加一个’o’类数据标记, { x = s i n t + t c o s t y = c o s t − t s i n t z = t \begin{cases}x=sint+tcost \\ y=cost-tsint\\z=t \end{cases} x=sint+tcosty=costtsintz=t

0 < = t < = 10 π 0<=t<=10\pi 0<=t<=10π标记从螺旋线始端移动到尾端,在移动的过程中显示曲线上各个数据点的坐标。
程序如下:

t=linspace(0,10*pi,200);
x=sin(t)-t.*cos(t);
y=cos(t)+t.*sin(t);
plot3(x,y,t);  %绘制螺旋线
ha=gca;
h=hgtransform;  %在当前坐标轴创建变换图形对象
plot3(h,x(1),y(1),t(1),'o');  % 在变换对象上添加标记符号
ht=text(h,x(1),y(1),t(1),num2str(y(1)),...
  'VerticalAlignment','bottom','FontSize',14);  %在变换对象上添加文本
for k=2:length(x)
   m=makehgtform('translate',x(k),y(k),t(k));
   h.Matrix=m;
   ht.String=['(', num2str(x(k)),',',num2str(y(k)),')'];
   drawnow;
end

9.4 光照和材质处理

曲面对象的呈现效果除了与自身属性有关,还与光照和材质有关。

9.4.1 光源对象

不同光源从不同位置、以不同角度投射光到物体的表面,使图形表面微妙的差异体现得更清楚。
1.创建光源对象
MATLAB提供light函数创建光源对象,其调用格式为

H=light(属性名1,属性值1,属性名2,属性值2,)

其中,属性指定光源的特性。光源对象有如下3个重要属性。

  1. Color属性。设置光的颜色,值是RGB三元组或描述颜色的字符串,默认为白色。
  2. Style 属性。设置光源类型,可取值为’infinite’或’local’,分别表示无穷远光和近光,默认为无穷远。
  3. Position属性。指定光源位置,值是一个三元向量。光源对象的位置与Style属性有关,若Style属性为local,则设置的是光源的实际位置;若Style属性为infinite,则设置的是光线射过来的方向。

2.设置光照模式
利用“lighting”命令可以设置光照模式,“lighting”命令的格式为

lighting 选项

其中,选项有4种取值。'flat’选项使入射光均匀洒落在图形对象的每个面上,是默认选项;'gouraund’选项先对顶点颜色插补,再对顶点勾画的面上颜色进行插补,用于表现曲面;'phong’选项对顶点处的法线插值,再计算各个像素的反光,它生成的光照效果好,但更费时;'none’选项关闭所有光源。
【例9.13】 绘制光照处理后的球面并观察不同光照模式下的效果。
程序如下:

[X,Y,Z]=sphere(30);
axes('view',[-37.5,30],'Position',[0.05,0.1,0.4,0.85]);
surface(X,Y,Z,'FaceColor','flat','EdgeColor','none');
axes('view',[-37.5,30],'Position',[0.55,0.1,0.4,0.85]);
surface(X,Y,Z,'FaceColor','flat','EdgeColor','none');
lighting gouraund;
light('Position',[1 -1 2],'Style','infinite')

程序执行结果如图9.11所示。左图采用默认的光照模式,没有设置光源;右图采用’gouraund’光照模式,光源设置在远处。
[插图]
图9.11 光照处理效果

9.4.2 材质处理

图形对象的反射特性影响在光源照射下图形呈现的效果。图形对象的反射特性主要有5种。

  1. SpecularStrength 属性。用来控制对象表面镜面反射的强度,属性值取0~1的数,默认取0.9。
  2. DiffuseStrength属性。用来控制对象表面漫反射的强度,属性值取0~1的数,默认值取0.6。
  3. AmbientStrength属性。用于确定环境光的强度,属性值取0~1的数,默认值取0.3。
  4. SpecularExponent属性。用于控制镜面反射指数,值大于等于1,大多设置在5~20,默认值为10。
  5. BackFaceLighting属性。控制对象内表面和外表面的差别,取值为’unlit’、‘lit’和’reverselit’ (默认值)。

【例9.14】 绘制具有不同镜面反射强度的球面,并观察反射特性对图形效果的影响。
程序如下:

[X,Y,Z]=sphere(30);
axes('view',[-37.5,30],'Position',[0.05,0.1,0.4,0.85]);
hs1=surface(X,Y,Z,'FaceColor','flat','EdgeColor','none');
%光源位置在[1 -1 2],光照模式为phong
light('Position',[1 -1 2]);
lighting phong;
hs1.SpecularStrength=0.1;
axes('view',[-37.5,30],'Position',[0.55,0.1,0.4,0.85]);
hs2=surface(X,Y,Z,'FaceColor','flat','EdgeColor','none');
light('Position',[1 -1 2]);
lighting phong;
hs2.SpecularStrength=1

程序的执行结果如图9.12所示。图9.12(a)的SpecularStrength属性值为0.1,表面暗,无光泽。图9.12(b)的SpecularStrength属性值为1,表面有光泽。
[插图]
图9.12 曲面不同的反射效果

思考与实验

一、思考题
1.图形对象操作的基本思路是什么?
2.简要描述下面程序最终的运行图形。

x=-2*pi:pi/40:2*pi;
y=sin(x);z=sin(2*x);
H1=plot(x,y,x,z);
set(H1(1),'color',[1,0,0],'linewidth',3);
set(H1(2),'color',[0,0,1]);
title('Handle Graphic Example');
H1_text=get(gca,'Title');
set(H1_text,'FontSize',26)

3.说明下列程序段的功能。
(1)

h=plot(0:0.1:2*pi,sin(0:0.1:2*pi)); grid on;
set(h,'LineWidth',5,'Color','red');
set(gca,'GridLineStyle','-','Fontsize',16)

(2)

h=plot(0:0.1:2*pi,sin(0:0.1:2*pi));grid on;
set(gca,'ytick',[-1 -0.5 0 0.5 1])
set(gca,'yticklabel','a|b|c|d|e')
set(gca,'Fontsize',20)

(3)

Hb=findobj(gca,'Color','b')

二、实验题
1.建立一个图形窗口,使之背景颜色为红色,并在窗口上保留原有的菜单项,而且在按下鼠标左键之后显示出“Left Button Pressed”字样。
2.用line函数在同一个坐标轴绘制曲线
{ x = s i n t y = c o s t \begin{cases}x=sint \\ y=cost \end{cases} {x=sinty=cost
{ x = s i n 7 t y = c o s 7 t \begin{cases}x=sin7t \\ y=cos7t \end{cases} {x=sin7ty=cos7t
,t∈[0,2π]。要求:
(1)第1个曲线标记数据点,线宽为2磅。
(2)设置坐标轴标题为“篮筐”,x轴的标签刻度间隔为0.1。
3.利用图形对象绘制下列曲线,要求先利用默认属性绘制曲线,然后通过图形句柄操作来改变曲线的颜色、线型和线宽,并利用文本对象给曲线添加文本标注。
(1) y = e 0.2 x c o s x 2 , x ∈ [ 0 , 5 π ] y=e^{0.2x}cosx^2,x\in[0,5\pi] y=e0.2xcosx2,x[0,5π]
(2) { x = t 2 y = 5 t 3 \begin{cases}x=t^2 \\ y=5t^3 \end{cases} {x=t2y=5t3
4.利用图形对象绘制下列三维图形,要求与第3题相同。
(1) { x = c o s t y = s i n t z = t \begin{cases}x=cost \\ y=sint\\z=t \end{cases} x=costy=sintz=t

5.以任意位置子图形式绘制出正弦、余弦、正切和余切函数曲线。
6.用patch函数绘制一个填充渐变色的正五边形。
7.生成一个圆柱体,并进行光照处理。

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值