[MATLAB要點筆記] 快速上手 3D繪圖指令
<source : greatway9999>
3D立體繪圖指令
(一)、mesh(立體網狀圖) 與 surf (立體曲面圖)
1. mesh:繪製立體網狀圖。
(1) 程式練習
---
x = linspace(-2, 2, 25); % 在x 軸[-2,2] 之間取25 點
y = linspace(-2, 2, 25); % 在y 軸[-2,2] 之間取25 點
[X, Y] = meshgrid(x, y); % X 和Y 都是25×25 的矩陣
Z = X.*exp(-X.^2-Y.^2); % 計算函數值,Z 也是25×25 的矩陣
mesh(X, Y, Z);
---
執行後,繪圖結果如下:
(2) 要點紀錄
meshgrid為產生 x和y(均為向量)為基準的格子點,也就是將 x軸 和 y軸擴充為 n * n 的矩陣,以利後續3D繪圖。以上述程式為例,meshgrid將 x軸 和 y軸 擴充為 25*25 的矩陣。關於meshgrid的實作練習,可參考此篇文章。
當把X和Y的格點畫好後,再透過Z函式產生對應值,即可利用mesh(X, Y, Z)指令畫出立體網狀圖。
2.surf :繪製立體曲面圖。
(1) 程式練習
和上段code,只要把mesh改成surf,就可畫立體曲面圖。
---
x = linspace(-2, 2, 25); % 在x 軸[-2,2] 之間取25 點
y = linspace(-2, 2, 25); % 在y 軸[-2,2] 之間取25 點
[X, Y] = meshgrid(x, y); % X 和Y 都是25×25 的矩陣
Z = X.*exp(-X.^2-Y.^2); % 計算函數值,Z 也是25×25 的矩陣
surf(X, Y, Z);
---
3. peaks:產生凹凸有致的曲面。
(1) 程式練習
以上段code為例,修改Z的函式,會產生3個局部最大點與3個局部極小點。
---
x = linspace(-2, 2, 25);
y = linspace(-2, 2, 25);
[X, Y] = meshgrid(x, y);
Z = 3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-10*(x/5-x.^3-y.^5).*exp(-x.^2-y.^2)-...
1/3*exp(-(x+1).^2-y.^2)
[X,Y,Z]=peaks;
mesh(X,Y,Z);
axis tight;
---
(2) 要點紀錄
" axis tight " 的指令是讓圖軸在x、y、z方向的範圍在圖形資料中x、y、z方向的極大值與極小值,如左圖的效果。若沒加 " axis tight ",效果如右圖。
指令 " axis([-inf,inf,-inf,inf,-inf,inf]) " 的效果等同於 " axis tight " 。
3. waterfall:在x 方向或y 方向產生水流效果。
(1) 程式練習
以上段code為例,將mesh繪圖指令替換成waterfall。程式執行後,會出現左圖效果。右圖則是原本的mesh立體網狀圖,作為對照檢視用。更多用法,詳見 MathWorks。
---
x = linspace(-2, 2, 25);
y = linspace(-2, 2, 25);
[X, Y] = meshgrid(x, y);
Z = 3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-10*(x/5-x.^3-y.^5).*exp(-x.^2-y.^2)-...
1/3*exp(-(x+1).^2-y.^2)
[X,Y,Z]=peaks;
waterfall(X,Y,Z);
title('waterfall');
axis([-inf,inf,-inf,inf,-inf,inf]);
---
4. meshc:同時畫出網狀圖和等高線圖。
指令中的 c 代表 "contour",等高線的意思。
(1) 程式練習
以上段code為例,將waterfall繪圖指令替換成meshc。用subplot指令依序畫出 meshc、waterfall、mesh的圖形,來作對照觀察。篇幅關係,以下僅列meshc程式。
---
subplot(221)
x = linspace(-2, 2, 25);
y = linspace(-2, 2, 25);
[X, Y] = meshgrid(x, y);
Z = 3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-10*(x/5-x.^3-y.^5).*exp(-x.^2-y.^2)-...
1/3*exp(-(x+1).^2-y.^2)
[X,Y,Z]=peaks;
meshc(X,Y,Z);
title('meshc');
axis([-inf,inf,-inf,inf,-inf,inf]);
---
5. surfc:同時畫出曲面圖和等高線圖。
和meshc用法相似,指令中的 c 代表 "contour",等高線的意思。
(1) 程式練習
以上段code為例,將meshc繪圖指令替換成surfc。用subplot指令依序畫出 meshc、waterfall、mesh、surfc的圖形,來作對照觀察。篇幅關係,以下僅列surfc程式。
---
subplot(224);
x = linspace(-2, 2, 25);
y = linspace(-2, 2, 25);
[X, Y] = meshgrid(x, y);
Z = 3*(1-x).^2.*exp(-(x.^2)-(y+1).^2)-10*(x/5-x.^3-y.^5).*exp(-x.^2-y.^2)-...
1/3*exp(-(x+1).^2-y.^2)
[X,Y,Z]=peaks;
surfc(X,Y,Z);
title('surfc');
axis([-inf,inf,-inf,inf,-inf,inf]);
---
6. plot3:畫出3D空間中的曲線。
看到 plot3 指令,會直覺想到 plot指令。 plot指令是畫2D平面的線,畫3D空間中的線,將plot指令後面加上 "3",也許這樣可以幫助記憶。
此外,plot可以畫2條曲線,plot3當然也可以畫2條曲線。以下程式碼將同時繪製立體空間的1條曲線(左圖)與2條曲線(右圖)。
(1) 程式練習
--
subplot(121);
t = linspace(0, 20*pi, 501); % 在0 及20π] 中間取501 點
plot3(t.*sin(t), t.*cos(t), t); % 畫出tsin(t),tcos(t),t 的曲線
title('一條曲線');
subplot(122);
t = linspace(0, 20*pi, 501); % 在0 及20π] 中間取501 點
plot3(t.*sin(t), t.*cos(t), t, t.*sin(t), t.*cos(t), -t); %有顏色的指令為第二條曲線
% 畫出tsin(t),tcos(t),t 和tsin(t),tcos(t),-t的曲線
title('兩條曲線');
---
7. 格子點外之資料點繪圖
(1) 程式練習
--
(2) 要點紀錄
- rand(n,m)指令會產生 n*m 的矩陣,矩陣內元素值在 [0,1] 間。
- 此例中,練習了meshgrid 的另一種寫法,[X, Y] = meshgrid(-3:0.1:3),在x,y軸上產生介於[-3,3]間,單位為0.1的格子點。
- griddata(x,y,z,X,Y,'cubic'),意義為 griddata(x值,y值,z值,X格子點,Y格子點,求Z格子點的方法)
- hold on 指令為保留繪圖,以利後續疊圖用。疊完後,要使用 hold off 關閉保留狀態。更詳細內容請見MathWorks。
- plot3(x, y, z, '.', 'MarkerSize', 16),和plot用法一樣,橘色字為線的樣式設定。
- hidden off,顯示被遮蓋的網線。MATLAB繪圖時,預設會隱藏被遮蔽的網線。
---
參考資料:
#立體網狀圖 #立體曲面圖
0 留言