1、009. 三维绘图 一.绘制三维曲线(空间曲线)——plot3() 是二维绘图函数plot()的扩展,其调用格式为: plot3(x1, y1, z1, ‘选项1’, x2, y2, z2, ‘选项2’, …) 例1 绘制参数方程表示的空间曲线: t=0:pi/50:2*pi; x=8*cos(t); y=4*sqrt(2)*sin(t); z=-4*sqrt(2)*sin(t); plot3(x,y,z,'p'); title('Line in 3-D Space'); text(0,0,0,'origin'); xlabel('X'); ylabel
2、'Y'); zlabel('Z'); grid; 运行结果: 二.三维曲面 即二元函数z=f(x,y)的图像,定义域(x, y的范围)选XY平面上矩形区域,然后把矩形定义域分割成若干小矩形块(中间生成网格点),再根据函数在各个网格点上的取值(z值)绘制三维图形。 1.利用meshgrid函数分割定义域生成网格点 x=a:dx:b; y=c:dy:d; [X,Y]=meshgrid(x,y); 当x=y时,可以写成meshgrid(x) 2.绘制三维曲面 mesh() 用来绘制三维网格图,而surf() 用来绘制三维曲面图,各线条之间的补面用颜
3、色填充。其调用格式为: mesh(x, y, z, c) surf(x, y, z, c) 一般x, y是两个一维向量, 按照前面分析,z必须是二维矩阵【length(y) ×length(x)】;c用于指定在不同高度下的颜色范围,默认c=z,即颜色的与图形的高度成正比。 例2 (1) mesh() 绘制三维网格图示例【线条有颜色,线条间补面无颜色】 x=0:0.1:2*pi; [x,y]=meshgrid(x); z=sin(y).*cos(x); mesh(x,y,z); xlabel('x-axis'),ylabel('y-axis'),zlabel('z-a
4、xis'); title('mesh'); pause; 运行结果: (2) surf() 绘制三维曲面图示例【线条都是黑色,线条间补面有颜色,且网格图线条颜色和补面颜色都是沿z轴按照图形高度变化的】 x=0:0.1:2*pi; [x,y]=meshgrid(x); z=sin(y).*cos(x); surf(x,y,z); xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis'); title('surf'); pause; 运行结果: (3) plot3() 绘制三维曲面图示例【三维曲
5、线组合而成】 x=0:0.1:2*pi; [x,y]=meshgrid(x); z=sin(y).*cos(x); plot3(x,y,z); xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis'); title('plot3-1'); grid; 运行结果: 3. 特殊功能的mesh() 和surf() 函数【其用法类似】 meshc() 和surfc()——在xy平面上绘制曲面在z轴方向的等高线; meshz()——在xy平面上绘制曲面的底座; surfl()——具有光照效果。 例3 在xy平面内选择[
6、8, 8]×[-8, 8]绘制函数, [x,y]=meshgrid(-8:0.5:8); z=sin(sqrt(x.^2+y.^2))./sqrt(x.^2+y.^2+eps); subplot(2,2,1); meshc(x,y,z); title('meshc'); subplot(2,2,2); meshz(x,y,z); title('meshz'); subplot(2,2,3); surfc(x,y,z); title('surfc'); subplot(2,2,4); surfl(x,y,z); title('surfl'); 运行结果:
7、 4.特殊的三维曲面 (1) [x,y,z]=sphere(n); mesh(x,y,z) ——单位球面【n默认是20, 越大越圆滑】; (2) [x,y,z]=cylinder(R,n); mesh(x,y,z) ——柱面【R半径向量,n同上】 例:cylinder(3) 生成一个圆柱; cylinder([10, 1])生成一个圆锥; t=0:pi/100:4*pi; R=sin(t); cylinder(R,30) 生成一个正弦圆柱面。 (3) peaks函数,称为多峰函数,常用于三维曲面的演示。 例4 绘制特殊三维曲面 t=0:pi/20:2*pi;
8、 [x,y,z]=cylinder(2+sin(t),30); subplot(1,3,1); surf(x,y,z); subplot(1,3,2); [x,y,z]=sphere; surf(x,y,z); subplot(1,3,3); [x,y,z]=peaks(30); meshz(x,y,z); 运行结果: 5.其他三维图形 介绍二维图形时,曾提到条形图、杆图、饼图和填充图等特殊图形,它们还可以以三维形式出现,其函数分别为bar3(),stem3(),pie3()和fill3() 另外,还有瀑布图waterfall(),二维、三维等高线图cont
9、our()和contour3() 例5 (1) 绘制魔方阵的三维条形图; (2) 以三维杆图形式绘制曲线y=2sinx; (3) 已知x =[2347,1827,2043,3025] ,绘制三维饼图 (4) 用随机的顶点坐标值画出五个黄色三角形 subplot(2,2,1); bar3(magic(4)); subplot(2,2,2); y=2*sin(0:pi/10:2*pi); stem3(y); subplot(2,2,3); pie3([2347,1827,2043,3025]); subplot(2,2,4); fill3(rand
10、3,5),rand(3,5),rand(3,5),'y'); 运行结果: 例6 绘制多峰函数的瀑布图和等高线图。 subplot(1,2,1); [X,Y,Z]=peaks(30); waterfall(X,Y,Z); xlabel('XX'); ylabel('YY'); zlabel('ZZ'); subplot(1,2,2); contour3(X,Y,Z,12,'k'); %其中12代表高度的等级数 xlabel('XX'); ylabel('YY'); zlabel('ZZ'); 运行结果: 三.三维图形的精细处理 1.视点
11、处理 现实世界里从不同的角度观察物体,所看到的物体形状是不一样的。Matlab提供了设置视点的view()函数: view(az, el) 其中az为方位角,el为仰角,均以度为单位。系统默认的为方位角为-37.5度,仰角30度。 例7 从不同视点绘制多峰函数曲面 subplot(2,2,1); mesh(peaks); view(-37.5,30); title('1'); subplot(2,2,2); mesh(peaks); view(0,90); title('2'); subplot(2,2,3); mesh(peaks); view(90,0
12、); title('3'); subplot(2,2,4); mesh(peaks); view(-7,-10); title('4'); xlabel('XX'); ylabel('YY'); zlabel('ZZ'); 运行结果: 2.色彩处理 (1) 色图——设置当前图形窗的着色。 colormap(m×3矩阵); 或 colormap(系统预定义色图名); (2) 浓淡处理 shading + faceted(默认,立体感强)/ interp(细腻) (3) 透明控制——例如alpha(0.5) 表示半透明
13、 (4) 灯光设置 light() 与照明设置 lighting() 【略】 3.图形的裁剪处理 Matlab中用NaN表示“非数”,将图形中需要裁剪部分对应的函数值设置成NaN,这样在绘制图形时,函数值为NaN的部分将不显示出来,从而达到对图形进行裁剪的目的。 例8 绘制两个球面,其中一个在另一个里面,将外面的球裁掉一部分,以便能看到里面的球。 [x,y,z]=sphere(25); %生成外面的大球 z1=z; z1(:,1:4)=NaN; %将大球裁去一部分 c1=ones(size(z1)); surf(3*x,3*y,3*z1,c1); %生成里面的小球 hold on z2=z; c2=2*ones(size(z2)); c2(:,1:4)=3*ones(size(c2(:,1:4))); surf(1.5*x,1.5*y,1.5*z2,c2); colormap([0 1 0;0.5 0 0;1 0 0]); grid on hold off 运行结果: 四.隐函数作图——ezplot函数(见上节) 其他隐函数绘图还有,ezpolar,ezcontour,ezplot3,ezmesh,ezmeshc,ezsurf,ezsurfc






