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')

