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 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)
2.stem3(x,y,z)
(1)x,y,z均為向量,以(x,y)為對應坐標z為值
x = 1 2 5 9 6 >> y=x y = 1 2 5 9 6 >> z=x z = 1 2 5 9 6 >> stem3(x,y,z) >>
4.3 三維餅圖
pie3(x) 其中x為向量,用x中的數據繪制一個三維餅圖。
pie3([2347 1827 2043 3025]) pie([2347 1827 2043 3025])
4.4 填充多邊形
fill3(x,y,z,c) 使用x,y,z作為多邊形的頂點,用c指定了填充的顏色。
fill(x,y,c) 以(x,y)為點,c為顏色圖,連點並填充點間面。 x = 1 5 6 8 >> y y = 2 6 4 6 >> z=[1 2 3 4 5 ] z = 1 2 3 4 5 >> fill(x,y,z)
fill3(rand(3,5),rand(3,5),rand(3,5),'y')