Matlab---繪製圖像
該曲線對應的引數方程為
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;
平面網格座標矩陣的生成
當繪製z=f(x,y)所代表的三維曲面圖時,先要在xy平面選定一矩形區域,假定矩形區域為D=[a,b]×[c,d],然後將[a,b]在x方向分成m份,將[c,d]在y方向分成n份,由各劃分點做平行軸的直線,把區域D分成m×n個小矩形。生成代表每一個小矩形頂點座標的平面網格座標矩陣,最後利用有關函式繪圖。
產生平面區域內的網格座標矩陣有兩種方法:
利用矩陣運算生成。
x=a:dx:b;
y=(c:dy:d)’;
X=ones(size(y))*x;
Y=y*ones(size(x));
經過上述語句執行後,矩陣X的每一行都是向量x,行數等於向量y的元素個數,矩陣Y的每一列都是向量y,列數等於向量x的元素個數。
利用meshgrid函式生成;
x=a:dx:b;
y=c:dy:d;
[X,Y]=meshgrid(x,y);
語句執行後,所得到的網格座標矩陣和上法,相同,當x=y時,可以寫成meshgrid(x)
繪製三維曲面的函式
Matlab提供了mesh函式和surf函式來繪製三維曲面圖。mesh函式用來繪製三維網格圖,而surf用來繪製三維曲面圖,各線條之間的補面用顏色填充。其呼叫格式為:
mesh(x,y,z,c)
surf(x,y,z,c)
一般情況下,x,y,z是維數相同的矩陣,x,y是網格座標矩陣,z是網格點上的高度矩陣,c用於指定在不同高度下的顏色範圍。c省略時,Matlab認為c=z,也即顏色的設定是正比於圖形的高度的。這樣就可以得到層次分明的三維圖形。當x,y省略時,把z矩陣的列下標當作x軸的座標,把z矩陣的行下標當作y軸的座標,然後繪製三維圖形。當x,y是向量時,要求x的長度必須等於z矩陣的列,y的長度必須等於必須等於z的行,x,y向量元素的組合構成網格點的x,y座標,z座標則取自z矩陣,然後繪製三維曲線。
例515 用三維曲面圖表現函式 :
為了便於分析三維曲面的各種特徵,下面畫出3種不同形式的曲面。
%program 1
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'); pause;
%program 2
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('surf'); pause;
%program 3
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('plot3-1');grid;
從圖中可以發現,網格圖(mesh)中線條有顏色,線條間補面無顏色。曲面圖(surf)的線條都是黑色的,線條間補面有顏色。進一步觀察,曲面圖補面顏色和網格圖線條顏色都是沿z軸變化的。用plot3
繪製的三維曲面實際上由三維曲線組合而成。可以分析plot(x’,y’,z’)所繪製的曲面的特徵
繪製兩個直徑相等的圓管相交的圖形。
m=30;
z=1.2*(0:m)/m;
r=ones(size(z));
theta=(0:m)/m*2*pi;
x1=r'*cos(theta);y1=r'*sin(theta);%生成第一個圓管的座標矩陣
z1=z'*ones(1,m+1);
x=(-m:2:m)/m;
x2=x'*ones(1,m+1);y2=r'*cos(theta);%生成第一個圓管的座標矩陣
z2=r'*sin(theta);
surf(x1,y1,z1); %繪製豎立的圓管
axis equal ,axis off
hold on
surf(x2,y2,z2); %繪製平放的圓管
axis equal ,axis off
title ('兩個等直徑圓管的交線');
hold off
分析由函式 構成的曲面形狀與平面z=a的交線。
此外,還有兩個和mesh函式相似的函式,即帶等高線的三維網格曲面函式meshc和帶底座的三維網格曲面函式meshz,其用法和mesh類似。不同的是,meshc還在xy平面上繪製曲面在z軸方向的等高線,meshz還在xy平面上繪製曲面的底座。
surf函式也有兩個類似的函式,即具有等高線的曲面函式surfc和具有光照效果的曲面函式surfl。
例518 在xy平面內選擇[-8, 8]×[-8, 8]繪製函式,
[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('meshc');
subplot(2,2,2);
meshz(x,y,z);
title('meshz');
subplot(2,2,3);
surfc(x,y,z);
title('surfc');
subplot(2,2,4);
surfl(x,y,z);
title('surfl');
標準三維曲面
sphere函式和cylinder函式分別用於繪製三維球面和柱面。sphere函式的呼叫格式為:
[x,y,z]=sphere(n);
該函式將產生(n+1)×(n+1矩陣x,y,z 。採用這三個矩陣可以繪製出圓心位於原點、半徑為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);生成一個正弦圓柱面。
另外Matlab還提供了一個peaks函式,稱為多峰函式,常用於三維曲面的演示。該函式可以用來生成繪圖資料矩陣,矩陣元素由函式:
在矩形區域[-3 3]×[-3 3]的等分網格點上的函式值確定。如:z=peaks(30)
將生成一個30×30矩陣,
例519 繪製標準三維曲面圖形
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中元素的條形圖。
stem3函式繪製離散序列資料的三維杆圖,常用格式為:
stem3(z)
stem3(x,y,z)
第一種格式將資料序列z表示為從xy平面向上延伸的杆圖,x和y自動生成。第二種格式在x和y指定的位置上繪製資料序列z的杆圖,x,y,z的維數要相同。
pie3函式繪製三維餅圖,常用格式為:
pie3(x)
x為向量,用x中的資料繪製一個三維餅圖。
fill3函式可在三維空間內繪製出填充過的多邊形,常用格式為:
fill3(x,y,z,c)
用x,y,z做多邊形的頂點,而c指定了填充的顏色。
例520 繪製三維圖形。
1繪製魔方陣的三維條形圖2以三維杆圖形式繪製曲線y=2sinx 3已知x =[2347,1827,2043,3025] ,繪製三維餅圖 4用隨機的頂點座標值畫出5個黃色三角形
subplot(2,2,1);
bar3(magic(4));
subplot(2,2,2);
y=2*sin(0:pi/10:2*pi);
stem3(y);
subplot(2,2,3);
pie3([2347,1827,2043,3025]);
subplot(2,2,4);
fill3(rand(3,5),rand(3,5),rand(3,5),'y');
常用的圖形還有瀑布圖和三維曲面的等高線圖。繪製瀑布圖用waterfall函式,用法和meshz函式相似,只是它的網格線在x軸方向出現,具有瀑布效果。等高線圖分二維和三維兩種形式,分別使用函式contour和contour3繪製。
例521 繪製多峰函式的瀑布圖和等高線圖。
subplot(1,2,1);
[X,Y,Z]=peaks(30);
waterfall(X,Y,Z);
xlabel('XX');ylabel('YY');zlabel('ZZ');
subplot(1,2,2);
contour3(X,Y,Z,12,'k');%其中12代表高度的等級數
xlabel('XX');ylabel('YY');zlabel('ZZ');
三維圖形的精細處理
一.視點處理
在日常生活中,從不同的角度觀察物體,所看到的物體形狀是不一樣的。同樣,從不同視點繪製的三維圖形的形狀也是不一樣的。視點位置可由方位角和仰角表示。
方位角
Matlab提供了設定視點的函式view,其呼叫格式為:
view(az,el)
其中az為方位角,el為仰角,它們均以度為單位。系統預設的視點定義為方位角為-37.5度,仰角30度。
例522 從不同視點繪製多峰函式曲面。
subplot(2,2,1);mesh(peaks);
view(-37.5,30);
title('1');
subplot(2,2,2);mesh(peaks);
view(0,90);
title('2');
subplot(2,2,3);mesh(peaks);
view(90,0);
title('3');
subplot(2,2,4);mesh(peaks);
view(-7,-10);
title('4');
二.色彩處理
三.圖形的裁剪處理
Matlab定義的NaN常數可以用於表示那些不可使用的資料,利用這些特性,可以將圖形中需要裁剪部分對應的函式值設定成NaN,這樣在繪製圖形時,函式值為NaN的部分將不顯示出來,從而達到對圖形進行裁剪的目的。例如,要削掉正弦波頂部或底部大於0.5的部分,可使用下面的程式。
x=0:pi/10:4*pi;
y=sin(x);
i=find(abs(y)>0.5);
x(i)=NaN;
plot(x,y);
例524 繪製兩個球面,其中一個在另一個裡面,將外面的球裁掉一部分,以便能看到裡面的球。
[x,y,z]=sphere(25);
%生成外面的大球
z1=z;
z1(:,1:4)=NaN;%將大球裁去一部分
c1=ones(size(z1));
surf(3*x,3*y,3*z1,c1); %生成裡面的小球
hold on
z2=z;
c2=2*ones(size(z2));
c2(:,1:4)=3*ones(size(c2(:,1:4)));
surf(1.5*x,1.5*y,1.5*z2,c2);
colormap([0 1 0;0.5 0 0;1 0 0]);
grid on
hold off
色圖中使用三種顏色,外面的球是綠色,裡面的球採用深淺不同的兩種紅色。
四.隱函式作圖
如果給定了函式的顯式表示式,可以先設定自變數向量,然後根據表示式計算函式向量,從而用plot等函式繪製出圖形。但是當函式採用隱函式形式時,如: ,則很難利用上述方法繪製圖形。Matlab提供了一個ezplot函式繪製隱函式圖形。用法如下:
① 對於函式f=f(x),ezplot的呼叫格式為:
ezplot(f),在預設區間(-2pi,2pi)繪製圖形。
ezplot(f,[a,b]),在區間(a,b)繪製
② 對於隱函式f=f(x,y),ezplot的呼叫格式為;
ezplot(f),在預設區間(-2pi,2pi),(-2pi,2pi)繪製f(x,y)=0的圖形。
ezplot(f,[xmin,xmax,ymin,ymax]);在區間 繪製圖形。
ezplot(f,[a,b]),在區間(a,b),(a,b)繪製
③ 對於引數方程x=x(t),y=y(t),ezplot函式的呼叫格式為:
ezplot(x,y),在預設區間 繪製x=x(t),y=y(t)圖形。
ezplot(x,y,[tmin,tmax]),在區間(tmin,tmax)繪製x=x(t),y=y(t)圖形。
例525 隱函式繪圖舉例。
subplot(2,2,1);
ezplot('x^2+y^2-9');axis equal;
subplot(2,2,2);
ezplot('x^3+y^3-5*x*y+1/5')
subplot(2,2,3);
ezplot('cos(tan(pi*x))',[0,1]);
subplot(2,2,4);
ezplot('8*cos(t)','4*sqrt(2)*sin(t)',[0,2*pi]);
其他隱函式繪圖還有,ezpolar,ezcontour,ezplot3,ezmesh,ezmeshc,ezsurf,ezsurfc。