购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.4 三维绘图

前面所介绍的二维图形无法反映三维空间的实际情况,在实际工作中有时需要绘出三维图形,三维图形看起来更直观。本节主要介绍MATLAB提供的一些三维绘图命令及其使用方法,具体包括:三维绘图的基本流程、三维折线及曲线的绘制、三维图形坐标标记的命令、三维网格曲面的绘制、三维阴影曲面的绘制、三维图形的修饰标注和特殊图形的绘制等。

3.4.1 三维绘图的基本流程

三维绘图的基本流程为:数据准备→图形窗口和绘图区选择→绘图→设置视角→设置颜色表→设置光照效果→设置坐标轴刻度和比例→标注图形→保存、打印或导出。

3.4.2 三维折线及曲线的绘制

绘制二维折线或曲线时,可以使用plot命令。与这条命令类似,MATLAB也提供了一个绘制三维折线或曲线的基本命令plot3。该命令的格式如下:

plot(x1,y1,z1,option1,x2,y2,z2,option2,…)

其中,x1、y1、z1所给出的数据分别为 x 1 y 1 z 1 坐标值,option1为选项参数,以逐点折线的方式绘制一个三维折线图形;x2、y2、z2所给出的数据分别为 x 2 y 2 z 2 坐标值,option2为选项参数,以逐点折线的方式绘制另一个三维折线图形。

plot3命令的功能及使用方法与plot命令的功能及使用方法类似,它们的区别在于前者绘制出的是三维图形。

plot3命令参数的含义与plot命令的参数含义类似,它们的区别在于前者多了一个 z 方向上的参数。同样,各个参数的取值情况及其操作效果也与plot命令相同。上面给出的plot3命令格式是一种完整的格式,在实际操作中根据各个数据的取值情况可以采用下面简单的书写格式:

plot3(x,y,z)
plot3(x,y,z,option)

选项参数option指明了所绘图中线条的线型、颜色以及各个数据点的表示记号。

plot3命令用以逐点连线的方法来绘制三维折线,当各个数据点的间距较小时,我们也可以使用它来绘制三维曲线。

【例3-10】调用plot3函数绘制一条三维螺旋线。

t=0:pi/50:8*pi;
x=sin(t);
y=cos(t);
z=t;
plot3(x,y,z)

运行结果如图3-10所示。

071-01

图3-10 三维螺旋线图

3.4.3 三维图形坐标标记的命令

MATLAB提供了用于三维图形坐标标记的命令,并提供了用于图形标题说明的语句。这种标记方式的格式是:

【例3-11】调用函数为 x =sin t y =cos t 的三维螺旋线图形添加标题说明。

t=0:pi/50:8*pi;
x=sin(t);
y=cos(t);
z=t;
plot3(x,y,z);
xlabel('sin(t) ');
ylabel('cos(t) ');
zlabel('t');
title('三维螺旋线');

运行结果如图3-11所示。

072-01

图3-11 经标注的三维螺旋线图

3.4.4 三维网格曲面的绘制

三维网格曲面是由一些四边形相互连接在一起所构成的一种曲面,这些四边形的4条边所围成的颜色与图形窗口的背景色相同,并且无色调变化,呈现的是一种线架图的形式。

绘制这种网格曲面时,我们需要知道各个四边形的顶点( x , y , z )坐标值,然后使用MATLAB所提供的网格曲面绘图命令mesh、meshc或meshz来绘制不同形式的网格曲面。

1. 栅格数据点的产生

绘制曲面的一般情况是,先知道四边形各个顶点的二维坐标( x , y ),再利用某个函数公式计算出四边形各个顶点的 z 坐标。这里所使用的( x , y )二维坐标值是一种栅格形的数据点,可由MATLAB所提供的meshgrid产生。meshgrid函数的调用格式为:

[X, Y]=meshgrid(x, y)

表示由向量 x y 值通过复制的方法产生绘制三维图形时所需的栅格数据 X 矩阵和 Y 矩阵。

在调用该函数时,需要说明以下两点:

1)向量 x y 分别代表三维图形在 x 轴、 y 轴方向上的取值数据点。

2) x y 各代表一个向量, X Y 各代表一个矩阵。

【例3-12】调用meshgrid函数绘制矩形网格。

x=-5:0.5:5;
y=5:-0.5:-5;
[X,Y]=meshgrid(x,y);
plot(X,Y,'o')

运行结果如图3-12所示。

073-01

图3-12 矩形网络

2. 网格曲面的绘制函数

在MATLAB中,mesh函数用于绘制三维网格曲面图,该函数的语法格式有以下几种:

mesh(X,Y,Z,C)
mesh(X,Y,Z)
mesh(x,y,Z,C)
mesh(x,y,Z)
mesh(Z,C)
mesh(Z)

上面几种格式都可以绘制出三维网格曲面图,但是各个格式的命令参数含义有些区别,说明如下:

1)在函数调用格式mesh(X,Y,Z,C)和mesh(X,Y,Z)中,参数(X,Y,Z)为矩阵值,并且X矩阵的每一个行向量都是相同的,Y矩阵的每一个列向量也都是相同的;参数C表示网格曲面的颜色分布情况,若省略该参数则表示网格曲面的颜色分布与Z方向上的高度值成正比。

2)在函数调用格式(x,y,Z,C)和mesh(x,y,Z)中,参数x和y为长度分别是 n m 的向量值,而参数Z是维数为 m × n 的矩阵。其实,这种格式的函数调用相当于执行了下面两条语句:

[X,Y]=meshgrid(x,y)
mesh[X,Y,Z,C]

3)在函数调用格式[Z,C]和mesh(Z)中,若参数Z是维数为 m × n 的矩阵,则绘图时的栅格数据点的取法是 x =1: n y =1: m 。其实这种格式的函数调用相当于执行了下面5条语句:

[m,n]=size(Z);
x=1:n;
y=1:m;
[X,Y]=meshgrid(x,y);
mesh(X,Y,Z,C)

【例3-13】在笛卡儿坐标系中绘制函数 074-01 的网格曲面图。

x=-7:0.5:7;
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=sin(R)./R;
mesh(X,Y,Z)
grid on
axis([-10 10 -10 10 -1 1 ])

运行结果如图3-13所示。

074-02

图3-13 函数的网格曲面图

另外,MATLAB中还有两个mesh的派生函数:

1)meshc函数用于在绘图的同时在 x - y 平面上绘制函数的等值线。

2)meshz函数用于在网格图基础上在图形底部的外侧绘制平行 z 轴的边框线。

【例3-14】调用meshc和meshz绘制三维网格图。

close all; clear
[X,Y] = meshgrid(-2:.4:2);
Z = 2*X.^2-3*Y.^2;
subplot(2,2,1)
plot3(X,Y,Z)
subplot(2,2,2)
mesh(X,Y,Z)
subplot(2,2,3)
meshc(X,Y,Z)
subplot(2,2,4)
meshz(X,Y,Z)

运行结果如图3-14所示。

075-01

图3-14 调用meshc和meshz绘制的三维网格图

3. 隐藏线的显示和关闭

显示或不显示的网格曲面的隐藏线将对图形的显示效果有一定的影响。在MATLAB中,hidden函数即为控制隐藏线显示与否的相关命令,该函数的调用格式是:

hidden on          % 去掉网格曲面的隐藏线
hidden off         % 显示网格曲面的隐藏线

3.4.5 三维阴影曲面的绘制

前一节我们绘制的三维曲面中,各个小的曲面片是由四边形组成的,四边形的4条边都绘有某一种颜色,而四边形内部却无填充的颜色(为绘图窗口的底色)。

本节将介绍另外一种三维曲面的表示方法——三维阴影曲面。这种曲面也是由很多个较小的四边形构成的,但是各个四边形的4条边是无色的(为绘图窗口的底色),而四边形内部却填充着不同的颜色,也可认为是各个四边形带有阴影效果。MATLAB提供了3个用于绘制这三类阴影曲面的函数:surf、surfc、furfl。

1. 阴影曲面绘制函数

三维阴影曲面的绘制采用surf函数,该函数的调用格式如下:

surf(X,Y,Z,C)
surf(X,Y,Z)
surf(x,y,Z,C)
surf(x,y,Z)
surf(Z,C)
surf(Z)

调用此种函数时,需要注意以下几点:

1)这6条语句中surf函数与3.4.4节所介绍的6条语句中mesh函数的调用方法及参数含义相同。

2)surf函数与mesh函数的区别是前者绘制的是三维阴影曲面,后者绘制的是三维网格曲面。

3)在surf函数中,各个四边形表面的颜色分布方式可由shading命令来指定:

【例3-15】采用shading faceted命令来设置函数 076-01 的三维阴影曲面效果。

close all; clear
x=-7:0.5:7;
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=2*sin(R)./R;
surf(X,Y,Z)
grid on
axis([-10 10 -10 10 -0.5 2.0])
shading faceted

运行结果如图3-15所示。

076-02

图3-15 截面式颜色分布方式

还可以使用shading interp命令来设置截面式颜色分布方式。

x=-7:0.5:7;
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=2*sin(R)./R;
surf(X,Y,Z)
grid on
axis([-10 10 -10 10 -0.5 2.0])
shading interp

运行结果如图3-16所示。

076-03

图3-16 插补式颜色分布方式

同样,也可以使用shading flat命令来设置插补式颜色分布方式。

x=-7:0.5:7;
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=2*sin(R)./R;
surf(X,Y,Z)
grid on
axis([-10 10 -10 10 -0.5 2.0])
shading flat

运行结果如图3-17所示。

077-01

图3-17 平面式颜色分布方式

2. 绘制带有等高线的阴影曲面

调用surfc函数在XY平面上绘制带有等高线的三维阴影曲面,调用这种函数的格式是:

surfc(X,Y,Z,C)
surfc(X,Y,Z)
surfc(x,y,Z,C)
surfc(x,y,Z)
surfc(Z,C)
surfc(Z)

调用此种函数时,需要注意以下两点:

1)这6条语句中的surfc函数与前面所介绍的6条语句中的surf函数的使用方法及参数含义相同。

2)surfc命令与surf命令的区别是前者除了绘制出三维阴影曲面外,在 xy 坐标平面上还绘制有曲面在 z 轴方向上的等高线,而后者仅绘制出三维阴影曲面。

【例3-16】调用函数surfc为图3-17所示的三维曲面添加等高线。

x=-7:0.5:7;
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=2*sin(R)./R;
surfc(X,Y,Z)
grid on
axis([-10 10 -10 10 -0.5 2.0])

运行结果如图3-18所示。

077-02

图3-18 三维图形等高线

3. 绘制具有光照效果的阴影曲面

MATLAB为用户提供了一种可以绘制具有光照效果的阴影曲面的函数surfl,调用这种函数的格式是:

surfl(X,Y,Z,s)
surfl(X,Y,Z)
surfl(Z,s)
surfl(Z)

使用此函数,需要注意以下几点:

1)上述4条命令中surfl函数与前面介绍的surf函数的使用方法及参数含义类似。

2)surfl函数与surf函数的区别是前者绘制出的三维阴影曲面具有光照效果,而后者绘制出的三维阴影曲面无光照效果。

3)向量参数s表示光源的坐标位置,s=[sx,xy,xz]。注意,若省略s,则表示光源位置设在观测角的反时针45°处,它是默认的光源位置。

【例3-17】调用surfl函数为阴影曲面添加光照效果。

x=-7:0.5:7;
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=2*sin(R)./R;
s=[0 -1 0];
surfl(X,Y,Z)
grid on
axis([-10 10 -10 10 -0.5 2.0])

运行结果如图3-19所示。

078-01

图3-19 阴影曲面添加光照效果图

3.4.6 三维图形的修饰标注

与二维图形一样,我们也可以对三维图形的显示参数进行更改,以控制其显示效果。这里我们主要介绍设置视点位置和坐标轴范围、比例的函数。

1. 设置视点位置

三维图形在不同位置查看会看到不同的侧面和结果,因此设置一个能够查看整个图形最主要特性的视角是非常重要的。

在MATLAB中,可以通过函数或图形旋转工具改变视角,这里介绍通过view在命令行方式下设置图形视角的方法。

【例3-18】调用view函数为三维图形设置视角。

clear; close all
subplot(2,2,1)
ezmesh(@peaks);
view(3);
[a,b]=view;
title(mat2str([a,b]))
subplot(2,2,2)
ezmesh(@peaks);
view(2);
[a,b]=view;
title(mat2str([a,b]))
subplot(2,2,3)
ezmesh(@peaks);
view([30 45]);
[a,b]=view;
title(mat2str([a,b]))
subplot(2,2,4)
ezmesh(@peaks);
view([1 1 sqrt(2)]);
[a,b]=view;
title(mat2str([a,b]))

运行结果如图3-20所示。

079-01

图3-20 设置视角

2. 设置坐标轴

三维图形下坐标轴的设置和二维图形下坐标轴的设置类似,都是通过带参数的axis命令设置坐标轴显示范围和显示比例。

【例3-19】调用函数axis设置坐标轴。

close all
subplot(1,3,1)
ezsurf(@(t,s)(sin(t).*cos(s)),@(t,s)(sin(t).*sin(s)),@(t,s)cos(t),[0,1.5*pi,0,1.5*pi])
axis auto;
title('auto')
subplot(1,3,2)
ezsurf(@(t,s)(sin(t).*cos(s)),@(t,s)(sin(t).*sin(s)),@(t,s)cos(t),[0,1.5*pi,0,1.5*pi])
axis equal;
title('equal')
subplot(1,3,3)
ezsurf(@(t,s)(sin(t).*cos(s)),@(t,s)(sin(t).*sin(s)),@(t,s)cos(t),[0,1.5*pi,0,1.5*pi])
axis square;
title('square')

运行结果如图3-21所示。

080-01

图3-21 设置坐标轴

3.4.7 特殊图形的绘制

除了上述图形之外,很多工程及研究领域还使用其他一些不同类型的特殊二、三维图形,通过这些特殊图形的绘制,可以方便地获悉单个数据在整体数据集中所占的比例、数据点的分布、数据分布的向量信息等。下面将举例说明特殊图形的绘制。

1. 特殊二维图形绘制实例

【例3-20】调用bar和barh函数来绘制垂直和水平直方图。

clear all;
bar(rand(1,10))

运行结果如图3-22所示。

081-01

图3-22 直方图

【例3-21】绘制矩阵直方图。

x=-2:0.1:2;
Y=exp(-x.*x);
barh(x,Y)

运行结果如图3-23所示。

081-02

图3-23 钟型图

【例3-22】调用area函数根据向量或矩阵的各列绘制一个区域图。

X=magic(8);
area(X)

运行结果如图3-24所示。

082-01

图3-24 矩阵的区域图

【例3-23】已知数据的误差值,调用errorbar函数来绘制误差的区域范围。

x=linspace(0,2*pi,30);
y=sin(x);
e=std(y)*ones(size(x)) % 标准差
errorbar(x,y,e)

运行结果如图3-25所示。

082-02

图3-25 误差的区域范围

【例3-24】调用fplot进行较精确的绘图,该函数对数据的剧烈变化处进行较密集的采样。

x=0.02:0.001:0.2;
subplot(121),
plot(x,sin(1./x))
subplot(122),
fplot(@(x)sin(1./x),[0.02 0.2])

运行结果如图3-26所示。

082-03

图3-26 调用fplot精确绘图的结果与调用plot绘图的结果比较

【例3-25】调用polar函数绘制极坐标图。

theta=linspace(0,2*pi);
r=cos(4*theta);
polar(theta,r)

运行结果如图3-27所示。

083-01

图3-27 极坐标图

【例3-26】调用hist函数来显示数据的分布情况。

x=-3:0.1:3;
y=randn(1000,1);
hist(y,x)

运行结果如图3-28所示。

083-02

图3-28 频数累计柱状图

【例3-27】调用rose将数据大小视为角度、数据个数视为距离,并用极坐标绘制出来。

x=randn(1000,1);
rose(x)

运行结果如图3-29所示。

083-03

图3-29 极坐标中的频数累计直方图

【例3-28】调用stairs函数画出阶梯图。

x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
stairs(x,y)

运行结果如图3-30所示。

083-04

图3-30 阶梯图

【例3-29】调用stem函数产生针状图,常用来绘制数字信号。

x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
stem(x,y)

运行结果如图3-31所示。

084-01

图3-31 针状图

【例3-30】调用fill函数将数据点视为多边形顶点,并将此多边形涂上颜色。

x=linspace(0,10,50);
y=sin(x).*exp(-x/3);
fill(x,y,'b')

运行结果如图3-32所示。

084-02

图3-32 填充图

【例3-31】调用feather函数将每一个数据点视为复数,并画出箭头。

theta=linspace(0,2*pi,20);
z=cos(theta)+i*sin(theta);
feather(z)

运行结果如图3-33所示。

084-03

图3-33 羽毛图

【例3-32】调用compass函数作图。

theta=linspace(0,2*pi,20);
z=cos(theta)+i*sin(theta);
compass(z)

运行结果如图3-34所示。

084-04

图3-34 罗盘图

【例3-33】调用scatter(X,Y,S,C)在向量X、Y定义的位置绘制彩色的圆圈标志(X、Y必须大小相同),S定义了每个符号的大小,C定义了每个标记的颜色。

load seamount
scatter(x,y,8,z)

运行结果如图3-35所示。

085-01

图3-35 离散点图

【例3-34】调用pie(X)使用X数据绘制一张饼图,X里的每一个元素被表示为饼图的一张切片。pie (X,explode)可以分离饼图中的某一张切片。

x=[4 3 7 2 1 6 5];
explode=[0 0 0 0 0 1 0];
pie(x,explode)

运行结果如图3-36所示。

085-02

图3-36 饼图

【例3-35】调用quiver函数绘制向量图。

[X,Y]=meshgrid(-1.5:0.15:1.5);
Z=X.*exp(-X.^2-Y.^2);
[DX,DY]=gradient(Z,2,2);
quiver(X,Y,DX,DY)

运行结果如图3-37所示。

086-01

图3-37 函数梯度图

【例3-36】使用命令k=convhull(x,y)绘制凸壳图。

xx=-1.5:0.04:1.5;
yy=abs(sqrt(xx));
[x,y]=pol2cart(xx,yy);
k=convhull(x,y);
plot(x(k), y(k),'r-',x,y,'g*')

运行结果如图3-38所示。

086-02

图3-38 凸壳图

【例3-37】loglog函数的用法。

x=logspace(-2,2);
loglog(x,exp(x),'o');
grid on

运行结果如图3-39所示。

086-03

图3-39 双对数刻度曲线

【例3-38】semilog函数的用法。

x=logspace(-2,0);
y=exp(x);
subplot(121),
semilogx(x,y,'b*');
subplot(122),
semilogy(x,y,'g+')

运行结果如图3-40所示。

086-04

图3-40 半对数刻度曲线图

【例3-39】调用plotyy函数可以产生两个 y 轴,可在同一个图中绘制两组不同的数据或指定一组数据的两种不同显示形式。

//指定一组数据的两种不同显示形式
t=0:pi/30:6;
y=exp(sin(t));
plotyy(t,y,t,y,'plot','stem')
//在同一个图中绘制两组不同的数据
t=0:800;A=900;a=0.004;b=0.004;
z1=A*exp(-a*t);
z2=sin(b*t);
plotyy(t,z1,t,z2,'semilogy','plot')

运行结果如图3-41、图3-42所示。

087-01

图3-41 同一组数据的不同图形显示形式

087-02

图3-42 在同一个图中绘制两组不同的数据

2. 特殊三维图形的绘制实例

【例3-40】调用contour和coutour3函数来绘制等值线图。

[X,Y,Z]=peaks;                  % x,y及z轴的数据由peaks函数定义
subplot(221),
contour(Z,20)
subplot(222),contour(X,Y,Z,20); % 画出peaks的z轴二维等值线图,等值线的数目为20
subplot(223),                   % 画出peaks的二维等值线图,等值线的数目为20
contour3(Z,20);
subplot(224),                   % 画出peaks的z轴三维等值线图
contour3(X,Y,Z,20);             % 画出peaks的三维等值线图

运行结果如图3-43所示。

087-03

图3-43 contour函数和contour3函数之绘图比较

【例3-41】调用slice函数来绘制立体空间的正交切片图。

[x,y,z]=meshgrid(-2:.2:2,-2:.2:2,-2:.2:2);
v=x.*exp(-x.^2-y.^2-z.^2);
slice(v,[4 14 21],21,[1 10]);
axis([0 21 0 21 0 21])
colormap(jet)

运行结果如图3-44所示。

088-01

图3-44 切片图

【例3-42】调用quiver3函数绘制三维向量场图。

[X,Y]=meshgrid(-1.5:0.25:1.5,-1:0.2:1);
Z=X.*exp(-X.^2-Y.^2);
[U,V,W]=surfnorm(X,Y,Z);    % 空间表面的法线
quiver3(X,Y,Z,U,V,W,0.5);
hold on;
surf(X,Y,Z);
colormap hsv;
view(-35,45);
axis([-2 2 -1 1 -0.6 0.6]);
hold off

运行结果如图3-45所示。

088-02

图3-45 一个函数的法向表面

【例3-43】调用cylinder函数绘制柱面图。

t=0:pi/10:2*pi;
[X,Y,Z]=cylinder(1.5+cos(t));
surf(X,Y,Z);
axis square

运行结果如图3-46所示。

089-01

图3-46 母线是曲面的柱面图

【例3-44】调用bar3函数绘制三维垂直和水平直方图。

Y=cool(9);     % Y是由冷色图生成的9×3矩阵
bar3(Y)

运行结果如图3-47所示。

089-02

图3-47 三维垂直直方图

【例3-45】调用meshz函数将曲面加上围裙。

[x,y,z]=peaks;
meshz(x,y,z);
axis([-inf inf -inf inf -inf inf])

运行结果如图3-48所示。

089-03

图3-48 给peaks图加围裙

【例3-46】调用waterfall函数在 x 方向或 y 方向产生水流效果。

[x,y,z]=peaks;
waterfall(x,y,z);
axis([-inf inf -inf inf -inf inf])

运行结果如图3-49所示。

089-04

图3-49 水流效果

【例3-47】调用meshc函数画出网状图与等高线。

[x,y,z]=peaks;
meshc(x,y,z);
axis([-inf inf -inf inf -inf inf])

运行结果如图3-50所示。

090-01

图3-50 同时画出网状图与等高线

【例3-48】调用surf函数画出曲面图与等高线。

[x,y,z]=peaks;
surfc(x,y,z);
axis([-inf inf -inf inf -inf inf])

运行结果如图3-51所示。

090-02

图3-51 同时画出曲面图与等高线

【例3-49】图形的透视。

[X0,Y0,Z0]=sphere(40);          % 产生单位球面的三维坐标
x=2*X0;                         % 产生半径为2的球面的三维坐标
y=2*Y0;
z=2*Z0;
clf,surf(X0,Y0,Z0);             % 画单位球面
shading interp;                 % 采用插补明暗处理
hold on
mesh(x,y,z);
colormap(hot);
hold off;                       % 采用hot色彩
hidden off;                     % 产生透视效果
axis equal;
axis off;                       % 不显示坐标轴

运行结果如图3-52所示。

091-01

图3-52 透视球

【例3-50】使用“非数”NaN对图形进行裁切处理。

clf;
t=linspace(0,2*pi,90);
r=1-exp(-t/2).*cos(4*t);        % 旋转母线
[X,Y,Z]=cylinder(r,60);         % 产生旋转柱面数据
ii=find(X<0&Y<0);               % 确定x-y平面第四象限上的数据下标
Z(ii)=NaN;                      % 剪切
surf(X,Y,Z);
colormap(spring);
shading interp;
light('position',[-3,-1,3],'style','local');    % 设置光源
material([0.5,0.4,0.3,10,0.3]);                 % 设置表面反射

运行结果如图3-53所示。

091-02

图3-53 剪切四分之一后的图形

【例3-51】使用“非数”NaN对图形进行裁切处理。

P=peaks(40);
P(18:20,9:15)=NaN;    % 镂空
surfc(P);
colormap(summer);
light('position',[50,-10,5]),lighting flat;
material([0.9,0.9,0.6,15,0.4]);

运行结果如图3-54所示。

091-03

图3-54 镂方孔的曲面

【例3-52】图形的裁切。

clf,x=[-7:0.2:7];
y=x;
[X,Y]=meshgrid(x,y);
ZZ=X.^2-Y.^2;
ii=find(abs(X)>5|abs(Y)>5);     % 确定超出[-5,5]范围的格点下标
ZZ(ii)=zeros(size(ii));         % 强制为0
surf(X,Y,ZZ);
shading interp;
colormap(copper);
light('position',[0,15,1]);
lighting phong;
material([0.8 0.8 0.5 10 0.5])

运行结果如图3-55所示。

091-04

图3-55 经裁切处理后的图形

【例3-53】利用色彩表现函数的特征,即图形的思维表示。当三维网线图、曲面图的第四个输入参数取一些特殊矩阵时,色彩就能表现或加强函数的某个特征,如梯度、曲率、方向导数等。

clear;
x=3*pi*(-1.2:1.2/15:1.2);
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=sin(R)./R;
[dzdx,dzdy]=gradient(Z);
dzdr=sqrt(dzdx.^2+dzdy.^2);     % 计算对r的导数
dz2=del2(Z);                    % 计算曲率
subplot(121),surf(X,Y,Z);
title(' surf(X,Y,Z)');
shading faceted;
colorbar('horiz'),brighten(0.2);
subplot(122),surf(X,Y,Z,R);
title(' surf(X,Y,Z,R)');
shading faceted;
colorbar('horiz');
figure(2)
subplot(121),surf(X,Y,Z,dzdx);
shading faceted;
colorbar('horiz'),brighten(0.1);
title('surf(X,Y,Z,dzdx)');
subplot(122),surf(X,Y,Z,dzdx);
shading faceted;
colorbar('horiz');
title(' surf(X,Y,Z,dzdy)');
figure(3)
subplot(121),surf(X,Y,Z,abs(dzdr));
shading faceted;
colorbar('horiz'),brighten(0.6);
title('surf(X,Y,Z,abs(dzdr))');
subplot(122),surf(X,Y,Z,abs(dz2));
shading faceted;
colorbar('horiz');
title(' surf(X,Y,Z,abs(dz2))');

运行结果分别如图3-56、图3-57和图3-58所示。

092-01

图3-56 色彩分别表现函数的高度和半径特征

093-01

图3-57 色彩分别表示函数的 x 方向和 y 方向导数特征

093-02

图3-58 色彩分别表示函数的径向导数和曲率特征

【例3-54】彗星状轨迹图。

shg;n=12;
t=n*pi*(0:0.0006:1);
x=sin(t);y=cos(t);
plot(x,y,'g');
axis square;
hold on
comet(x,y,0.01);
hold off

运行结果如图3-59所示。

094-01

图3-59 彗星状轨迹图

【例3-55】使用卫星返回地球的运动轨迹。

shg;R0=1;                       % 地球半径为一个单位
a=12*R0;
b=9*R0;
T0=2*pi;                        % T0是轨道周期
T=5*T0;
dt=pi/100;
t=[0:dt:T]';
f=sqrt(a^2-b^2);                % 地球与另一个焦点的距离
th=12.5*pi/180;                 % 卫星轨道与x-y平面的倾角
E=exp(-t/20);                   % 轨道收缩率
x=E.*(a*cos(t)-f);
y=E.*(b*cos(th)*sin(t));
z=E.*(b*sin(th)*sin(t));
plot3(x,y,z,'g');               % 画全程轨迹
[X,Y,Z]=sphere(30);
X=R0*X;Y=R0*Y;Z=R0*Z;           % 获得单位球坐标
grid on,hold on;
surf(X,Y,Z),shading interp;     % 画地球
x1=-18*R0;X2=6*R0;              % 确定坐标范围
y1=-12*R0;y2=12*R0;
z1=-6*R0;z2=6*R0;
view ([115 35]),                % 设置视角和画运动线
comet3(x,y,z,0.02),
hold off

运行结果如图3-60所示。

094-02

图3-60 卫星返回地球轨线示意图

【例3-56】调用rotate函数使图形旋转。

shg;clf;
[X,Y]=meshgrid([-2:.2:2]);
Z=4*X.*exp(-X.^2-Y.^2);
G=gradient(Z);
subplot(121),
surf(X,Y,Z,G);
subplot(122),
h=surf(X,Y,Z,G);
rotate(h,[-2,-2,0],30,[2,2,0]),   % 使图形旋转
colormap(jet)

运行结果如图3-61所示。

095-01

图3-61 图形对象的旋转 zLxsAlVoLi2rX8frjzL10DhpDF61yKqG2zJv2VfprtkQV2vW8qGw1fYAu5NgGMMb

点击中间区域
呼出菜单
上一章
目录
下一章
×