matlab繪圖:三維圖形
三維曲線
plot3函數
- plot(x,y,z)
情況一: x,y,z通常爲長度相等的向量
情況二: x,y,z爲同行矩陣時,則以對應列元素繪製曲線,曲線條數等於矩陣列數。
情況三: 當x,y,z中有向量也有矩陣時,行向量的長度必須與矩陣列數相同。列向量的長度與矩陣行數相同。
情況四: 含多組輸入參數的plot3函數。
plot3(x1,y1,z1,x2,y2,z2,x3,y3,z3……xn,yn,zn);
每一組向量繪製一條曲線。
情況四: plot(x,y,z,選項)
下面是對應的一些例子。
情況一:
t=linspace(0,10*pi,200);
x=sin(t)+t.*cos(t);
y=cos(t)-t.*sin(t);
z=t;
subplot(2,1,1);
plot3(x,y,z);
grid on
subplot(2,1,2);
plot3(x(1:4:200),y(1:4:200),z(1:4:200));%分別在x,y,z座標中每隔4個點取一個點。所以看起來比較粗糙
grid on
情況
t=0:0.001:2*pi;
t=t';%轉置
x=[t,t,t,t,t];%寫成x=t也行
y=[sin(t),sin(t)+1,sin(t)+2,sin(t)+3,sin(t)+4];
z=[t,t,t,t,t];
plot3(x,y,z);
情況四:
t1=0:0.001:2*pi;
t2=0:0.001:4*pi;
t3=0:0.001:6*pi;
plot3(t1,sin(t1),t1,t2,sin(t2)+1,t2,t3,sin(t3)+2,t3);
fplot函數
- 調用格式:fplot(funx,funy,funz,tlims)
tlims:表示參數函數自變量的取值範圍,用二元向量[tmin,tmax]描述,默認爲[-5,5]
ps:因爲版本原因,我並沒有做出來,可以換更高版本的。(我的版本是2015b的)
%墨西哥帽頂曲線
xt=@(t)exp(-t/10).*sin(5*t);
yt=@(t)exp(-t/10).*cos(5*t);
zt=@(t)t;
fplot3(xt,yt,zt,[-12,12]);
使用句柄形式
三維曲面
平面網格數據的生成
(1)利用矩陣運算生成
x=2:6;
y=(3:8)';
X=ones(size(y))*x;%矩陣的每一行都是向量x,行數=向量y的元素個數
Y=y*ones(size(x));%每一列都是向量y,列數=向量x的個數
grid on
(2)利用meshgrid函數生成
[X,Y]=meshgrid(x,y)
其中x、y是向量(當x、y相同時可簡寫爲x),存儲網格點的座標X、Y爲矩陣
例一、
x=2:6;
y=(3:8)';
[X,Y]=meshgird(x,y);
例二、
x=2:6;
y=(3:8)';
[X,Y]=meshgrid(x,y);
Z=randn(size(X));
plot3(X,Y,Z);
grid on
繪製三維曲面的函數
mesh函數
- 補面無顏色
- 具有等高線的三維曲面網格曲面函數meshc
- 帶有底座的三維網絡曲面函數meshz
surf函數
- 補面有顏色
- 具有等高線的曲面函數surfc
- 具有光照效果的曲面函數surfl
(這些特殊函數見例二)
兩者調用格式差不多:
(1)mesh/surf(x,y,z,c) - x,y,z是同型矩陣
- x,y是網格座標矩陣
- z是網格上的高度矩陣
- c用於指定不同高度下曲面顏色(省略時默認c=z,即顏色正比於高度)
(2)mesh/surf(z,c) - 當x,y省略時z矩陣的第二位座標當作x軸下標z矩陣的第一維下表當作y軸座標。
(看到這裏小小的你眼中是不是充滿大大的❓❓❓我現在也是。下面通過一個例子理解一下見例三)
下面比較以下mesh、surf、plot3三者之間的區別
例1
t=-2:0.2:2;
[X,Y]=meshgrid(t);
Z=X.*exp(-X.^2-Y.^2);
subplot(1,3,1);
mesh(X,Y,Z);
title('mesh')
subplot(1,3,2);
surf(X,Y,Z);
title('surf');
subplot(1,3,3);
plot3(X,Y,Z);
grid on
title('plot3')
例二:
[x,y]=meshgrid(0:0.1:2,1:0.1:3);%
z=(x-1).^2+(y-2).^2-1;
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');
例三:
t=1:5;
z=[0.5*t;2*t;3*t];
mesh(z);
xlabel('x');%x座標是z元素的列下標
ylabel('y');%y座標是z元素的行下標
zlabel('z');
如果還是不明白就看看具體的數據吧!(用鼠標寫的字有點小丑)
繪製三維曲面
sphere函數
[x,y,z]=sphere(n) 繪製三維球面
- 產生三個n+1階方陣可以繪製出圓心在原點半徑爲一的單位球。
- 若不帶輸出參數則直接繪製一個球面。
- n表示這個球的圓滑程度(講人話就是採樣點的多少,過少的話就會變成多面體。)
cylinder函數
[x,y,z]=cylinder(R,n) 繪製三維柱面
- R是一個向量存放各個等間隔面的半徑,直白點講就是這個函數也可以畫出圓錐、臺體……(R爲標量時產生一個圓柱)
- n表示在同一面內的採樣點,過少就會變成多邊形(默認爲20個間隔點)
subplot(1,3,1);
[x,y,z]=cylinder;%默認
surf(x,y,z);
title('圓柱')
subplot(1,3,2);
t=linspace(0,2*pi,40);
[x,y,z]=cylinder(2+cos(t),30);
surf(x,y,z);
title('花瓶');
subplot(1,3,3)
[x,y,z]=cylinder(0:0.2:2,30);
surf(x,y,z);
title('錐面')
%繪製兩個直徑相等且相交的圓柱
[x,y,z]=cylinder(1,60);
z=[-1*z(2,:);z(2,:)];%z矩陣的第一行全爲-1,第二行全爲1
surf(x,y,z);
hold on
surf(y,z,x);
axis equal
peaks函數
生成的矩陣可以作爲mesh和surf的參數,繪製多峯函數曲面圖
調用格式:
- peaks(n) n爲標量,生成n階方陣
- peaks(V) V是關於x,y的矩陣
- peaks(x,y)
用以上兩個方法時,將x,y帶入上面表達式得出z的值 - peaks 默認等分數爲48生成49階方陣
fmesh函數和fsurf函數
用於解決參數方程有關的問題
funx=@(u,v)u.*sin(v);
funy=@(u,v)-u.*cos(v);
funz=@(u,v)v;
fsurf(funx,funy,funz,[-5,5,-2,2])
hold on
fmesh(funx,funy,funz,[-5,5,-2,2])
hold off