2.2 三维图形绘制

科学研究和工程应用中常需要对三维数据进行科学分析,二维图形表征不了三维数据,需要三维图形来直观显示三维数据之间的关系。

2.2.1 plot3——绘制三维图

【功能】 以向量或矩阵x,y,z为坐标,绘制三维曲线。plot3功能类似于二维绘图工具plot。

【语法介绍】

● plot3(x,y,z) 绘制一条通过坐标为(x(i),y(i),z(i))的点的线。其中,参量x,y,z为3个具有相同长度的向量。

● plot3(X,Y,Z) 绘制多条由矩阵参量 X,Y,Z 各列所指定的线,其中,X,Y,Z 维数相同。

● plot3(X,Y,Z,LineSpec) 绘制由参量LineSpec指定线条的线型、标记符号和颜色的三维曲线。参量LineSpec的取值参见表2.1。

● plot3(x1,y1,z1,x2,y2,z2,…) 同时绘制多条三维曲线(x1,y1,z1),(x2,y2,z2),…。

● plot3(...,'PropertyName',PropertyValue,...) 绘制三维曲线图,并设置图形对象属性propertyname的值为propertyvalue。

● h=plot3(...) 返回图形窗口中曲线或曲线簇的句柄给向量h。其中,一个句柄对应一条曲线。

【实例1】 绘制三维曲线图。

            >> t = 0:pi/50:10*pi;
            plot3(sin(t),cos(t),t)           %绘制三维曲线图,如图2.60所示
            grid on                          %添加网格
            axis square                      %设置坐标轴

图2.60 绘制三维曲线图

【实例2】 绘制三维曲线簇。

            >> %创建三维曲线簇
            t = 0:pi/50:10*pi;
            for (i=1:3)
            X(:,i)=t;
            Y(:,i)=sin(t+i/3*pi);
            Z(:,i)=cos(t+i/3*pi);
            end
            plot3(X,Y,Z)                    %绘制三维曲线图,如图2.61所示
            grid on                         %添加网格
            axis square                     %设置坐标轴

图2.61 绘制三维曲线簇

2.2.2 surf——绘制三维阴影曲面图

【功能】 在矩形区域内显示三维带阴影的曲面图。

【语法介绍】

● surf(X,Y,Z) 绘制三维网状表面图,此时网状表面的颜色与高度成正比。参量X、Y、Z表示曲面坐标,为同型矩阵或X、Y为向量,Z为矩阵。X、Y、Z为同型矩阵时,曲面坐标为(X(i,j),Y(i,j),Z(i,j));X、Y为向量,Z为矩阵时,向量X的长度为Z的列数,向量Y的长度为Z的行数,曲面坐标为(X(j),Y(i),Z(i,j))。

● surf(X,Y,Z,C) 绘制指定的带颜色参数的网状表面图。参量C为矩阵,与Z维数相同,表示颜色矩阵。其他参量及意义同上。

● surf(Z)及surf(Z,C) 等价于surf(1:n,1:m,Z)及surf(1:n,1:m,Z,C),其中,m和n分别为矩阵Z的行数和列数。

● surf(…,'PropertyName',PropertyValue) 设置图形对象属性 PropertyName 的值PropertyValue,并绘制三维网状表面图。

● surf(axes_handles,...) 在句柄为axes_handle的轴上绘制三维带阴影的曲面图。

● H=surf(…) 返回一个surface图形对象句柄给向量H。

【实例1】 绘制三维带阴影的曲面图。

        >>[X,Y,Z]=peaks(30);        %创建函数
        surfc(X,Y,Z)                %绘制三维带阴影的曲面图,如图2.62所示
        colormap hsv                %设置颜色表
        axis([-3 3-3 3-10 5])       %标定坐标轴

图2.62 绘制三维带阴影的曲面图

【实例2】 用hadamard矩阵绘制球面图。

        >> k = 5;
        n = 2^k-1;
        [x,y,z] = sphere(n);
        c=hadamard(2^k);                      %创建球面函数
        surf(x,y,z,c);                        %绘制球面图,如图2.63所示
        colormap([1  1  0;0  1  1])           %设置颜色表
        axis equal                            %标定坐标轴

图2.63 绘制球面图

2.2.3 mesh——绘制参数网状表面图

【功能】 绘制由X,Y,Z指定的网线面。三维曲面网格图的最大优点是较好地解决了试验数据在三维空间的可视化问题。

【语法介绍】 函数使用方法与2.2.2节的surf函数相同。

● mesh (X,Y,Z)

● mesh (X,Y,Z,C)

● mesh(Z)及mesh(Z,C)

● mesh(…,'PropertyName',PropertyValue)

● mesh (axes_handles,...)

● H=mesh(…)

【实例1】 绘制三维曲面网格图。

            >> [X,Y] = meshgrid(-3:.125:3);
            Z=peaks(X,Y);                      %创建函数
            meshc(X,Y,Z);                      %绘制三维曲线网格图,如图2.64所示
            axis([-3 3-3 3-10 5])              %标定坐标轴

图2.64 绘制三维曲面网格图

【实例2】 绘制三维曲面网格图,并在图下方绘制幕布线。

            >> [X,Y] = meshgrid(-3:.125:3);
            Z=peaks(X,Y);                      %创建函数
            meshz(X,Y,Z)                       %绘制网格图和幕布线,如图2.65所示

图2.65 绘制三维曲面网格图并且在图下方绘制幕布线

2.2.4 view——设置三维图形视图

【功能】 指定立体图形的观察点。观察者(观察点)的位置决定了坐标轴的方向。用户可以用方位角(azimuth)和仰角(elevation)一起,或者用空间中的一点来确定观察点的位置。

【语法介绍】

● view(az,el)、view([az,el]) 设置观察者观察三维图形的视角。参量az表示方位角或水平旋转角,即视点沿逆时针旋转的角度。el 表示仰角,其中仰角的正值代表向物体的上方移动,负值表示向下方移动。

● view([x,y,z]) 在笛卡儿坐标系中的点(x,y,z)处设置视角。

● view(2) 等价于view(0,90)。

● view(3) 等价于view(-37.5,30)。

● view(T) 设置由转换矩阵T决定的观察者观察三维图形的视角。

● [az,el]=view 返回当前观察者观察三维图形的方位角az与仰角el。

● T=view 返回当前的转换矩阵T。

【实例1】 设置观察三维图形的观察者的视角为俯视。

            >>[X,Y,Z]=peaks(30);            %创建函数
            surfc(X,Y,Z)                    %绘制三维带阴影的曲面图,如图2.66所示
            colormap hsv                    %设置颜色表
            axis([-3 3-3 3-10 5])           %标定坐标轴
            >> az = 0;
            el = 90;
            view(az,el);                     %俯视视角,如图2.67所示

图2.66 绘制三维带阴影的曲面图

图2.67 设置以俯视视角观察图2.66

【实例2】 设置观察三维图形的观察者的视角为正视,即沿着y轴方向。

        >>[X,Y,Z]=peaks(30);            %创建函数
        surfc(X,Y,Z)                    %绘制三维带阴影曲面图
        colormap hsv                    %设置颜色表
        axis([-3 3-3 3-10 5])           %标定坐标轴
        >>view([0 0]);                  %正视视角,如图2.68所示

图2.68 设置以正视视角观察图2.66

【实例3】 设置观察三维图形的观察者的视角为俯视,并且沿z轴翻转180°。

        >>[X,Y,Z]=peaks(30);            %创建函数
        surfc(X,Y,Z)                    %绘制三维带阴影曲面图,如图2.66所示
        colormap hsv                    %设置颜色表
        axis([-3 3-3 3-10 5])           %标定坐标轴
       >> az = 180;
       el = 90;
       view(az,el);                     %俯视视角,并且沿z轴翻转180°,如图2.69所示

图2.69 设置以俯视视角并沿z轴翻转180°后观察图2.66

2.2.5 contour——绘制曲面等高线

【功能】 绘制曲面的等高线。

【语法介绍】

● contour(z) 绘制曲面z的等高线图,其中矩阵z表示曲面距平面的高度。

● contour(x,y,z) 绘制曲面(x,y,z)的等高线。其中,x,y是平面z=0上点的坐标矩阵, z为相应点的高度值矩阵。

● contour(z,n)或contour(x,y,z,n) 绘制曲面的n条等高线。其他参量及意义同上。

● contour(z,v)或contour(x,y,z,v) 绘制指定高度v上曲面的等高线图。参量v为向量,表示等高线指定高度。等高线数量为向量v的长度。其他参量及意义同上。

● contour(…,'linespec') 绘制由参量linespec指定等高线的颜色或者线形的等高线图。参量linespec的取值参见表2.1。

● [c,h]=contour(…) 返回等高矩阵c和线句柄或块句柄列向量h。

【实例1】 绘制指定高度上曲面的等高线图。

            >>[X,Y]=meshgrid(-2:.2:2,-2:.2:3);           %生成网格
            Z=X.*exp(-X.^2-Y.^2);                        %生成高度值矩阵
            [C,h]=contour(X,Y,Z);                        %绘制等高线图,如图2.70所示
            set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2)
            colormap cool                                %设置颜色表

图2.70 绘制指定高度上曲面的等高线图

【实例2】 绘制等高线图,使用插值函数平滑等高线。

        >>Z = peaks;
        [C,h]=contour(interp2(Z,4));        %使用插值函数平滑等高线,如图2.71所示
        text_handle = clabel(C,h);
        set(text_handle,'BackgroundColor',[1 1 .6],...
            'Edgecolor',[.7.7.7])           %设置图例属性

图2.71 使用插值函数平滑等高线

【实例3】 设置坐标轴范围与等高线图一致。

        >>Z=rand(24,36);                      %假定数据为24×36随机矩阵
        X = linspace(0,1000,size(Z,2));
        Y = linspace(0,3000,size(Z,1));
        [c,h]=contour(X,Y,Z);                 %绘制等高线图,如图2.72所示
        axis equal tight                      %标定坐标轴

图2.72 设置坐标轴范围与等高线图一致

2.2.6 contour3——绘制三维等高线

【功能】 绘制三维等高线。

【语法介绍】 函数使用方法与2.2.5节介绍的contour函数基本相同。

● contour3(z)

● contour3(x,y,z)

● contour(z,n)或contour(x,y,z,n)

● contour(z,v)或contour(x,y,z,v)

● contour(…,'linespec')

● [c,h]=contour(…)

● contour3(axes_handle,...) 在句柄为axes_handle的轴上绘制曲面或矩阵的三维等高线图。

【实例】 绘制曲面的三维等高线。

            >>[X,Y]=meshgrid([-2:.25:2]);                             %生成网格
            Z=X.*exp(-X.^2-Y.^2);                                     %生成高度值矩阵
            contour3(X,Y,Z,30)                                        %绘制等高线图
            surface(X,Y,Z,'EdgeColor',[.8.8.8],'FaceColor','none')    %设置表面及边缘颜色
            grid off                                                  %取消网格
            view(-15,25)                                              %设置视角
            colormap cool                                             %设置颜色表,如图2.73所示

图2.73 绘制曲面的三维等高线

2.2.7 waterfall——绘制瀑布图

【功能】 绘制瀑布图。

【语法介绍】 函数使用方法与2.2.2节介绍的surf函数基本相同。

● waterfall(X,Y,Z)

● waterfall (X,Y,Z,C)

● waterfall (Z)及waterfall (Z,C)

● waterfall (…,'PropertyName',PropertyValue)

● waterfall(axes_handles,...)

● H=waterfall (…)

【实例】 绘制瀑布图。

            >> [X,Y,Z] = peaks(30);
            waterfall(X,Y,Z)             %绘制peaks函数的瀑布图,如图2.74所示

图2.74 绘制peaks函数的瀑布图

2.2.8 quiver——绘制箭袋图

【功能】 在点(x,y)上用箭头绘制具有元素(u,v)的速度向量。矩阵X,Y,U,V必须具有相同的大小,其中含有响应的位置及速度向量。

【语法介绍】

● quiver(X,Y,U,V) 在指定点绘制在速度向量图。参量 X,Y,U,V 为同维矩阵或同维向量。X,Y表示指定点坐标,U,V表示含有响应的速度分量。

● quiver(U,V) 绘制在x—y平面上均匀分布的速度向量图。其他参量及意义同上。

● quiver(…,scale) 绘制指定扩展箭头大小的速度向量图。参量 scale 为标量,表示扩展箭头大小比例因子。

● quiver(…,LineSpec) 绘制由参量LineSpec指定线条颜色或者线形的速度向量图,并在向量图上画出记号。参量LineSpec的取值见表2.1。

● quiver(…,LineSpec,'filled') 绘制由参量LineSpec指定线条颜色或者线形的速度向量图,并对用LineSpec指定的记号进行填充。

● quiver(axes_handle,...) 在句柄为axes_handle的轴上绘制向量图。

● h=quiver(...) 返回向量图形对象的句柄给h。

【实例】 绘制速度向量的箭袋图。

            >>[X,Y]=meshgrid(-2:.2:2);        %生成网格
            Z=X.*exp(-X.^2-Y.^2);             %生成高度值矩阵
            [DX,DY]=gradient(Z,.2,.2);        %计算梯度
            contour(X,Y,Z)                    %绘制等高线图
            hold on                           %保持图形
            quiver(X,Y,DX,DY)                 %绘制速度向量,如图2.75所示
            colormap hsv                      %设置颜色表
            hold off

图2.75 绘制速度向量的箭袋图

2.2.9 fill3——填充三维图

【功能】 用指定的颜色填充三维多边形。阴影类型为平面型和Gouraud型。

【语法介绍】

● fill3(X,Y,Z,C) 使用指定的色图填充由矩阵X,Y,Z确定的三维多边形。矩阵X,Y, Z维数相同。参量C为矩阵或向量,表示色图。当C为矩阵时,矩阵C与X维数相同。当C为行向量时,向量C的长度等于矩阵X的列数。当C为列向量时,向量C的长度等于矩阵X的行数。

● fill3(X1,Y1,Z1,C1,X2,Y2,Z2,C2,…) 使用指定色图向量 Ci 填充由矩阵 Xi,Yi,Zi确定的三维多边形。矩阵Xi,Yi,Zi维数相同。当Ci为行向量时,向量Ci的长度等于矩阵Xi的列数。当Ci为列向量时,向量Ci的长度等于矩阵Xi的行数。

● fill3(X,Y,Z,ColorSpec) 使用参量ColorSpec指定的颜色填充由矩阵X,Y,Z确定的三维多边形。参量ColorSpec可为RGB向量字符或字符串,取值参见表2.4。

● fill3(…,'PropertyName',PropertyValue) 设置图形对象的属性 PropertyName 的值PropertyValue,并对三维多边形进行填充。

● H=fill3(…) 返回patch图形对象的句柄给向量H。

【实例】 填充三维多边形。

            >> X = [0 1 1 2;1 1 2 2;0 0 1 1];
            Y = [1 1 1 1;1 0 1 0;0 0 0 0];
            Z=[1111;1010;0000];                      %确定多边形数据
            C = [0.5000 1.0000 1.0000 0.5000;
                1.0000 0.5000 0.5000 0.1667;
                0.3330 0.3330 0.5000 0.5000];        %指定填充色图
            fill3(X,Y,Z,C)                           %填充三维多边形,如图2.76所示

图2.76 填充三维多边形

2.2.10 clabel——标注等高线高度

【功能】 在二维等高线图中添加高度标签。在下列形式中,若有 h 出现,则会对标签进行恰当的旋转,否则标签会垂直放置,且在恰当的位置显示个一个“+”号。

【语法介绍】

● clabel(CS,H) 在当前的等高线图上增加高度标注,前提是等高线之间有足够的空间。参量 CS 与 H 分别为等高矩阵和线句柄列向量,通常由等高线绘制函数[CS,H]=contour,[CS,H]=contour3,或[CS,H]=contourf输出得到。

● clabel(CS,H,V) 在当前等高线图上指定等高水平处增加高度标注。参量V为向量,表示等高水平。

● clabel(CS,H,'manual') 手动设置高度标签。用户用鼠标左键或空格键在最接近指定的位置上放置标签,用键盘上的回车键结束该操作。其他参量及意义同上。

● clabel(CS)或 clabel(CS,V)或 clabel(CS,'manual') 在靠近指定高度值的位置上加上一个“+”号。其他参量及意义同上。

【实例1】 生成、绘制和标注一个简单的等高线图。

            >>[x,y]=meshgrid(-2:.2:2);        %生成网格
            z=x.^exp(-x.^2-y.^2);             %生成高度值矩阵
            [C,h]=contour(x,y,z);             %绘制等高线图
            clabel(C,h);                      %标注等高线高度,如图2.77所示

图2.77 生成、绘制和标注一个简单的等高线图

【实例2】 标注等高线高度并且设置标注属性。

            >> [x,y,z] = peaks;
            [C,h]=contour(x,y,z);                   %绘制等高线图,如图2.78所示
            clabel(C,h,'LabelSpacing',72)            %设置标注间距为72个像素点(1英寸)

图2.78 标注等高线高度并且设置标注间距72个像素点

【实例3】 标注等高线高度并且设置标注属性。

            >> [x,y,z] = peaks;
            [C,h]=contour(x,y,z);                 %绘制等高线图,如图2.79所示
            %设置标注字体大小为15,字体颜色为红色
            clabel(C,h,'FontSize',15,'Color','r','Rotation',0)

图2.79 标注等高线高度并且设置标注属性

【实例4】 标注等高线高度,在靠近高度值的位置上加上一个“+”号。

            >> [x,y,z] = peaks;
            C=contour(x,y,z);           %绘制等高线图
            clabel(C)                  %标注等高线高度,如图2.80所示

图2.80 标注等高线高度并在靠近高度值的位置上加上一个“+”号

2.2.11 pcolor——绘制伪彩色图

【功能】 绘制伪彩色图。该图为一矩形单元、由参数 C 定义了颜色的阵列,系统通过C中的每相邻的四点定义的曲面补片而生成一伪彩色图。伪彩色图是从上面向下观看的“平面”曲面图。若用户使用命令shading faceted或shading flat,则每一单元的固定颜色是与之相连的角的颜色有关的。所以,C(i,j)定义了单元的第i行与第j列的颜色。C中的最后一行与最后一列都没有用上。若用户使用命令shading interp,则每一单元的颜色是对它的四个顶点的颜色进行一双线性插值后的颜色,这时C的所有元素都参加了运算。

【语法介绍】

● pcolor(C) 绘制指定颜色C的伪彩色图。参量C为矩阵,其元素都线性地映射于当前色图下标。

● pcolor(X,Y,C) 绘制指定颜色C和指定网格线间间距的伪彩色图。参量X和Y是指定网格线间间距的向量或者矩阵。若X,Y为矩阵,则X,Y,C维数相同;若X, Y为向量,则X,Y的长度分别等于矩阵C的列数和行数。

● pcolor(axes_handles,...) 在句柄为axes_handle的轴上绘制伪彩色图。

● h=pcolor(…) 返回surface图形对象的句柄给h。

【实例1】 由hadamard矩阵绘制伪彩色图。

            >>pcolor(hadamard(20))           %由hadamard矩阵绘制伪彩色图,如图2.81所示
            colormap(gray(2))                %设置颜色表为黑白色
            axis ij
            axis square                      %设置坐标轴属性

图2.81 由hadamard矩阵绘制伪彩色图

【实例2】 绘制一个简单的颜色盘。

            >> %根据等分数n计算圆盘中心角
            n = 6;
            r = (0:n)'/n;
            theta = pi*(-n:n)/n;
            %确定X,Y,C的值
            X = r*cos(theta);
            Y = r*sin(theta);
            C = r*cos(2*theta);
            %绘制颜色盘,如图2.82所示
            pcolor(X,Y,C)
            axis equal tight

图2.82 绘制一个简单的颜色盘

2.2.12 meshgrid——转换区域为数组

【功能】 转换区域为数组。

【语法介绍】

● [X,Y]=meshgrid(x,y) 将向量x,y转换成数组X,Y。转换过程如下:

(1)指定矩形区域[min(x),max(x),min(y),max(y)],其中,min(x)和 max(x)表示向量 x 的最小值和最大值,min(y)和max(y)表示向量y的最小值和最大值;

(2)用直线x=x(i),y=y(j)(i=1,2,…,length(x) ,j=1,2,…,length(y))对矩形区域进行划分。

这样,得到了length(x) ×length(y)个点,这些点的横坐标和纵坐标分别用矩阵X和Y表示,且X的每个行向量与向量x相同,Y的每个列向量与向量y相同。length(x)和length(y)表示向量x和y的长度。

● [X,Y]=meshgrid(x) 等价于[X,Y]=meshgrid(x,x)。

● [X,Y,Z]=meshgrid(x,y,z) 将向量 x,y,z 转换成数组 X,Y,Z。转换过程同[X,Y]=meshgrid(x,y)类似。

【实例1】 用向量1:3和10:14 生成网格。

            >> [X,Y] = meshgrid(1:3,10:14)

            运行结果:
            X=


                1    2    3
                1    2    3
                1    2    3
                1    2    3
                1    2    3

            Y=


                10   10   10
                11   11   11
                12   12   12
                13   13   13
                14   14   14

【实例2】 用向量-2:0.2:2生成三维阴影曲面图。

            >>[X,Y]=meshgrid(-2:.2:2,-2:.2:2);          %生成网格
            Z=X.*exp(-X.^2-Y.^2);                       %生成高度值矩阵
            surf(X,Y,Z)                                 %绘制三维阴影曲面图,如图2.83所示

图2.83 用向量-2:0.2:2生成三维阴影曲面图

2.2.13 pie3——三维圆饼图

【功能】 绘制三维圆饼图。

【语法介绍】

● pie3(X) 绘制矩阵X中非负数据的三维圆饼图。若X中非负元素和小于1,则pie3仅画出部分的圆饼图,且非负元素X(i,j)的值直接限定圆饼图中扇形块的大小;若X中非负元素和大于或等于 1,则非负元素 X(i,j)代表的圆饼图中扇形块大小通过X(i,j)/Y的大小来决定,其中,Y为矩阵X中非负元素和。

● pie3(X,EXPLODE) 绘制由参量 EXPLODE 指定拉出扇形的三维圆饼图。参量EXPLODE与X大小相同,EXPLODE中非零元素对应X中元素的圆饼图中扇形块将被拉出。

● pie3(axes_handle,...) 在句柄为axes_handle的轴上绘制三维圆饼图。

● h=pie3(…) 返回指定块、表面和文本图形的句柄给向量h。

【实例】 绘制三维圆饼图。

            >> x = [1 3 0.5 2.5 2];
            explode=[0 1 0 0 0];         %第2块被拉出
            pie3(x,explode)              %绘制三维圆饼图,如图2.84所示
            colormap hsv                 %设置颜色表

图2.84 绘制三维圆饼图

2.2.14 comet3——绘制三维彗星图

【功能】 绘制三维空间中的彗星图。其中,彗星头(一个小圆圈)显示在屏幕上,沿着数据指定的轨道前进,彗星体为跟在彗星头后面的一段痕迹,彗星轨道为整个函数所画的实曲线。值得注意的一点是,该彗星轨迹的显示模式EraseMode为none,所以,用户不能打印出彗星轨迹(只能得到一个小圆圈),且若用户调整窗口大小,则彗星会消失。

【语法介绍】

● comet3(z) 绘制向量z的三维彗星图。

● comet3(x,y,z) 显示一个彗星通过向量x,y,z确定的三维曲线的彗星图。

● comet3(x,y,z,p) 显示一个指定主体长度的彗星通过向量 x,y,z 确定的三维曲线的彗星图。彗星主体的长度为p×length(y),其中,length(y)表示向量y的长度。

● comet3(axes_handle,...) 在句柄为axes_handle的轴上绘制三维彗星图。

【实例】 绘制三维彗星图,如图2.85所示。

            >> t = -10*pi:pi/250:10*pi;
            comet3((cos(2*t).^2).*sin(t),(sin(2*t).^2).*cos(t),t);

图2.85 绘制三维彗星图

2.2.15 surfl——绘制带光照模式的三维曲面图

【功能】 绘制带光照模式的三维曲面图。该命令显示一个带阴影的曲面,结合了周围的,散射的和镜面反射的光照模式。

【语法介绍】

● surfl(Z) 绘制指定曲面高度Z的三维的带阴影曲面。参量Z为矩阵。

● surfl(X,Y,Z) 绘制指定曲面坐标X,Y,Z的三维的带阴影曲面。其中,矩阵X,Y, Z维数相同。

● surfl(…,'light') 绘制一个用MATLAB照明对象(light object)生成的带颜色、带光照的曲面。

● surfl(…,s) 绘制指定光源与曲面之间的方位s的三维带阴影曲面。其中s为一个二维向量[azimuth,elevation],或者三维向量[sx,sy,sz]。默认光源方位为从当前视角开始,逆时针45°。

● surfl(X,Y,Z,s,k) 绘制指定光源与曲面之间的方位s和常反射系数k的三维带阴影曲面。参量k为一四维向量,其中,k[1]为环境光(ambient light)系数(0≤k[1]≤1), k[2]为漫反射(diffuse reflection)系数(0≤k[2]≤1),k[3]为镜面反射(specular reflection)系数(0≤k[3]≤1),k[4]为镜面反射亮度(以像素为单位),k的默认值为[0.55 0.6 0.4 10]。

● h=surfl(…) 返回曲面图形的句柄给向量h。

【实例1 绘制带光照模式的三维曲面图。

        >>[x,y]=meshgrid(-3:1/8:3);      %生成网格
        z=peaks(x,y);                    %生成高度值矩阵
        surfl(x,y,z);                    %绘制带光照模式的三维曲面图,如图2.86所示
        shading interp                   %设置阴影模式
        colormap(gray);                  %设置颜色表
        axis([-3  3  -3  3  -8  8])      %标定坐标轴

图2.86 绘制带光照模式的三维曲面图

【实例2】 从指定的视角绘制带光照模式的三维曲面图。

        >>view([10 10])           %设置视角
        grid on                   %添加网格
        hold on                   %保持图形
        surfl(peaks)              %由peaks函数绘制带光照模式的三维曲面图,如图2.87所示
        shading interp            %设置阴影模式
        colormap copper           %设置颜色表
        hold off

图2.87 从指定的视角绘制带光照模式的三维曲面图

2.2.16 sphere——三维球体

【功能】 生成球体。

【语法介绍】

● sphere 绘制具有20×20个面的单位球体。

● sphere(n) 绘制具有n×n个面的单位球体。

● [X,Y,Z]=sphere(n) 返回单位球体的坐标到3个维数均为(n+1) × (n+1)的矩阵X,Y,Z。该命令不画图,返回的坐标矩阵可用命令surf(X,Y,Z)或mesh(X,Y,Z)绘制球体。

【实例】 生成三维球体,如图2.88所示。

            >> sphere
            axis equal

图2.88 生成三维球体

2.2.17 cylinder——三维圆柱图

【功能】 生成一单位圆柱体的x,y,z轴的坐标值。用户可以用命令surf或命令mesh画出圆柱形对象,或者不指定输出变量时立即画出图形。

【语法介绍】

● [X,Y,Z]=cylinder 返回半径和高度均为1的圆柱体上等距分布点的坐标值X,Y,Z。其中,矩阵X,Y,Z的维数均为2×21。

● [X,Y,Z]=cylinder(r) 返回半径为r、高度为1的圆柱体上等距分布点的坐标值X,Y,Z。

● [X,Y,Z]=cylinder(r,n) 返回半径为r、高度为1的圆柱体上等距分布点的坐标值X,Y,Z。其中,矩阵X,Y,Z的维数均为2× (n+1)。

● cylinder(axes_handle,...) 在句柄为axes_handle的轴上绘制三维圆柱图。

● cylinder(…) 绘制圆柱体。

【实例1】 绘制三维圆柱图,圆柱表面颜色随机生成。

        >>cylinder                                      %绘制三维圆柱图,如图2.89所示
        axis square                                     %设置坐标轴
        h=findobj('Type','surface');                    %返回'surface'类型句柄
        set(h,'CData',rand(size(get(h,'CData'))))       %设置表面颜色

图2.89 绘制三维圆柱图

【实例2】 由函数(2+cos(t)) 绘制三维圆柱图。

        >> t = 0:pi/10:2*pi;
        [X,Y,Z]=cylinder(2+cos(t));             %生成三维圆柱网格,如图2.90所示
        surf(X,Y,Z)                             %绘制三维圆柱图
        axis square                             %设置坐标轴

图2.90 由函数(2+cos(t))绘制三维圆柱图

2.2.18 light——光照处理

【功能】 制作一个发光体,照明只影响块和表面对象。

【语法介绍】

● light('PropertyName',PropertyValue,...) 指定发光体属性 PropertyName 的值PropertyValue,创建一个发光体。

● handle=light(...) 返回创建的发光体的句柄给handle。

【实例】 绘制peaks曲面图,并对曲面进行光照处理。

            >>h=surf(peaks);                                        %绘制peaks曲面图,如图2.91所示
            set(h,'FaceLighting','phong','FaceColor','interp',...
                  'AmbientStrength',0.5)                            %设置光照属性
            light('Position',[1 0 0],'Style','infinite');           %对曲面进行光照处理

图2.91 绘制peaks曲面图并对曲面进行光照处理

2.2.19 hidden——设置或取消隐藏线模式

【功能】 设置或取消网格图中隐藏线模式。

【语法介绍】

● hidden on 不显示当前图形隐藏线条,使网格图后面的线条被前面的线条遮住。

● hidden off 显示当前图形隐藏线条。

● hidden 切换hidden on与hidden off两种状态。

【实例】 设置或取消网格图中隐藏线模式。

            >>mesh(peaks)             %生成peaks网格图
            hidden off                %取消隐藏线模式,如图2.92(a)所示
            >>hidden on               %设置隐藏线模式,如图2.92(b)所示

图2.92 熟悉hidden函数应用