最基本的三維繪圖函數爲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對應列元素繪製三維曲線,曲線條數等於矩陣列數。
例:函數
程序以下:3d
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;
運行結果:blog
繪製z=f(x,y)所表明的三維曲面圖,先要在xy平面選定一個矩形區域,假定矩形區域D=[a,b]*[c,d],而後將[a,b]在x方向分紅m份,將[c,d]在y方向分紅n份,由各劃分點分別做平行於兩座標軸的直線,將區域D分紅m*n個小矩形,生成表明每個小矩形頂點座標的平面網格座標矩陣,最後利用有關函數繪圖。three
產平生面區域內的網格座標矩陣有兩種方法:input
1.利用矩陣運算生成、it
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函數生成。class
調用格式: x=a:dx:b; y=c:dy:d; [x,y]=meshgrid(x,y); 語句執行後獲得與方法1相同的矩陣X,Y。 當向量x=y時,函數可寫成meshgrid(x);
例:利用法網格座標陣巧解不定方程:grid
已知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
兩個函數:方法
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)')
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);
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) >>
pie3(x) 其中x爲向量,用x中的數據繪製一個三維餅圖。
pie3([2347 1827 2043 3025]) pie([2347 1827 2043 3025])
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')