第六讲 MATLAB可视化(二)绘三维图
【目录】
一、三维图形绘制步骤    1
二、三维绘图基本操作    2
1、三维线图    2
2、三维网线图    3
3、三维曲面图    4
三、透视、镂空和裁切    5
1、图形的透视    5
2、图形的镂空    6
3、图形的裁切    7
四、三维图形的精细控制    8
1、视点与旋动    8
2、彩控制    9
3、浓淡处理    11
五、照明和材质处理    12
六、简洁绘图指令    13
【正文】
一、三维图形绘制步骤
步骤
典型指令
1
三维曲线数据:先取一个参变量采样向量然后计算各坐标数据向量
t=pi*(0:100)/100;
x=f1(t);y=f2(t);z=f3(t);
三维曲面数据:产生自变量采样向量;由自变量向量产生格点矩阵;计算格点矩阵相对应的函数值矩阵
x=x1:dx:x2;y=y1:dy:y2;
[X,Y]=meshgrid(x,y);
Z=f(x,y);
2
选定图形窗及子窗位置:
同二维
3
调用三维曲线绘图指令:线型、彩、数据点形
plot3(x,y,z,'b-')
调用三维曲面绘图指令
Mesh(X,Y,Z);
4
matlab等高线填充颜
设置轴的范围与刻度、坐标分隔线
同二维
5
图形注释:图名、坐标名、图例、文字
同二维
6
着、明暗、灯光、材质处理
colormap,shading,light,material
7
视点、三度(横、纵、高)比
view,aspect
二、三维绘图基本操作
1、三维线图
用来画三维曲线,三维曲线与一组(x,y,z)坐标相对应的点连接而成。绘图格式为:
plot3(X,Y,Z,'s')
plot3(X1,Y1,Z1,'s1',X2,Y2,Z2,'s2',...)
(1) X、Y、Z是同维向量时,则绘制以X、Y、Z元素为x、y、z坐标的三维曲线;
(2) X、Y、Z是同维矩阵时,则以X、Y、Z对应列元素为x、y、z坐标绘制多条曲线,曲线条数等于矩阵的列数;
(3) (X1,Y1,Z1,'s1')与(X2,Y2,Z2,'s2')的结构与作用和(X,Y, Z,'s')相同,表示同一指令绘两组以上曲线;
(4) s、s1、s2的意义与二维相同。
【例】绘单条三维曲线
t=(0:0.02:2)*pi;                % 三维坐标用参数方程表示
x=sin(t);y=cos(t);z=cos(2*t);    % t为参数,得到三个同维向量
plot3(x,y,z,'b-',x,y,z,'bd');    % 绘蓝线和菱形的点
view([-82,58]);                  % 选择观察点
box on;                          % 显示坐标框
legend('链','宝石')              % 图例 
【例】绘多条三维曲线
t=(0:0.02:2)'.*pi;              % 三维坐标用参数方程表示
x=sin(t);y=cos(t);z=cos(2*t);    % t为参数,得到三个同维向量
r=0.1:0.1:1;                    % 画系数不同的10条曲线
x=x*r;y=y*r;z=z*r;
plot3(x,y,z);
view([-82,58]);box on; 
2、三维网线图
以网格的形式显示三维图形。通常使用方形网格,所以网格上的每一格点必需有一三维坐标(x,y,z)与之相对应。绘图指令如下:
(1) mesh(Z)-以矩阵Z的列下标为x、行下标为y、矩阵的元素为z组成三维网格数据绘制网线图;
(2) mesh(X,Y,Z)-X、Y、Z是同维矩阵,分别以三个矩阵对应位置的元素x、y、z组成三维网格数据绘制网线图;
(3) mesh(X,Y,Z,C)-C为与其他三个矩阵同维,给出每个格点的用矩阵。缺省时C=Z。(表说明见后)
其中,画z=f(x,y)所代表的网格数据产生如下:
(1) x=x1:dx:x2;y=y1:dy:y2;
    X=ones(size(y))*x;
    Y=y*ones(size(x));
(2) x=x1:dx:x2;y=y1:dy:y2;
    [X,Y]=meshgrid(x,y);
然后根据函数求出Z矩阵。
【例】用网线图表现函数
clf;                  % 清图形窗口
x=-4:4;y=x;          % x、y的取值范围都是-4到4
[X,Y]=meshgrid(x,y);  % 形成采样点矩阵
Z=X.^2+Y.^2;          % 计算函数值
mesh(X,Y,Z);          % 绘网格图
colormap(hot);        % 选用图
 
3、三维曲面图
将网线图的网格填,形成曲面图。格式为:
surf(Z)、surf(X,Y,Z)、surf(X,Y,Z,C)。含义同网线图。
【例】用曲面图表现函数
clf;x=-4:4;y=x;
[X,Y]=meshgrid(x,y);
Z=X.^2+Y.^2;
surf(X,Y,Z);
colormap(hot); 
 
三、透视、镂空和裁切
1、图形的透视
Matlab在绘三维网线图和曲面图时,一般进行消隐处理。为得到透视效果,用以下命令:
hidden off -透视被遮挡的图形
hidden on  -消隐被遮挡的图形
【例】透视效果演示
[X0,Y0,Z0]=sphere(30);    % 产生单位球面的三维坐标
X=2*X0;Y=2*Y0;Z=2*Z0;    % 产生半径为2的球面坐标
surf(X0,Y0,Z0);          % 画单位球面
shading interp            % 对球的着进行浓淡细化处理
hold on;                % 绘图保持
mesh(X,Y,Z)              % 绘大球
colormap(hot);            % 定义表
hold off                  % 取消绘图保持
hidden off                % 产生透视效果
axis equal,axis off      % 坐标等轴并隐藏 
 
2、图形的镂空
利用非数(NaN)对图形的剪切处理。
【例】演示利用NaN对图形剪切
t=linspace(0,2*pi,100);        % 产生参数
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])                % 设置表面反射
 
【例】演示利用NaN对图形镂空
P=peaks(30);              % Matlab提供的一个典型三维函数
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、图形的裁切
镂空处理不能产生切面,为看清图形需要切的表面,把被切部分强制为○。
【例】表现切面
clf;x=[-8:0.05:8];y=x;[X,Y]=meshgrid(x,y); % 产生格点数据
ZZ=X.^2-Y.^2;                              % 计算函数值
ii=find(abs(X)>6|abs(Y)>6);  % 确定超出[-6,6]范围的格点下标
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])
 
四、三维图形的精细控制
1、视点与旋动
(1) 视点,即观察点,如下图所示。
Matlab控制视点的命令为:
view([az,el])-通过方位角az、俯仰角el来设置视点,单位是度。(二维图缺省为0、90度。三维缺省为37.5、30度)
view([vx,vy,vz])-通过视点的直角坐标点来设定。
(2) 图形的旋动即图形的旋转,命令为:
rotate(h,direction,alpha,orgin),其中:
h-被旋转的对象;
direction-方向轴,可用球坐标[theta,phi]或直角坐标[x,y,z]表示;
alpha-按右手法则旋转的角度;
orgin-支点。
【例】旋转指令示例
shg;clf;                      % 图形窗口置前,清除
[X,Y]=meshgrid([-2:.2:2]);    % 取格点坐标
Z=4*X.*exp(-X.^2-Y.^2);        % 计算函数值