[Matlab绘图][三维图形][三维曲线基本函数+三维曲⾯+其他三维图形]
1.绘制三维图形的基本函数
最基本的三维绘图函数为plot3;
plot3与plot⽤法⼗分相似,调⽤格式:
plot(x1,y1,z1,选项1,x2,y2,z2,选项2,...,xn,yn,zn,选项n)
当x,y,z是同维向量时,则x,y,z,对应元素构成⼀条三维曲线;
当x,y,z是同维矩阵时,则以x,y,z对应列元素绘制三维曲线,曲线条数等于矩阵列数。
  例:
程序如下:
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('y'),zlabel('z');
grid;
  运⾏结果:
2.三维曲⾯
2.1平⾯⽹格坐标矩阵的⽣成
  绘制z=f(x,y)所代表的三维曲⾯图,先要在xy平⾯选定⼀个矩形区域,假定矩形区域D=[a,b]*[c,d],然后
将[a,b]在x⽅向分成m份,将[c,d]在y⽅向分成n份,由各划分点分别作平⾏于两坐标轴的直线,将区域D分成m*n个⼩矩形,⽣成代表每⼀个⼩矩形顶点坐标的平⾯⽹格坐标矩阵,最后利⽤有关函数绘图。
  产⽣平⾯区域内的⽹格坐标矩阵有两种⽅法:
  1.利⽤矩阵运算⽣成、
x=a:dx:b;
y=(c:dy:d)';
X=ones(size(y))*x;
Y=y*ones(size(x));
语句执⾏后,
矩阵X的每⼀⾏都是向量x,⾏数等于向量y的元素个数,
矩阵Y的每⼀列都是向量y,列数等于向量x的元素个数。
于是对于矩阵X,Y来说,它们位置(i,j)上的元素值(X(i,j),Y(i,j))就是所要形成的平⾯⽹格
在位置(i,j)上的X,Y坐标。可根据每⼀个⽹格点上的x,y坐标求这个点对应的z,则得到Z矩阵。
显然,X,Y,Z各列或各⾏所对应坐标,对应于⼀条空间曲线,空间曲线的集合将可组成空间曲⾯。
  2.利⽤meshgrid函数⽣成。
调⽤格式:
x=a:dx:b;
y=c:dy:d;
[x,y]=meshgrid(x,y);
语句执⾏后得到与⽅法1相同的矩阵X,Y。
当向量x=y时,函数可写成meshgrid(x);
  例:利⽤法⽹格坐标阵巧解不定⽅程:
  已知6<x<30,15<y<36,求不定⽅程2x+5y=126的整数解。程序如下:
x=7:29;
y=16:35;
[x,y]=meshgrid(x,y); %在[7,29]*[16,35]区域⽣成⽹格坐标
z=2*x+5*y;
k=find(z==126);%出解的位置,即k为z中元素等于126的元素的位置
x(k)',y(k)'%输出对应位置的x,y即⽅程的解
输出:
ans =
8    13    18    23
ans =
22    20    18    16
%即⽅程有4组解:(8,22),(13,20),(18,18)(23,16).
输出:
>> k
k =
27
125
223
321
输出(关于find函数):
>> [a,b]=find(z==126)
a =
7
5
3
1
b =
2
7
12
17
>> x(7,2)
ans =
8
2.2 绘制三维曲⾯的函数
两个函数:
mesh(x,y,z,c)%⽤于绘制三维⽹格图,在不需要绘制特别精细三维曲⾯时使⽤。
surf(x,y,z,c)%⽤于绘制三维曲⾯,各线条之间的补⾯⽤颜⾊填充。
关于x,y,z,c:
one:通常x,y,z是同维矩阵,x,y是⽹格坐标矩阵,z是⽹格点的⾼度矩阵,c⽤于指定在不同⾼度下的颜⾊范围。
two:c省略时,MATLAB认为c=z,即颜⾊的⾼度正⽐于图形⾼度,以得到层次分明的三维图形。当x,y省略时,把z矩阵的列下标当做x轴坐标,把z矩阵的⾏下标当做y轴坐标,然后绘制三维曲⾯图。three:当x,y是向量时,要求x的长度必须等于z矩阵的列数,y的长度等于z矩阵的⾏数,x,y向量元素的组合构成⽹格点的x,y坐标,z坐标则取⾃z矩阵,然后绘制三维曲⾯图。
例5.15:⽤三维曲⾯图表现函数z=sinycosx。
program1:⽤meshgrid+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-axis');
title('mesh');
效果同:
x=0:0.1:2*pi;
y=0:0.1:2*pi;
z=sin(y')*cos(x);
mesh(x,y,z);
xlabel('x-axis'),ylabel('y-axis'),zlabel('z-axis');
  运⾏结果:
program2:⽤meshgrid+surf
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('meshgrid+surf');
program3:⽤⼀般绘图函数plot3
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('meshgrid+plot3-1f');
grid;
例5.16:绘制两个直径相等的圆管的相交图形。
程序如下:
%两个等直径圆管的交线
m=60;%m是圆圈的密集度,表⽰画60个圆圈
z=1.2*(0:m)/m;%1.2是圆柱⾼
r=ones(size(z));
theta=(0:m)/m*2*pi;
x1=r'*cos(theta);%每⾏都是⼀个cos(theta)
y1=r'*sin(theta);%每⾏都是⼀个sin(theta)
%y1=y1';
z1=z'*ones(1,m+1);%每⾏的z相同
surf(x1,y1,z1);%绘图,⽴起的圆柱
%axis equal,axis off
hold on
x=(-m:2:m)/m;
x2=x'*ones(1,m+1);%m+1个x列
y2=r'*cos(theta);%以y和z为底画圆
%y2=y2';
z2=r'*sin(theta);
surf(x2,y2,z2);
axis equal,axis off
title('两个等直径圆管的交线');
hold off
  运⾏结果:
将上述例5.16中程序的%备注取消,即将第⼀图的y阵第⼆图的z阵转置,这样在底层⾯就不再是圆线了,效果如下:
例5.17 分析由函数z=x^2-2y^2构成的曲⾯形状及与平⾯z=a的交线。
[x,y]=meshgrid(-10:0.2:10);
z1=(x.^2-2*y.^2)+eps;%第⼀个曲⾯
a=input('a=?');
z2=a*ones(size(x));%第⼆个曲⾯(本质是⼀个数乘)
subplot(1,2,1);
mesh(x,y,z1);hold on;mesh(x,y,z2);%分别画出两个曲⾯
v=[-10,10,-10,10,-100,100];axis(v);grid;%第⼀个⼦图的坐标设置
hold off;
r0=(abs(z1-z2)<=1);%求两曲⾯z坐标差⼩于1的点,r0只有0、1值
xx=r0.*x;yy=r0.*y;zz=r0.*z2;%求这些点上的x,y,z坐标,即交线坐标
subplot(1,2,2);
plot3(xx(r0~=0),yy(r0~=0),zz(r0~=0),'*');%在第2⼦图画出交线
axis(v);grid;%第2⼦图的坐标设置
a=?8
size(x)
ans =
101 101
  此外,还有两个和mesh函数相似的函数,即带等⾼线的三维⽹格曲⾯函数meshc和带底座的三维⽹格曲⾯函数meshz。其⽤法与mesh类似,不同的是meshc还在xy平⾯上绘制曲⾯在z轴⽅向的等⾼线,meshz还在xy平⾯上绘制曲⾯的底座。
例5.18 在xy平⾯内选择区域[-8,8]*[-8,8],绘制函数的4种三维曲⾯图。
程序如下:
[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('meshz(x,y,z)')
subplot(2,2,2);
meshz(x,y,z);
title('meshz(x,y,z)')
subplot(2,2,3);
surfc(x,y,z)
title('surfc(x,y,z)')
subplot(2,2,4);
surfl(x,y,z)
title('surf1(x,y,z)')
3.标准三维曲⾯
  MATLAB提供了⼀些函数⽤于绘制标准三维曲⾯,这些函数可以产⽣相应的绘图数据,常⽤于三维图形的演⽰。例如:
sphere函数和cylinder函数分别⽤于绘制三维球⾯和柱⾯。其调⽤格式为:
sphere函数的调⽤格式为:
[x,y,z]=sphere(n)
该函数将产⽣(n+1)*(n+1)矩阵x,y,z,采⽤这3个矩阵可以绘制出圆⼼位于原点、半径为1的单位球体。
若在调⽤该函数时不带输出参数,则直接绘制所需球⾯。n决定了球⾯的圆滑程度,其默认值为20.若n值取得较⼩,则将绘制出多⾯体表⾯图。
cylinder函数调⽤格式为:
[x,y,z]=cylinder(R,n)
其中,R是⼀个向量,存放柱⾯各个等间隔⾼度上的半径,n表⽰在圆柱圆周上有n个间隔点,默认有20个间隔点。例如,cylinder(3)⽣成⼀个圆柱,cylinder([10,1])⽣成⼀个圆锥,
t=0:pi/100:4*pi;
R=sin(t);
cylinder(R,30)
⽣成⼀个正弦柱⾯。
另外,⽣成矩阵的⼤⼩与R向量的长度及n有关。其余与sphere函数相同。
MATLAB还有⼀个peaks函数,称为多峰函数,,常⽤于三维曲⾯的演⽰。该函数可以⽤来⽣成绘图数据矩阵,矩阵元素由函数:
在矩形区域[-3,3]*[-3,3]的等分⽹格点的函数值确定。例如:
z=peaks(30);
将⽣成⼀个30*30矩阵z,即分别沿x和y⽅向将区间[-3,3]等分成29份,并计算这些⽹格点上的函数值。默认的等分数是48,即p=peaks将⽣成⼀个49*49矩阵p。也可以根据风格坐标矩阵x、y重新计算函数值矩阵。例如:
[x,y]=meshgrid(-5:0.1:5);
z=peaks(x,y);
⽣成的数值矩阵可以作为mesh、surf等函数参数⽽绘制出发多峰函数曲⾯图。另处,若在调⽤peaks函数时不带输出参数,则直接绘制出多峰函数曲⾯图。
例5.19 绘制标准三维曲⾯图形。
程序如下:
t=0:pi/20:2*pi;
[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);
4.其它三维图形
4.1 三维条形图
bar3函数绘制三维条形图,调⽤格式为:
bar3(y)
bar3(x,y)
在第⼀种格式中,y的每个元素对应⼀个条形。
第⼆种格式在x指定的位置上绘制y中元素的条形图,X为向量,当y为向量时,x元素个数与y列数相同,当y为矩阵时,x元素与y的⾏数相同。
例:1.bar3(y)
(1)当y为矩阵时,以元素下标为坐标,以元素值为⾼度,绘制条形图。
>> y=magic(5)
y =
17    24    1    8    15
23    5    7    14    16
4    6    13    20    22
matlab等高线填充颜
10    12    19    21    3
11    18    25    2    9
>> y(5,:)=[]%删除第五⾏
y =
17    24    1    8    15
23    5    7    14    16
4    6    13    20    22
10    12    19    21    3
>> bar3(y)
(2)当y为向量时,也是以下标为坐标,为值为⾼度。
>> y=[1 3 5 7 2]
y =
1    3    5    7    2
>> bar3(y)
>>
2.bar3(x,y)
(1)x为向量,y为向量
>> y
y =
1    3    5    7    9    11
>> x
x =
1    3    5    4    8    11
>> bar3(x,y)
>>
(1)x为向量,y为矩阵(x元素改变y矩阵的x坐标)
y =
17    24    1    8    15
23    5    7    14    16
4    6    13    20    22
10    12    19    21    3
>> x=[1 3 5 9]
x =
1    3    5    9
>> bar3(x,y)
4.2 三维杆图
stem3(z)
stem3(x,y,z)
第⼀种格式将数据序列z 表⽰为xy平⾯向上延伸的杆图,x和y⾃动⽣成。
第⼆种格式在x和y指定位置上绘制数据序列z的杆图,x,y,z的维数必须相同。
1.stem3(z)
(1)z为矩阵,以下标为坐标,值为杆值
z =
17    24    1    8    15
23    5    7    14    16
4    6    13    20    22
10    12    19    21    3
>> stem3(z)
(2)z为向量,以下标为坐标,值为杆值
z=y(1,:)
z =
17    24    1    8    15
>> stem3(z)
>> stem(z)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。