用给定数据绘三维曲面图

当绘图数据已知时,可以用mesh, surf和surfl等函数直接绘制网格图、刻面图和曲面图。

网格图

网格图常用于表现二维平面或三维实体。作为前处理,网格图常常用于建立二维、三维有限元计算的几何模型。其中的网格,可以是三角形网格,也可以是四边形网格,还可以是其他多边形网格。MATLAB中提供了四边形和三角形两种三维网格图形的生成函数,可以用它们进行绘图。

(1)四边形网格图

用mesh、meshc和meshz函数绘四边形网格图。调用格式为:

mesh(X,Y,Z) 绘网格,用Z确定颜色。颜色与高度成比例。X和Y为矢量,length(X)=n,length(Y)=m, 其中[m,n]=size(Z)。本例中,X(j),Y(i),Z(i, j)为网格线的交点;X和Y对应于Z的列和行。若X和Y为矩阵,则X(i, j), Y(i, j), Z(i, j)为网格线的交点。

mesh(Z) 用X=1:n和Y=1:m绘一个网格,其中[m,n]=size(Z)。高度Z为矩形网格上的单值函数。颜色与高度成比例。

mesh(...,C) 用矩阵C确定的颜色画网格。若X,Y和Z为矩阵,则它们必须与C具有相同的大小。

meshc(...) 在网格下方画一个等值线图。

meshz(...) 在网格周围画一个窗帘图。

h=mesh(...),h=meshc(...)和h=meshz(...) 返回网格图对象的句柄。

下面生成peaks函数的网格图与等值线图的组合图。axis函数指定坐标系的显示范围。

code.matlab
[X,Y]=meshgrid(-3:.125:3);
Z=peaks(X,Y);
meshc(X,Y,Z);
colormap colorcube;
axis([-3 3 -3 3 -10 10])

生成图3-3。

Document Image
\[\]

图3-3 网格图和等值线图的组合图

下面创建peaks函数的窗帘图。

code.matlab
[X,Y]=meshgrid(-3:.125:3);
Z=peaks(X,Y);
meshz(X,Y,Z)

结果如图3-4所示。

Document Image
\[\]

图3-4 窗帘图

(2)三角形网格图

用trimesh函数生成三角形网格图。调用格式为:

trimesh(Tri,X,Y,Z) 显示由m×3的矩阵Tri定义的三角形网格。Tri的每行数据通过索引包含X, Y, Z顶点的矢量或矩阵来定义一个三角形。

trimesh(Tri,X,Y,Z,C) 用与surf函数相同的方式指定C定义的颜色。

trimesh(...'PropertyName',PropertyValue...) 为函数创建的patch图形对象指定其他属性名和属性值。

h=trimesh(...) 返回patch图形对象的句柄。

下面创建顶点矢量和网格矩阵,然后创建一个三角形网格图。

code.matlab
x=rand(1,50);
y=rand(1,50);
z=peaks(6*x-3,6*x-3);
tri=delaunay(x,y);
trimesh(tri,x,y,z)

结果如图3-5所示。

Document Image
\[\]

图3-5 三角形网格图

刻面图

将三维网格图中的三角形单元或四边形单元用不同颜色进行填充,生成三维刻面图。对应的有三角形刻面图和四边形刻面图。

(1)四边形刻面图

用surf函数绘三维刻面图。调用格式为:

surf(Z) 用x=1:n和y=1:m,其中[m,n]=size(Z),根据Z矩阵中的z元素创建一个三维刻面图。高度Z为一单值函数,定义在一个矩形网格上。Z指定颜色数据和刻面高度,颜色与刻面高度成比例。

surf(X,Y,Z) 用Z作为颜色数据和刻面高程数据创建刻面图。X和Y为矢量或矩阵。若X和Y为矢量,则length(X)=n,length(Y)=m,其中[m,n]=size(Z)。

surf(X,Y,Z,C) 用C定义的颜色创建刻面图。

surf(...,'PropertyName',PropertyValue) 同时指定刻面属性。

surfc(...) 在刻面图下方绘一个等值线图。

h=surf(...) 和 h=surfc(...) 返回刻面图形对象的句柄。

下面生成peaks函数的刻面图和等值线图。

code.matlab
[X,Y,Z]=peaks(30);
surfc(X,Y,Z)
colormap colorcube
axis([-3 3 -3 3 -10 10])

生成图3-6。

Document Image
\[\]

图3-6 三维刻面图

(2)三角形刻面图

用trisurf函数生成三角形刻面图。调用格式为:

trisurf(Tri,X,Y,Z) 显示m×3的矩阵Tri定义的三角形网格,并作为刻面。Tri的每一行通过给矢量或矩阵X,Y和Z赋索引值来定义单个三角形。

trisurf(Tri,X,Y,Z,C) 用与surf函数相同的方式指定C定义的颜色。

trisurf(...'PropertyName',PropertyValue...) 为函数创建的patch图形对象指定其他属性名和属性值。

h=trisurf(...) 返回patch对象的句柄。

下面创建顶点矢量和刻面矩阵,然后创建一个三角形刻面图。

code.matlab
x=rand(1,50);
y=rand(1,50);
z=peaks(6*x-3,6*x-3);
tri=delaunay(x,y);
trisurf(tri,x,y,z)

生成图3-7。

Document Image
\[\]

图3-7 三角形刻面图

曲面图

三维曲面图对三维刻面图中三角形单元或四边形单元的颜色进行了平滑,因而更接近实体外观。

使用surfl函数,用基于颜色查找表的光照绘曲面图。调用格式为:

surfl(Z)和surfl(X,Y,Z) 使用默认的光源方向和默认的阴影模型中的光照系数创建三维刻面图。X,Y和Z为矢量或矩阵,定义曲面的x, y和z分量。

surfl(...,'light') 用light对象生成一个彩色的、有光照的曲面。

surfl(...,s) 指定光源的方向。s是一个二元素或三元素矢量,指定曲面到光源的方向s ,s= [sx sy sz]或s=[azimuth elevation]。默认设置为从当前视线方向逆时针旋转45°。

surfl(X,Y,Z,s,k) 指定反射常数。k为四元素矢量,定义环境光、漫反射、镜面反射和镜面照射系数等对光照效果的贡献。k=[ka kd ks shine],默认值为[.55,.6,.4,10]。

h=surfl(...) 返回曲面图形对象的句柄。

下面用基于颜色查找表的光照生成peaks函数的曲面图。其中shading interp语句指定进行插值着色。

code.matlab
[x,y]=meshgrid(-3:1/5:3);
z=peaks(x,y);
surfl(x,y,z);
shading interp
colormap(colorcube);
axis([-3  3  -3  3  -8  8])

生成图3-8。

Document Image
\[\]

图3-8 三维曲面图