三維曲線
plot3函數與plot函數用法十分相似,其調用格式為:
plot3(x1,y1,z1,選項1,x2,y2,z2,選項2,…,xn,yn,zn,選項n)
其中每一組x,y,z組成一組曲線的座標參數,選項的定義和plot函數相同。當x,y,z是同維向量時,則x,y,z 對應元素構成一條三維曲線。當x,y,z是同維矩陣時,則以x,y,z對應列元素繪製三維曲線,曲線條數等於矩陣列數。
例 繪製三維曲線。
程序如下:
t=0:pi/100:20*pi;
x=sin(t);
y=cos(t);
z=t.*sin(t).*cos(t);
plot3(x,y,z);
title('Line in 3-D Space');
xlabel('X');ylabel('Y');zlabel('Z');
三維曲面
1.產生三維數據
在MATLAB中,利用meshgrid函數產生平面區域內的網格座標矩陣。其格式為:
x=a:d1:b; y=c:d2:d;
[X,Y]=meshgrid(x,y);
語句執行後,矩陣X的每一行都是向量x,行數等於向量y的元素的個數,矩陣Y的每一列都是向量y,列數等於向量x的元素的個數。
2.繪製三維曲面的函數
surf函數和mesh函數的調用格式為:
mesh(x,y,z,c):畫網格曲面,將數據點在空間中描出,並連成網格。
surf(x,y,z,c):畫完整曲面,將數據點所表示曲面畫出。
一般情況下,x,y,z是維數相同的矩陣。x,y是網格座標矩陣,z是網格點上的高度矩陣,c用於指定在不同高度下的顏色範圍。
例 繪製三維曲面圖z=sin(x+sin(y))-x/10。
程序如下:
[x,y]=meshgrid(0:0.25:4*pi); %在[0,4pi]×[0,4pi]區域生成網格座標
z=sin(x+sin(y))-x/10;
mesh(x,y,z);
axis([0 4*pi 0 4*pi -2.5 1]);
此外,還有帶等高線的三維網格曲面函數meshc和帶底座的三維網格曲面函數meshz。其用法與mesh類似,不同的是meshc還在xy平面上繪製曲面在z軸方向的等高線,meshz還在xy平面上繪製曲面的底座。
例 在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);
mesh(x,y,z);
title('mesh(x,y,z)')
subplot(2,2,2);
meshc(x,y,z);
title('meshc(x,y,z)')
subplot(2,2,3);
meshz(x,y,z)
title('meshz(x,y,z)')
subplot(2,2,4);
surf(x,y,z);
title('surf(x,y,z)')
3.標準三維曲面
sphere函數的調用格式為:(球體,領域,半球,圈子)
[x,y,z]=sphere(n):generates three(N+1)-by-(N+1) matrices so that SURF(X,Y,Z) produces a unit sphere.
cylinder函數的調用格式為:(圓筒,圓柱體,柱面)
[x,y,z]= cylinder(R,n),其中r為圓周半徑,n為組成圓周的點數。
MATLAB還有一個peaks 函數,稱為多峰函數,常用於三維曲面的演示。
例 繪製標準三維曲面圖形。
程序如下:
t=0:pi/20:2*pi;
[x,y,z]= cylinder(2+sin(t),30);
subplot(2,2,1);
surf(x,y,z);
subplot(2,2,2);
[x,y,z]=sphere;
surf(x,y,z);
subplot(2,1,2);
[x,y,z]=peaks(30);
surf(x,y,z);
其他三維圖形
在介紹二維圖形時,曾提到條形圖、杆圖、餅圖和填充圖等特殊圖形,它們還可以以三維形式出現,使用的函數分別是bar3、stem3、pie3 和fill3。
bar3函數繪製三維條形圖,常用格式為:
bar3(y)
bar3(x,y)
stem3函數繪製離散序列數據的三維杆圖,常用格式為:
stem3(z)
stem3(x,y,z)
pie3函數繪製三維餅圖,常用格式為:
pie3(x)
fill3函數等效於三維函數fill,可在三維空間內繪製出填充過的多邊形,常用格式為:
fill3(x,y,z,c)
例 繪製三維圖形:
(1) 繪製魔方陣的三維條形圖。
(2) 以三維杆圖形式繪製曲線y=2sin(x)。
(3) 已知x=[2347,1827,2043,3025],繪製餅圖。
(4) 用隨機的頂點座標值畫出五個黃色三角形。
程序如下:
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' )
例 繪製多峰函數的瀑布圖和等高線圖。
程序如下:
subplot(1,2,1);
[X,Y,Z]=peaks(30);
waterfall(X,Y,Z)
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis');
subplot(1,2,2);
contour3(X,Y,Z,12,'k'); %其中12代表高度的等級數
xlabel('X-axis'),ylabel('Y-axis'),zlabel('Z-axis');
圖形修飾處理
視點處理MATLAB提供了設置視點的函數view,其調用格式為:
view(az,el)
其中az為方位角,el為仰角,它們均以度為單位。系統缺省的視點定義為方位角-37.5°,仰角30°。
例 從不同視點繪製多峰函數曲面。
程序如下:
subplot(2,2,1);mesh(peaks);
view(-37.5,30); %指定子圖1的視點
title('azimuth=-37.5,elevation=30')
subplot(2,2,2);mesh(peaks);
view(0,90); %指定子圖2的視點
title('azimuth=0,elevation=90')
subplot(2,2,3);mesh(peaks);
view(90,0); %指定子圖3的視點
title('azimuth=90,elevation=0')
subplot(2,2,4);mesh(peaks);
view(-7,-10); %指定子圖4的視點
title('azimuth=-7,elevation=-10')
色彩處理
1.顏色的向量表示
MATLAB除用字符表示顏色外,還可以用含有3個元素的向量表示顏色。向量元素在[0,1]範圍取值,3個元素分別表示紅、綠、藍3種顏色的相對亮度,稱為RGB三元組。
2.色圖
色圖(Color map)是MATLAB系統引入的概念。在MATLAB中,每個圖形窗口只能有一個色圖。色圖是m×3 的數值矩陣,它的每一行是RGB三元組。色圖矩陣可以人為地生成,也可以調用MATLAB提供的函數來定義色圖矩陣。
3.三維表面圖形的著色
三維表面圖實際上就是在網格圖的每一個網格片上塗上顏色。surf函數用缺省的著色方式對網格片著色。除此之外,還可以用shading命令來改變著色方式。
shadingfaceted命令將每個網格片用其高度對應的顏色進行著色,但網格線仍保留著,其shading flat命令將每個網格片用同一個顏色進行著色,且網格線也用相應的顏色,從而使得圖形表面顯得更加光滑。
shading interp命令在網格片內採用顏色插值處理,得出的表面圖顯得最光滑。
顏色是黑色。這是系統的缺省著色方式
例 3種圖形著色方式的效果展示。
程序如下:
[x,y,z]=sphere(20);
colormap(copper);
subplot(1,3,1);
surf(x,y,z);
axis equal
subplot(1,3,2);
surf(x,y,z);shading flat;
axis equal
subplot(1,3,3);
surf(x,y,z);shading interp;
axis equal
光照處理
MATLAB提供了燈光設置的函數,其調用格式為:
light('Color',選項1,'Style',選項2,'Position',選項3)
光照處理後的球面。
程序如下:
[x,y,z]=sphere(20);
subplot(1,2,1);
surf(x,y,z);axis equal;
light('Posi',[0,1,1]);
shading interp;
hold on;
plot3(0,1,1,'p');text(0,1,1,' light');
subplot(1,2,2);
surf(x,y,z);axis equal;
light('Posi',[1,0,1]);
shading interp;
hold on;
plot3(1,0,1,'p');text(1,0,1,' light');
圖形的裁剪處理
例4-22 繪製三維曲面圖,並進行插值著色處理,裁掉圖中x和y都小於0部分。
程序如下:
[x,y]=meshgrid(-5:0.1:5);
z=cos(x).*cos(y).*exp(-sqrt(x.^2+y.^2)/4);
surf(x,y,z);shading interp;
pause %程序暫停
i=find(x<=0&y<=0);
z1=z;z1(i)=NaN;
surf(x,y,z1);shading interp;
為了展示裁剪效果,第一個曲面繪製完成後暫停,然後顯示裁剪後的曲面。
圖像處理與動畫製作
圖像處理
1.imread和imwrite函數
imread和imwrite函數分別用於將圖像文件讀入MATLAB工作空間,以及將圖像數據和色圖數據一起寫入一定格式的圖像文件。MATLAB支持多種圖像文件格式,如.bmp、.jpg、.jpeg、.tif等。
2.image和imagesc函數
這兩個函數用於圖像顯示。為了保證圖像的顯示效果,一般還應使用colormap函數設置圖像色圖。
例5-23 有一圖像文件flower.jpg,在圖形窗口顯示該圖像。
程序如下:
[x,cmap]=imread('flower.jpg'); %讀取圖像的數據陣和色圖陣
image(x);colormap(cmap);
axis image off %保持寬高比並取消座標軸
動畫製作
MATLAB提供getframe、moviein和movie函數進行動畫製作。
1.getframe函數
getframe函數可截取一幅畫面信息(稱為動畫中的一幀),一幅畫面信息形成一個很大的列向量。顯然,保存n幅圖面就需一個大矩陣。
2.moviein函數
moviein(n)函數用來建立一個足夠大的n列矩陣。該矩陣用來保存n幅畫面的數據,以備播放。之所以要事先建立一個大矩陣,是為了提高程序運行速度。
3.movie函數
movie(m,n)函數播放由矩陣m所定義的畫面n次,缺省時播放一次。
例 繪製了peaks函數曲面並且將它繞z軸旋轉。
程序如下
[X,Y,Z]=peaks(30);
surf(X,Y,Z)
axis([-3,3,-3,3,-10,10])
axis off;
shading interp;
colormap(hot);
m=moviein(20); %建立一個20列大矩陣
for i=1:20
view(-37.5+24*(i-1),30) %改變視點
m(:,i)=getframe; %將圖形保存到m矩陣
end
movie(m,2); %播放畫面2次
MATLAB三維網圖的高級處理
4.1. 消隱處理
例.比較網圖消隱前後的圖形
z=peaks(50);
Subplot(2,1,1);
mesh(z);
title('消隱前的圖')
hidden off
subplot(2,1,2);
mesh(z);
title('消隱後的圖')
hidden on
colormap([0 0 1])
4.2. 裁剪處理
利用不定數NaN的特點,可以對網圖進行裁剪處理
例.圖形裁剪處理
P=peaks(30);
subplot(2,1,1);
mesh(P);
title('裁剪前的圖');
subplot(2,1,2);
P(20:23,9:15)=NaN*ones(4,7); %裁剪
meshz(P); %垂簾網線圖
title('裁剪後的圖')
colormap([0 0 1]) %藍色網線
注意裁剪時矩陣的對應關係,即大小一定要相同
4.3. 三維旋轉體的繪製
為了一些專業用戶可以更方便地繪製出三維旋轉體,MATLAB專門提供了2個函數:柱面函數cylinder和球面函數sphere
柱面圖繪製由函數cylinder實現.
[X,Y,Z]=cylinder(R,N) 此函數以母線向量R生成單位柱面.母線向量R是在單位高度裡等分刻度上定義的半徑向量.N為旋轉圓周上的分格線的條數.可以用surf(X,Y,Z)來表示此柱面.
[X,Y,Z]=cylinder(R)或[X,Y,Z]=cylinder此形式為默認N=20且R=[1 1]
例.柱面函數演示舉例
x=0:pi/20:pi*3;
r=5+cos(x);
[a,b,c]=cylinder(r,30);
mesh(a,b,c)
例.旋轉柱面圖.
t=0:pi/12:3*pi;
r=abs(exp(-0.25*t).*sin(t));
r=abs(exp(-0.25*t).*sin(t));
[X,Y,Z]=cylinder(r,30);
mesh(X,Y,Z)
colormap([1 0 0])
(2).球面圖
球面圖繪製由函數sphere來實現
[X,Y,Z]=sphere(N)%此函數生成3個(N+1)*(N+1)的矩陣
surf(X,Y,Z) %產生單位球面
[X,Y,Z]=sphere %此型式使用了默認值N=20.
Sphere(N) %只是繪製了球面圖而不返回任何值
例.繪製地球表面的氣溫分佈示意圖.
[a,b,c]=sphere(40);
t=abs(c);
surf(a,b,c,t);
axis('equal') %此兩句控制座標軸的大小相同
axis('square')
colormap('hot')
閱讀更多 工控自動化聯盟 的文章