MATLAB 之 低层绘图操作和光照及材质处理

一、低层绘图操作

  • MATLAB 将曲线、曲面、文本等图形均视为对象,通过句柄设置这些对象的属性,从而绘制出更具个性化的图形。

1. 曲线对象

  • 曲线对象是坐标轴的子对象,它既可以定义在二维坐标系中,也可以定义在三维坐标系中。建立曲线对象使用 line 函数,其调用格式如下:
	句柄变量=line(x,y,z,属性名1,属性值1,属性名2,属性值2,...)
  • 其中,对 x、y、z 的解释与高层曲线函数 plotplot3 等一样,其余参数的解释与前面介绍过的 figureaxes 函数类似。
  • 每个曲线对象也具有很多属性。除公共属性外,其他常用属性如下。
  • (1) Color 属性:该属性的取值是代表某颜色的字符或 RGB 值,用于定义曲线的颜色,默认值为当前坐标轴对象的 ColorOrder 属性定义的颜色。
  • (2) LineStyle 属性:定义线型,默认值为 ‘-’,即实线。
  • (3) LineWidth 属性:定义线宽,默认值为 0.5 磅。
  • (4) Marker 属性:定义数据点标记符号,默认值为 ‘none’。
  • (5) MarkerSize 属性:定义数据点标记符号的大小,默认值为 6 磅。
  • (6) XData、YData、ZData 属性:3 种属性的取值都是数值向量或矩阵,分别代表曲线对象的 3 个坐标轴数据。
  • 例如,我们利用曲线对象绘制曲线 y = sin ⁡ ( 2 π t ) y=\sin (2\pi t) y=sin(2πt) y = 3 2 e − 4 t sin ⁡ ( 4 3 t + π 3 ) y=\frac{\sqrt{3}}{2}e^{-4t}\sin (4\sqrt{3}t+\frac{\pi}{3}) y=23 e4tsin(43 t+3π)
  • 程序如下:
t=0:pi/100:pi/2;
y1=sin(2*pi*t);
y2=sqrt(3)/2*exp(-4*t).*sin(4*sqrt(3)*t+pi/3);
figh=figure;
axes('GridLineStyle',':','XLim',[0,pi/2],'YLim',[-1,1]);
line('XData',t,'YData',y1,'LineWidth',1);
line(t,y2);
grid on
  • 程序运行结果如下图所示。

在这里插入图片描述

2. 曲面对象

  • 曲面对象也是坐标轴的子对象,它定义在三维坐标系中,而坐标系可以在任何视点下。建立曲面对象使用 surface 函数,其调用格式如下:
	句柄变量=surface(x,y,z,属性名1,属性值1,属性名2,属性值2,...)
  • 其中,对 x、y、z 的解释与高层曲面函数 meshsurf 等一样,其余参数的解释与前面介绍过的 figureaxes 等函数类似。
  • 每个曲面对象也具有很多属性。除公共属性外,其他常用属性如下。
  • (1) EdgeColor 属性:该属性的取值是代表某颜色的字符或 RGB 值,还可以是 ‘flat’、‘interp’ 或 ‘none’,默认为黑色。定义曲面网格线的颜色或着色方式。
  • (2) FaceColor 属性:该属性的取值是代表某颜色的字符或 RGB 值,还可以是 ‘flat’(默认值)、‘interp’ 或 ‘none’。 定义曲面网格片的颜色或着色方式。
  • (3) LineStyle 属性:定义曲面网格线的线型,默认为实线。
  • (4) LineWidth 属性:定义曲面网格线的线宽,默认值为 0.5 磅。
  • (5) Marker 属性:定义曲面数据点标记符号,默认值为 ‘none’。
  • (6) MarkerSize 属性:定义曲面数据点标记符号的大小,默认值为 6 磅。
  • (7) XData、YData、ZData 属性:3 种属性的取值都是数值向量或矩阵,分别代表曲面对象的 3 个坐标轴数据。
  • 例如,我们利用曲面对象绘制三维曲面 y = sin ⁡ y cos ⁡ x y=\sin y\cos x y=sinycosx
  • 程序如下:
x=0:0.1:2*pi;
[x,y]=meshgrid(x);
z=sin(y).*cos(x);
axes('view',[-37.5,30]);
hs=surface(x,y,z,'FaceColor','w','EdgeColor','flat');
grid on; 
xlabel('x-axis');
ylabel('y-axis');
zlabel('z-axis');
title('mesh-surf');
pause;
set(hs,'FaceColor','flat');
  • 开始网格片的颜色设置为白色,实际上得到的是网格图,如下图所示,这与高层函数 mesh 所画曲面相同。

在这里插入图片描述

  • 暂停后,诚信设置网格片的颜色,得到着色表面图,如下图所示。

在这里插入图片描述

3. 文本对象

  • 文本对象主要用于给图形添加文字标注。在文本对象中除使用一般的文本以外,还允许使用 LaTeX 字符。
  • 使用 text 函数可以根据指定位置和属性值添加文本说明,并保存句柄。该函数的调用格式如下:
	句柄变量=text(x,y,z,说明文字,属性名1,属性值1,属性名2,属性值2,...)
  • 其中,说明文字中除使用标准的 ASCII 字符外,还可使用 LaTeX 格式的控制字符。例如:
>> h=text(0.5,0.5,'{\gamma}={\rho}^2');
  • 将得到标注效果: γ = ρ 2 \gamma =\rho ^{2} γ=ρ2
  • 除公共属性外,文本对象的其他常用属性如下。
  • (1) Color 属性:定义文本对象的显示颜色,默认为黑色。
  • (2) String 属性:该属性的取值是字符串或字符串矩阵,它记录着文字标注的内容。
  • (3) Interpreter 属性:该属性的取值是 ‘tex’(默认值)或 ‘none’,该属性控制对文字标注内容的解释方式,即 LaTeX 方式或 ASCII 方式。
  • (4) FontSize 属性:定义文本对象的大小,其默认值为 10 磅。
  • (5) Rotation 属性:该属性的取值是数值量,默认值为 0。它定义文本对象的旋转角度,取正值时表示逆时针方向旋转,取负值时表示顺时针方向旋转。
  • 例如,我们利用曲线对象绘制 y = sin ⁡ θ y=\sin \theta y=sinθ y = cos ⁡ θ y=\cos \theta y=cosθ 并利用文字对象完成标注。
  • 程序如下:
theta=-pi:.1:pi;
y1=sin(theta);
y2=cos(theta);
h=line(theta,y1,'LineStyle',':','Color','g');
line(theta,y2,'LineStyle','--','Color','b');
xlabel('-\pi \leq \theta \leq \pi')
ylabel('sin\theta')
title('Plot of sin\theta')
text(-pi/4,sin(-pi/4),'\leftarrow sin(-\pi\div4) ', 'FontSize',12)
set(h,'Color','r','LineWidth',2)   %改变曲线1的颜色和线宽
  • 程序运行结果如下图所示。

在这里插入图片描述

4. 其他核心对象

4.1 区域块对象

  • 区域块对象是指一个任意多边形区域。在 MATLAB 中,可以使用 patch 函数创建一个或多个多边形。有两种形式的 patch 函数,一种是高级语法形式,另一种是低级语法形式。
  • 前者通过指定每个小面的顶点坐标和颜色来创建区域块对象,后者通过指定所有顶点的坐标和各小面的顶点和颜色来创建。
  • 使用高级语法形式时,patch 函数的调用格式如下:
	patch(x,y,z,c)
  • 该函数在当前坐标轴中创建二维或三维空间中带填充模式的区域块对象。x、y、z 确定顶点坐标。如果 x、y、z 为矩阵,则 MATLAB 按列创建多个多边形。c 指定每一区 域块对象的颜色,它既可以用字符表示,也可以用 RGB 三元组表示。
  • 例如,我们将绘制一个用红色填充的正方形区域。
  • 程序如下:
x=[10, 10,25,25];
y=[10,25,25,10];
patch(x,y,[1,0,0])
  • 程序运行结果如下所示。

在这里插入图片描述

  • 例如,我们生成一个正十边形,其中用黄色填充。
  • 程序如下:
t=0:pi/5:2*pi;
patch(sin(t),cos(t),'y');
axis equal
  • 程序运行结果如下图所示。

在这里插入图片描述

  • patch 函数的低级语法格式只接受属性名和属性值配对参数,其调用格式如下:
	句柄变量=patch(属性名1,属性值1,属性名2,属性值2,...)
  • 除公共属性外,区域块对象的其他常用属性如下。
  • (1) Faces 属性:定义各小面的顶点。
  • (2) Vertices 属性:定义各顶点的坐标。
  • (3) FaceColor 属性:该属性的取值是代表某颜色的字符或 RGB 值,还可以是 ‘flat’、‘interp’ 或 ‘none’,默认为黑色。定义小面的颜色。
  • (4) EdgeColor 属性:该属性的取值是代表某颜色的字符或 RGB 值,还可以是 'flat、‘interp’ 或 ‘none’,默认为黑色。定义小面边缘的颜色。
  • (5) FaceVertexCData 属性:定义用 Faces/Vertices 方法所需要的颜色数据,其值是元素为 RGB 值的 n × 3 n×3 n×3 矩阵。
  • 例如,我们绘制一个用红色填充的正方形区域,可用 patch 函数的低级形式。
  • 程序如下:
>> vert=[10,10;10,25;25,25;25,10];
>> fac=[1,2,3,4];
>> patch('Faces',fac,'Vertices',vert,'FaceColor','r');
  • 程序运行结果如下图所示。

在这里插入图片描述

  • 例如,我们为说明 patch 函数的用法,下 面用它两种不同的格式来绘制一个由4个小面组成的扇面。
  • 首先通过小面顶点坐标和颜色进行创建,用 x、y、z 定义小面的顶点坐标,用 c 定义小面的颜色,程序如下:
x=[0,0,0,0;1,0.8,0.5,0;1,1,0.8,0.5];
y=[0,0,0,0;0.5,0.8,1,1;0,0.5,0.8,1];
z=[0.5,0.5,0.5,0.5;1.5,1.5,1.5,1.5;1.5,1.5,1.5,1.5];
mc=jet(4);      %定义色图矩阵
c(1,1,1:3)=mc(1,:);
c(1,2,1:3)=mc(2,:);
c(1,3,1:3)=mc(3,:);
c(1,4,1:3)=mc(4,:);
patch(x,y,z,c);
axis([0,1,0,1,0,2]);
grid
  • 程序运行后,生成如下图所示的 4 个小三角形组成的扇面。

在这里插入图片描述

  • 下面使用 patch 函数的第二种格式,用 vert 定义各顶点的坐标,用 fac 定义组成各小面的顶点的编号。程序如下:
vert=[0,0,0.5;1,0,1.5;1,0.5,1.5;0.8,0.8,1.5;0.5,1,1.5;0,1,1.5];
fac=[1,3,2;1,4,3;1,5,4;1,6,5];
mc=jet(4);
patch('Faces',fac,'Vertices',vert,'FaceVertexCData',mc, ...
    'FaceColor', 'Flat') ;
axis([0,1,0,1,0,2]);
grid
  • 程序运行后,生成如下图所示的图形。采用第 2 种格式建立区域块的时候,需要的数据更少,多个小面的公共顶点只需定义一次就够了,所以对于有多个小面的区域快更合适。

在这里插入图片描述

4.2 方框对象

  • 在 MATLAB 中,矩形、椭圆以及两者之间的过渡图形,如圆角矩形都称为方框对象。创建方框对象的低层函数是 rectangle,其调用格式如下:
	句柄变量=rectangle(属性名1,属性值1,属性名2,属性值2,...)
  • 除公共属性外,方框对象的其他常用属性如下。
  • (1) Position 属性:与坐标轴的 Position 属性基本相同,相对坐标轴原点定义方框的位置。该属性的取值格式为 [x, y, w, h],(x, y) 确定方框对象的左下角坐标,w、 h 分别指定方框的宽和高。
  • (2) Curvature 属性:定义方框边的曲率。该属性指定曲率,其取值格式为 [x, y],其中 x 为水平曲率,y 为垂直曲率。
  • 当值为 [0, 0] 时,创建矩形;当值为 [1, 1] 时,创建椭圆。
  • 如果只指定一个值,则水平边和垂直边都会发生相同长度的弯曲。曲率的大小由短的边确定。
  • 不带任何参数的 rectangle 函数绘制一个单位正方形,左下角坐标为 [0, 0],右上角坐标为 [1,1],曲率为 [0,0](即没有曲率)。
  • (3) LineStyle 属性:定义线型,默认为实线。
  • (4) LineWidth 属性:定义线宽,默认值为 0.5 磅。
  • (5) EdgeColor 属性:定义边框线的颜色,默认为黑色。
  • (6) FaceColor 属性:定义填充颜色,默认值为 ‘none’。
  • 例如,我们在同一个图形窗口种创建矩形、圆角矩形、椭圆和圆各一个,并使用不同的线型和线宽。
  • 程序如下:
subplot(2,2,1);
rectangle('Position',[2,3,25,15],'LineWidth',3);
subplot(2,2,2);
rectangle('Position',[3,5,15,8],'Curvature',0.4,'LineWidth',2);
subplot(2,2,3);
rectangle('Position',[5,3,10,15],'Curvature',[1,1]);
subplot(2,2,4);
rectangle('Position',[5,3,10,10],'Curvature',[1,1],...
    'LineStyle', '--','FaceColor','r');
axis equal

  • 程序运行结果如下图所示。

在这里插入图片描述

二、光照和材质处理

  • 使用光源对象实现光照处理,可以将图形表现得更加真实,使图形表面微妙的差异更清楚。光源对象是不可见的,但是可以像设置其他图形对象的属性那样设置光源对象的类型、颜色、位置和其他属性。
  • 材质体现了图形对象的反射特性,修改区域块和曲面对象的反射特性,可以改变在场景中应用光照时对象的显示外观。

1. 光照处理

  • MATLAB 提供 light 函数创建光源对象,其调用格式如下:
	句柄变量=light(属性名1,属性值1,属性名2,属性值2,...)
  • 发光对象有如下 3 个重要属性。
  • (1) Color 属性:设置光的颜色,默认为白色。
  • (2) Style 属性:设置光源对象是否在无穷远,可取值为 ‘infinite’(默认值)和 ‘local’,分别表示无穷远光和近光。
  • (3) Position 属性:该属性的取值是数值向量,取三维坐标点组成的向量形式 [x, y, z],用于设置光源对象与坐标轴原点的距离,发光对象的位置与 Style 属性有关。
  • 若 Style 属性为 ‘local’,则设置的是光源的实际位置。
  • 若Style 属性为 ‘infinite’,则设置的是光线射过来的方向,表示穿过该点射向原点。
  • 假如函数不包含任何参数,则采用默认设置:白光、无穷远、穿过 (1,0,1) 点射向坐标原点。
  • 利用 lighting 命令可以设置光照模式,其格式如下:
	lighting选项
  • 其中,选项有 4 种取值:flat、gouraud、phong、none。 flat 选项使得入射光均匀洒落在图形对象的每个面上,是默认选项;gouraud 选项先对顶点颜色插补,再对顶点勾画的面上颜色进行插补,用于表现曲面;phong 选项对顶点处的法线插值,再计算各个像素的反光,它生成的光照效果好,但更费时;none 选项关闭所有光源。
  • 例如,我们绘制光照处理后的球面并观察不同光照模式下的效果。
  • 程序如下:
[x,y,z]=sphere(20);
subplot(1,4,1);
surf(x,y,z);
axis equal;
shading interp;
hold on;
subplot(1,4,2);
surf(x,y,z);
axis equal;
light('Position',[0,1,1]);
shading interp;
lighting flat;
hold on;
plot3(0,1,1,'p');
text(0,1,1,'light');
subplot(1,4,3);
surf(x,y,z);
axis equal;
light('Position',[0,1,1]);
shading interp;
lighting gouraud;
hold on;
subplot(1,4,4);
surf(x,y,z);
axis equal;
light('Position',[0,1,1]);
shading interp; 
lighting phong;
  • 程序运行结果如下。4 个球分别是没有使用光照,使用 flat 光照,使用 gouraud 光照和使用 phong 光照时的显示效果,第二个球还标出了光源的位置

在这里插入图片描述

2. 材质处理

  • 材质体现了图形对象的反射特性,修改区域块和曲面对象的反射特性,可以改变在场景中应用光照时对象的显示外观。

2.1 图形对象的反射特性

  • 图形对象的反射特性包括镜面反射和漫反射、环境光、镜面反射指数、镜面反射光的颜色和背面光照,可以组合使用这几种特性来生成特殊的显示结果。
  • (1) 镜面反射和漫反射。区域块和曲面对象的 SpecularStrength 属性用来控制对象表面镜面反射的强度,属性值取 0~1 之间的数,默认取 0.9。DiffuseStrength 属性用来控制对象表面漫反射的强度,属性值取 0~1 之间的数,默认值取 0.6。
  • (2) 环境光。环境光不是镜面光,它均匀地洒在场景中的所有对象上。只有在坐标系中有 Light 对象时环境光才可见。AmbientStrength 属性是一个用于区域块和曲面对象的属性,确定特定对象上环境光的强度,属性值取 0~1 之间的数,默认值取 0.3。
  • (3) 镜面反射指数。镜面反射光的大小与区域块和曲面对象的 SpecularExponent 属性有关,该属性的值介于 1~500 之间,默认值为 10。
  • (4) 镜面反射光的颜色。镜面反射光的颜色可以有一个变化范围,即从对象颜色与光源颜色的组合色变到只有光源颜色。区域块和曲面对象的 SpecularColorReflectance 属性控制这个颜色,属性值取 0~1 之间的数,默认值为 1。
  • (5) 背面光照。背面光照可用于显示对象内表面和外表面的差别。区域块和曲面对象的 BackFaceLighting 属性控制该效果,属性取值为 ‘unlit’、‘lit’ 和 ‘reverselit’(默认值)。

2.2 material 函数

  • 使用 material 函数也可以设置区域块和曲面对象的表面反射特性,其调用格式如下:
  • (1) material shiny:镜面反射光的强度比漫反射光和环境光的强度要高得多,镜面光的颜色只决定于光源的颜色。
  • (2) material dull:要进行漫反射,没有镜面反射,但是反射光的颜色只与光源有关。
  • (3) material metal:镜面反射很强,环境光和漫反射光较弱,反射光的颜色与光源和对象的颜色都有关系。
  • (4) material([ka,kd,ks]):设置对象的环境光、漫反射光和镜面光的强度。
  • (5) material([ka,kd,ks,n]):设置环境光、漫反射光、镜面光的强度以及对象的镜面反射指数。
  • (6) material([ka,kd,ks,n,sc]):设置环境光、漫反射光、镜面光的强度、对象的镜面反射指数以及镜面反射光的颜色。
  • (7) material default:将环境光、漫反射光、镜面光的强度、对象的镜面反射指数和镜面反射光的颜色设置为默认值。
  • 这里需要注意的是,material 函数设置坐标系中所有区域块和曲面对象的 AmbientStrength、 DiffuseStrength、SpecularStrength、 SpecularExponent 和 SpecularColorReflectance 属性。坐标系中必须有一个可见的 Light 对象。
  • 例如,我们生成一个球体和一个立方体,观察表面反射特性设置效果。
  • 程序如下:
sphere(36);
h=findobj('Type','surface');
set (h,'FaceLighting','phong','FaceColor','interp', ...
    'EdgeColor',[0.4,0.4,0.4],'BackFaceLighting','lit')
hold on
vert=[2,0,-1;2,1,-1;3,0,0;3,0,-1;2,0,0;2,1,0;3,1,0;3,0,0];
fac=[1,2,3,4;2,6,7,3;4,3,7,8;1,5,8,4;1,2,6,5;5,6,7,8];
patch('Faces',fac,'Vertices',vert,'FaceColor','y');
light('Position',[1,3,2]);
light('Position',[-3,-1,3]);
material shiny
axis equal
hold off
  • 程序中用 findobj 函数查找 Type 属性为 surface 的对象,从而可以获取该球面的句柄,进而设置其属性。
  • 球面使用了 phong FaceLighting 属性值,因为生成了最平滑的光照插值效果。
  • vertfac 定义立方体。默认时,立方体使用 flat Facelighting 属性值增强每个边的可见性。
  • material shiny 命令会影响立方体和球体的反射属性。因为球体是闭合的,所以 BackFaceLighting 属性从默认设置变成了正常光照,删除了不必要的边缘效应。程序运行后,生成的图形效果如下图所示。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45891612/article/details/131332083