五、三维曲面
1、平面网格数据的生成
(1)利用矩阵运算生成
例子:
x=[2:6]; y=[3:8].'; X=ones(size(y))*x; Y=y*ones(size(x));
则构成的平面网格中第3行第2列网格点的坐标就是(X32 ,Y32),即(3,5)。
(2)利用meshgrid函数生成
[X,Y]=meshgrid(x,y)
其中,参数x、y为向量,存储网格点坐标的X、Y为矩阵。
x=[2:6]; y=[3:8].'; [X,Y]=meshgrid(x,y)
若根据每一个网格点上的x、y坐标求函数值z,则得到函数值矩阵Z。矩阵X、Y、Z中的各个列向量,对应于一条曲线数据点的坐标。
例子:绘制空间曲线
x=[2:6]; y=[3:8]'; [X,Y]=meshgrid(x,y); Z=randn(size(X)); plot3(X,Y,Z) grid on
2、绘制三维曲面
(1)mesh函数和surf函数
mesh(x,y,z,c)
surf(x,y,z,c)
其中x,y是网格坐标矩阵,z是网格点的高度矩阵,c用于指定在不同高度下的曲面颜色。c省略时,颜色的设定正比于图形的高度。
例子:绘制三维曲面图z=xe^ (-x2-y2)
t=-2:0.2:2; [X,Y]=meshgrid(t); Z=X.*exp(-X.^2-Y.^2); subplot(1,3,1) mesh(X,Y,Z); title('mesh函数') subplot(1,3,2) surf(X,Y,Z); title('surf函数') subplot(1,3,3) plot3(X,Y,Z); title('plot3函数') grid on
(2)mesh函数和surf函数的其他调用格式
mesh(z,c)
sufr(z,c)
当x,y省略时,z矩阵的第2维下标当作x轴坐标,z矩阵的第1维下标当作y轴坐标。
t=1:5; z=[0.5*t;2*t;3*t]; mesh(z);
(3)带等高线的三维网格曲面函数meshc
(4)带底座的三维网格曲面函数meshz
(5)具有等高线的曲面函数surfc
(6)具有光照效果的曲面函数surfl
例子:用以上四种绘制函数z=(x-1)2+(y-2)2-1的曲面图。其中x∈[0,2],y∈[1,3]。
[x,y]=meshgrid([0:0.1:2],[1:0.1:3]); z=(x-1).^2+(y-2).^2-1; 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')
3、标准三维曲面
(1)sphere函数
[x,y,z]=sphere(n)
产生3个(n+1)阶的方阵,采用这3个矩阵可以绘制出圆心位于原点、半径为1的单位球体。
(2)cylinder函数
[x,y,z]=cylinder(R,n)
其中,参数R是一个向量,存放柱面各个等间隔高度上的半径,n表示在圆柱圆周上有n个间隔点,默认为20个间隔点。
- 例子:用cylinder函数分别绘制柱面、花瓶和圆锥面
subplot(1,3,1); [x,y,z]=cylinder; surf(x,y,z); subplot(1,3,2); t=linspace(0,2*pi,40); [x,y,z]=cylinder(2+cos(t),30); surf(x,y,z); subplot(1,3,3); [x,y,z]=cylinder(0:0.2:2,30); surf(x,y,z);
- 例子:用cylinder函数绘制两个相互垂直且直径相等的圆柱面的相交图形。
[x,y,z]=cylinder(1,60); z=[-1*z(2,:);z(2,:)];#将原先z从[0,……,0;1,……,1]变成[-1,……,-1;1,……,1] surf(x,y,z); hold on surf(y,z,x); axis equal
(3)peaks函数
peaks函数是以下的多峰函数表达式。x∈[-3,3];y∈[-3,3]
Z = peaks; 返回一个 49×49 矩阵。
Z = peaks(n); 返回一个 n×n 矩阵。
Z = peaks(V); 返回一个 n×n 矩阵,其中 n = length(V)。
Z = peaks(X,Y); 在给定的 X 和 Y(必须大小相同)处计算 peaks 并返回大小相同的矩阵。
subplot(2,2,1); peaks(10); title('peaks(10)') subplot(2,2,2); peaks; title('peaks') subplot(2,2,3); peaks(-3:0.2:3) title('peaks(-3:0.2:3)') subplot(2,2,4); [x,y]=meshgrid(-2:0.1:2,0:0.1:5); peaks(x,y); title('peaks(x,y)')
4、fmesh函数和fsurf函数
用于绘制参数方程定义的曲面
fsurf(funx,funy,funz,uvlims)
fmesh(funx,funy,funz,uvlims)
其中,funx,funy,funz代表定义曲面x、y、z坐标的函数,通常采用函数句柄的形式。uvlims为funx,funy,funz的自变量的取值范围,用4元向量[umin,umax,vmin,vmax]描述,默认为[-5,5,-5,5]
例子:绘制螺旋曲面x=usinv;y=-ucosv;z=v;u∈(-5,5),v∈(-5,2)
funx=@(u,v)u.*sin(v); funy=@(u,v)-u.*cos(v); funz=@(u,v)v; subplot(1,2,1) fsurf(funx,funy,funz,[-5,5,-5,2]) title('fsurf') subplot(1,2,2) fmesh(funx,funy,funz,[-5,5,-5,2]) title('fmesh')
5、fimplicit3函数
fimplicit3(f,interval) 为 x、y 和 z 指定绘图区间。
例子:在 x 和 y 的默认区间 [-5 5] 绘制由函数描述的双曲线。
f = @(x,y,z) x.^2 + y.^2 - z.^2; fimplicit3(f)
六、图形修饰处理
1、视点处理
- 方位角与仰角
(1)view函数的基本用法
view(az,el)
其中,az为方位角,el为仰角,系统默认方位角-37.5°,仰角30°
例子:绘制函数z=(x-1)2+(y-2)2-1曲面,并从不同视点展示曲面。
[x,y]=meshgrid(0:0.1:2, 1:0.1:3); z=(x-1).^2+(y-2).^2-1; subplot(2,2,1); mesh(x,y,z) title('方位角=-37.5{\circ},仰角=30{\circ}') subplot(2,2,2); mesh(x,y,z) view(0,90);title('方位角=0{\circ},仰角=90{\circ}') subplot(2,2,3); mesh(x,y,z) view(90,0); title('方位角=90{\circ},仰角=0{\circ}') subplot(2,2,4); mesh(x,y,z) view(-45,-60); title('方位角=-45{\circ},仰角=-60{\circ}')
(2)view函数的其他用法
view(x,y,z)
view(2):指从二维平面观察图形,即方位角为0°,仰角为90°
view(3)
2、色彩处理
(1)颜色的向量表示
向量元素在[0,1]范围内取值,3个元素以此表示红、绿、蓝3种颜色的相对亮度,称为RGB三元组。
(2)色图colormap
- 色图矩阵
色图是m行3列的矩阵,每一行是RGB三元组,定义了一个包含m种颜色的列表
内建色图
是64行3列的矩阵
- 指定当前图形使用的色图
colormap cmapname
colormap(cmap)
surf(peaks)%色图为系统默认 colormap hot%将色图变为hot
- 创建色图矩阵
- 色图矩阵的每一行是RGB三元组,可以自定义色图矩阵,也可以用MATLAB提供的函数来定义。
例子:创建一个灰色系列色图矩阵。
c=[0,0.2,0.4,0.6,0.8,1]'; cmap=[c,c,c];%也可以用 cmap=gray(6)来定义 surf(peaks) colormap(cmap)
(3)三维图形表面的着色
可以用shading函数来改变着色方式。
shading faceted:将每个网格片用其高度对应的颜色进行着色,网格线是黑色,这是默认着色方式。
shading flat:每个网格片用同一个颜色进行着色,且网格线也用相应的颜色。
shading interp:网格片内采用颜色插值处理。
例子:使用同一色图,以不同的着色方式绘制圆锥体。
[x,y,z]= cylinder(pi:-pi/5:0,10); colormap(lines); subplot(1,3,1); surf(x,y,z); shading flat subplot(1,3,2); surf(x,y,z); shading interp subplot(1,3,3); surf(x,y,z);
3、图形的裁剪处理
将图形中需要裁剪部分对应的函数值设置为NaN,这样在绘制图形时,函数值为NaN的部分将不显示出来,从而达到对图形裁剪的目的。
- 例子:绘制3/4圆
t=linspace(0,2*pi,100); x=sin(t); y=cos(t); p=y>0.5;%y中大于0.5的元素为1,其他的为0 y(p)=NaN;%将值为1的元素对应的y的元素赋为NaN plot(x,y) axis([-1.1,1.1,-1.1,1.1]) axis square grid on
- 例子:绘制3/4球面
[x,y,z]=sphere(60); p=z>0.5; z(p)=NaN; surf(x,y,z) axis([-1,1,-1,1,-1,1]) axis equal view(-45,20)
七、交互式绘图工具
1、“绘图”选项卡
“绘图”选项卡的工具条提供了绘制图形的基本命令。
- “所选内容”命令组:用于显示已选中用于绘图的变量;
- “绘图”命令组:提供了绘制各种图形的命令;
- “选项”命令组:用于设置绘图时是否新建图形窗口。
2、绘图工具
(1)显示绘图工具
- “显示绘图工具和停靠图形”按钮
- 命令行窗口输入命令
plottools
(2)绘图工具的组成
- 图形选项板
- 绘图浏览器
- 属性编辑器
3、图形窗口菜单和工具栏
(1)工具栏
(2)图形窗口菜单
图形绘制完成之后,可以用“文件”菜单中的“生成代码”命令,将实施在图形上的这些操作命令输出成脚本文件。也可以用“保存”命令将图形窗口内容保存为fig文件
总结