<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. 格子點外之資料點繪圖

在上述的例子中,所有的資料點都必須在格子點上,MATLAB才能根據每點的高度進行繪圖,但若資料點不在格子點上,則必須使用griddata指令進行內插法以產生格子點。

老師說,實務上不會有太完美的條件,很多時候要用有限的資料,回推資料分布狀況,藉以進行延伸判斷。

(1) 程式練習

--

subplot(221);
x = 6*rand(100,1)-3; %產生 [-3,3]的100點亂數
y = 6*rand(100,1)-3;
z = peaks(x,y); %用peaks指令產生100點輸出
[X, Y] = meshgrid(-3:0.1:3);
Z = griddata(x,y,z,X,Y,'cubic'); %用內插法求Z對應值
mesh(X,Y,Z);
title('疊圖前')
axis tight

subplot(222);
x = 6*rand(100,1)-3; %產生 [-3,3]的100點亂數
y = 6*rand(100,1)-3;
z = peaks(x,y); %用peaks指令產生100點輸出
[X, Y] = meshgrid(-3:0.1:3);
Z = griddata(x,y,z,X,Y,'cubic'); %用內插法求Z對應值
mesh(X,Y,Z);
hold on %讓此圖留著,作為後續疊圖用

plot3(x,y,z,'.','MarkerSize',16); %畫出100個取樣
hold off %疊完圖後關閉hold on功能
title('疊圖後')
axis tight

subplot(223);
x = 6*rand(100,1)-3; %產生 [-3,3]的100點亂數
y = 6*rand(100,1)-3;
z = peaks(x,y); %用peaks指令產生100點輸出
[X, Y] = meshgrid(-3:0.1:3);
Z = griddata(x,y,z,X,Y,'cubic'); %用內插法求Z對應值
mesh(X,Y,Z);
title('顯示被遮蓋格線')
hidden off
axis tight



(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 留言