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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM