[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對應列元素繪製三維曲線,曲線條數等於矩陣列數。

  例:函數

程序以下: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

2.三維曲面

2.1平面網格座標矩陣的生成

  繪製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

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

  

相關文章
相關標籤/搜索