《MATLAB图像处理375例》——2.2 三维绘图

2.2 三维绘图

MATLAB图像处理375例
在MATLAB中,三维绘图的基本流程包括以下9个步骤。

(1)数据准备。

(2)图形窗口和绘图区选择。

(3)绘图。

(4)设置视角。

(5)设置颜色表。

(6)设置光照效果。

(7)设置坐标轴刻度和比例。

(8)标注图形。

(9)保存、打印或导出。

下面我们将根据绘制三维图形的基本流程,分别介绍创建图形的各种函数。

2.2.1 三维折线及曲线的绘制
在MATLAB中,plot3命令的功能及使用方法与plot命令的功能及使用方法类似,区别在于前者绘制出的是三维图形。该函数的调用方法如下。

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

其中,选项参数option指明了所绘图中线条的线性、颜色以及各个数据点的表示记号。plot3命令使用的是以逐点连线的方法来绘制三维折线的,当各个数据点的间距较小时,我们也可利用它来绘制三维曲线。

【例2-34】利用plot3函数绘制一条三维螺旋线。

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

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

2.2.2 三维图形坐标标记的函数
MATLAB也提供了3条用于三维图形坐标标记的函数,并提供了用于图形标题说明的语句。这些函数的调用方法如下。

(1)xlabel(str):将字符串str水平放置于x轴。

(2)ylabel(str):将字符串str水平放置于y轴。

(3)zlabel(str):将字符串str水平放置于z轴。

(4)title(str):将字符串str水平放置于图形的顶部。

【例2-35】利用函数为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('三维螺旋线');
运行结果如图2-36所示。

2.2.3 三维网格曲面的绘制
三维网格曲面是由一些四边形相互连接在一起所构成的一种曲面,这些四边形的4条边所围成的颜色与图形窗口的背景色相同,并且无色调的变化,呈现的是一种线架图的形式。在MATLAB中,mesh函数用于绘制三维网格曲面图;hidden函数用于隐藏线的显示和关闭。这些函数的调用方法如下。

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

其中,在命令格式mesh(X,Y,Z,C )和mesh(X,Y,Z )中,参数X,Y,Z 都为矩阵值,并且X 矩阵的每一个行向量都是相同的,Y 矩阵的每一个列向量也都是相同的。参数C 表示网格曲面的颜色分布情况,若省略该参数则表示网格曲面的颜色分布与Z 方向上的高度值成正比;在命令格式(x,y,Z,C )和mesh(x,y,Z )中,参数x 和y 为长度分别是n 和m 的向量值,而参数Z 是维数为m×n 的矩阵;在命令格式[Z,C]和mesh(Z)中,若参数Z是维数为m×n的矩阵,则绘图时的栅格数据点的取法是x=1﹕n和y=1﹕m。

hidden on
表示去掉网格曲面的隐藏线;

【例2-36】在笛卡儿坐标系中绘制函数的网格曲面图。

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

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

MATLAB中还有两个mesh的派生函数:meshc函数用于在绘图的同时,在x-y平面上绘制函数的等值线;meshz函数则用于在网格图基础上在图形的底部外侧绘制平行z轴的边框线。

【例2-37】利用meshc和meshz绘制三维网格图。

close all
clear
[X,Y] = meshgrid(-2:.4:2);
Z = 2X.^2-3Y.^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)

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

2.2.4 三维阴影曲面的绘制
三维阴影曲面也是由很多个较小的四边形构成的,但是各个四条边是无色的(即为绘图窗口的底色),其内部却分布着不同的颜色,也可认为是各个四边形带有阴影效果。

MATLAB提供了3条用于绘制这种三类阴影曲面的命令:surf函数用于基本的三维阴影曲面的绘制;surfc函数用于基本的三维阴影曲面的绘制;surfl函数用于绘制具有光照效果的阴影曲面绘制。这些函数的调用方法如下。

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

其中,surf命令与mesh命令的使用方法及参数含义相同。surf命令与mesh命令的区别是前者绘制的是三维阴影曲面,而后者绘制的是三维网格曲面。在surf命令中,各个四边形表面的颜色分布方式可由shading命令来指明。

(1)shading faceted:表示截面式颜色分布方式。

(2)shading interp:表示插补式颜色分布方式。

(3)shading flat:表示平面式颜色分布方式。

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

其中,surfc命令与surf命令的使用方法及参数含义相同;surfc命令与surf命令的区别是前者除了绘制出三维阴影曲面外,在xy坐标平面上还绘制有曲面在z轴方向上的等高线,而后者仅绘制出三维阴影曲面。

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

其中,这4种surfl命令与前面介绍的surf命令的使用方法及参数含义相类似;surfl命令与surf命令的区别是前者绘制出的三维阴影曲面具有光照效果,而后者绘制出的三维阴影曲面无光照效果;向量参数s 表示光源的坐标位置,s =[sx,xy,xz]。注意,若省略s,则表示光源位置设在观测角的反时针45°处,它是默认的光源位置。

【例2-38】采用shading faceted函数来设置函数的三维阴影曲面效果。

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

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

【例2-39】利用shading interp函数来设置。

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

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

【例2-40】利用shading flat来设置起到相应的效果。

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

运行结果如图2-41所示。

【例2-41】利用函数surfc为三维曲面添加等高线。

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

运行结果如图2-42所示。

【例2-42】利用surfl函数为阴影曲面添加光照效果。

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

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

2.2.5 三维图形的修饰与标注
与二维图形一样,我们也可以对三维图形的显示参数进行更改,以控制其显示效果。在MATLAB中view函数用于改变图形的视角;三维图形下坐标轴的设置和二维图形下类似,都是通过带参数的axis命令设置坐标轴显示范围和显示比例。这些函数的调用方法如下。

view():改变图形的视角。

view(az,el):az和el分别表示方位角和俯视角。

axis([xmin xmax ymin ymax zmin zmax]):表示设置三维图形的显示范围,数组元素分别确定了每一坐标轴显示的最大、最小值。

axis auto:表示根据x,y,z的范围自动确定坐标轴的显示范围。

axis manual:表示锁定当前坐标轴的显示范围,除非手动进行修改。

axis tight:表示设置坐标轴显示范围为数据所在范围。

axis equal:表示设置各坐标轴的单位刻度长度等长显示。

axis square:表示将当前坐标范围显示在正方形(或正方体)内。

axis vis3d:表示锁定坐标轴比例不随对三维图形的旋转而改变。

【例2-43】设置三维图形的视角效果。

clear all;
x=-5:0.5:5;
[x,y]=meshgrid(x);
z=sin(x)-cos(y);
subplot(2,2,1);
surf(x,y,z);
view(38,32);
title ('视角为(38,32)')
subplot(2,2,2);
surf(x,y,z);
view(38+90,32);
title('视角为(38+90,32)')
subplot(2,2,3);
surf(x,y,z);
view(38,32+30);
title ('视角为(38,32+30)')
subplot(2,2,4);
surf(x,y,z);
view(180,0)
title('视角为(180,0)')

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

【例2-44】使用函数axis设置坐标轴。

close all
subplot(131)
ezsurf(@(t,s)(log(t).log(s)),@(t,s)(log(t).log(s)),@(t,s)log(t),[0,1.5pi,0,1.5pi])
axis auto;
title('auto')
subplot(132)
ezsurf(@(t,s)(log(t).log(s)),@(t,s)(log(t).log(s)),@(t,s)log(t),[0,1.5pi,0,1.5pi])
axis equal;
title('equal')
subplot(133)
ezsurf(@(t,s)(log(t).log(s)),@(t,s)(log(t).log(s)),@(t,s)log(t),[0,1.5pi,0,1.5pi])
axis square;
title('square')

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

2.2.6 特殊三维图形的绘制实例
与二维图形一样,特殊三维图形的绘制也是十分重要的,下面举例介绍三维图像绘制的方法。

【例2-45】利用指令contour、coutour3来绘制等值线图。

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

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

【例2-46】利用slice函数来绘制立体空间的正交切片图。

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

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

【例2-47】利用quiver3函数绘制三维向量场图。

[X,Y]=meshgrid(-1.5:0.25:1.5,-1:0.2:1);
Z=X.*exp(-X-Y);
[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(-45,60);
axis([-3 3 -1 1 -0.6 0.6]);
hold off

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

【例2-48】利用cylinder函数绘制柱面图。

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

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

【例2-49】利用bar3函数绘制三维垂直直方图。

Y=cool(8);   %Y是由冷色图生成的83矩阵
bar3(Y)

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

【例2-50】利用meshz函数将曲面加上围裙。

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

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

【例2-51】利用waterfall函数在x方向或y方向产生水流效果。

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

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

【例2-52】利用meshc函数画出网状图与等高线。

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

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

【例2-53】利用surfc函数画出曲面图与等高线。

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

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

【例2-54】将生成的图形进行透视。

[X0,Y0,Z0]=sphere(45);     %产生单位球面的三维坐标
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);

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

【例2-55】利用“非数”NaN对图形进行裁切处理。

clf;
t=linspace(0,2*pi,90);
r=1-exp(-t/2).tan(4t);       %旋转母线
[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]);           %设置表面反射

运行结果如图2-56所示。

【例2-56】利用“非数”NaN对图形进行裁切处理。

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

运行结果如图2-57所示。

【例2-57】对创建的图形进行裁切。

clf,x=[-7:0.3:7];
y=x;
[X,Y]=meshgrid(x,y);
ZZ=X-Y;
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.3 0.3 0.5 11 0.5])

运行结果如图2-58所示。

【例2-58】绘制彗星状轨迹图。

shg;n=16;
t=npi(0:0.0004:1);
x=sin(t);y=cos(t);
plot(x,y,'g');
axis square;
hold on
comet(x,y,0.01);
hold off

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

【例2-59】利用卫星返回地球的运动轨迹。

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.(asin(t)-f);
y=E.(bsin(th)*cos(t));
z=E.(bcos(th)*cos(t));
plot3(x,y,z,'g');       %画全程轨迹
[X,Y,Z]=sphere(30);
X=R0X;Y=R0Y;Z=R0*Z;     %获得单位球坐标
grid on,hold on;
surf(X,Y,Z),shading interp;  %画地球
x1=-18R0;X2=6R0;      %确定坐标范围
y1=-12R0;y2=12R0;
z1=-6R0;z2=6R0;
view ([45 85]),         %设视角、画运动线
comet3(x,y,z,0.02),
hold off

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

【例2-60】利用rotate函数使图形旋转。

shg;clf;
[X,Y]=meshgrid([-2:.2:2]);
Z=3* 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],20,[2,2,0]),  %使图形旋转
colormap(jet)

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

时间: 2024-12-02 20:02:53

《MATLAB图像处理375例》——2.2 三维绘图的相关文章

《MATLAB图像处理375例》——第2章 MATLAB图形的可视化 2.1 二维绘图

第2章 MATLAB图形的可视化 MATLAB图像处理375例数据可视化是MATLAB一项重要的功能.MATLAB所提供的丰富绘图功能,使得工程科研人员从繁琐的绘图细节中脱离出来,并专注于最关心的本质.通过数据可视化的方法,工程科研人员可以对样本数据的分布.趋势特性有一个直观的了解. 2.1 二维绘图 MATLAB图像处理375例在MATLAB中绘制二维图形,通常采用以下步骤. (1)准备数据. (2)设置当前绘图区. (3)绘制图形. (4)设置图形中曲线和标记点格式. (5)设置坐标轴和网格

《MATLAB图像处理375例》——1.5 数组与矩阵

1.5 数组与矩阵 MATLAB图像处理375例 数值数组(简称为数组)是MATLAB中最重要的一种内建数据类型,是MATLAB软件定义的运算规则,其目的是为了数据管理方便.操作简单.指令形式自然和执行计算的有效. 1.5.1 数组的创建与操作 行数组:n个元素排成一行,又称为行向量. 列数组:m个元素排成一列,又称为列向量. 用方括号[ ]创建一维数组就是将整个数组放在方括号里,行数组元素用空格或逗号分隔,列数组元素用分号分隔,标点符号一定要在英文状态下输入. [例1-3]创建数组示例. cl

《MATLAB图像处理375例》——2.3 小结

2.3 小结 MATLAB图像处理375例本章主要介绍了MATLAB绘图的流程.函数.工具.图形修饰的方法,以及特殊坐标轴的绘制和多种特殊绘图函数,并给出了大量的示例来阐述其在MATLAB中的实现方法.本章的例子只用到了最简单.最基本.也是最经典的绘图函数和标注函数,希望读者通过学习,仔细阅读体会,最好自己实践一番,这样可以熟悉和掌握各方法的基本思想.

《MATLAB图像处理375例》——1.4 MATLAB工作环境

1.4 MATLAB工作环境 MATLAB图像处理375例MATLAB各种操作命令都是由命令窗口开始,用户可以在命令窗口中输入MATLAB命令,实现其相应的功能. 1.4.1 命令行窗口启动MATLAB,单击MATLAB图标,进入到用户界面,此命令行窗口主要包括文本的编辑区域和菜单栏.在命令行窗口中,用户可以输入变量.函数及表达式等,回车之后系统即可执行相应的操作.例如: Y=1:10 sum(Y) Y = 1 2 3 4 5 6 7 8 9 10 ans = 55 以上的代码是求出1-10这1

《MATLAB图像处理375例》——第1章 数字图像与MATLAB基础 1.1 数字图像处理简介

第1章 数字图像与MATLAB基础 图像是客观对象的一种相似性的.生动性的描述或写真,是人类社会活动中最常用的信息载体.或者说图像是客观对象的一种表示,它包含了被描述对象的有关信息,是人们最主要的信息源. 1.1 数字图像处理简介 MATLAB图像处理375例 数字图像处理(Digital Image Processing)是通过计算机对图像进行去除噪声.增强.复原.分割.提取特征等处理的方法和技术. 1.1.1 什么是数字图像 图像有多种含义,其中最常见的定义是指各种图形和影像的总称.在理科的

《MATLAB图像处理375例》——1.2 数字图像处理的研究内容

1.2 数字图像处理的研究内容 MATLAB图像处理375例 数字图像处理主要研究的内容有以下几方面. 1.2.1 图像变换 由于图像阵列很大,直接在空间域中进行处理,涉及计算量很大,因此往往采用各种图像变换的方法,如傅里叶变换.沃尔什变换.离散余弦变换等间接处理技术,将空间域的处理转换为变换域处理,不但可减少计算量,而且可获得更有效的处理(如傅里叶变换可在频域中进行数字滤波处理). 目前新兴研究的小波变换在时域和频域中都具有良好的局部化特性,在图像处理中也有着广泛而有效的应用.对添加噪声的图像

《MATLAB图像处理375例》——1.8 MATLAB程序流程控制结构

1.8 MATLAB程序流程控制结构 MATLAB图像处理375例 作为计算机语言,编程是必需的,编程靠的是程序控制语句.计算机语言程序控制模式主要有三大类:顺序结构.选择结构和循环结构.这一点MATLAB与其他编程语言完全一致. 1.8.1 顺序结构 顺序结构是指所有组成程序源代码的语句按照由上至下的次序依次执行,直到程序的最后一个语句.这种程序的优点是容易编制:缺点是结构单一,能够实现的功能有限. 在MATLAB语言的函数中,变量主要有输入变量.输出变量及函数内所使用的变量. (1)数据输入

《MATLAB图像处理375例》——1.7 字符串

1.7 字符串 MATLAB图像处理375例 字符串或串(String)是由数字.字母.下划线组成的一串字符.字符串在数据的可视化.应用程序的交互方面起到非常重要的作用,创建字符串时需要使用单引号将字符串的内容包括起来,字符串一般以行向量形式存在,并且每一个字符占用两个字节的内存. 1.7.1 创建字符串 [例1-47]创建字符串时,只要将字符串的内容用单引号包括起来即可,例如: a=126 class(a) size(a) b='125' class(b) size(b) 运行结果如下: a

《MATLAB图像处理375例》——1.10 小结

1.10 小结 MATLAB图像处理375例 本章首先介绍了MATLAB的产生和发展历程及其特点.接着讲述了桌面操作结构.变量及表达式.符号运算,以及MATLAB的基本数据结构.最后介绍了程序流程控制语句和查询帮助命令.希望读者仔细阅读,对MATLAB图像处理有一个轮廓性的大致了解,为后面核心技术与工程应用的学习做好铺垫.