【MATLAB】更酷炫的 3D 繪圖!?

3D 繪圖:plot3

以 a 當 X 軸、b 當 Y 軸、c 當 Z 軸,就可以畫出酷酷的三維線段圖咯!

  • a = \sqrt{t}*\sin(3t)
  • b = \sqrt{t}*\cos(3t)
  • c = 1 - e^{\frac{-t}{\pi}}
a = sqrt(t) .* sin(3*t);
b = sqrt(t) .* cos(3*t);
c = exp((-t)/pi);

plot3(a,b,c)
他還可以用滑鼠拖動來改變視角,也可以用之前這篇文章提過的 xlabel、ylabel、zlabel 來為座標軸取名避免搞混。

網狀 3D 繪圖:mesh

如果說覺得單純線段長的 3D 圖形不好看,那你一定要試試看酷酷的網格 3D 繪圖。

在這之前,先介紹兩個函數:meshgridmesh

  • [X,Y] = meshgrid(x,y):將 x 向量跟 y 向量合成成一個二維座標系 [X,Y],其中 X 及 Y 分別是 length(y) 行(高)跟 length(x) 列(寬)
    • 假設今天 x = 1:4; y = -1:-1:-3; ,那 [X,Y] = meshgrid(x,y)的 X 及 Y 就會是下圖所示
  • mesh(X,Y,Z):利用 X,Y,Z 三個二為坐標系變數形成一個三維網狀圖
x = 1:5;
y = -1:-1:-5;
z = 1:5;
[X,Y] = meshgrid(x,y);
Z = meshgrid(z);
mesh(X,Y,Z)
如果應用在生活情境的話,假設今天需要繪出 3D 曲面圖形 f(x,y) = \frac{1}{2\pi}e^\frac{x^2+y^2}{-2}-4\le x,y \le4
x = linspace(-4,4,100);
[X,Y] = meshgrid(x); % 等同於meshgrid(x,x)
F = (1/2*pi) * exp( X.^2+Y.^2 / (-2)); % .^ 意思是將矩陣中每個元素^2,而不是整個陣列^2
mesh(X,Y, F)

mesh vs surf:網格與曲面的差別

下圖是 mesh 與 surf 透過同樣的 x、y、z 值繪製的 3D 圖形,唯一不同的點為 mesh 上色方式為「網狀」而 surf 則是以「面」來繪製。上色策略以高度而定,相同 z 值顏色相同。

x = linspace(-2, 2, 25);	% 在 x 軸 [-2,2] 之間取 25 點
y = linspace(-2, 2, 25);	% 在 y 軸 [-2,2] 之間取 25 點
[xx, yy] = meshgrid(x, y);	% xx 和 yy 都是 25×25 的矩陣
zz = xx.*exp(-xx.^2-yy.^2);	% 計算函數值,zz 也是 25×25 的矩陣
figure('Name','Mesh vs Surf','NumberTitle','off'); % 創建窗格,命名成 Mesh vs Surf
subplot(1,2,1);mesh(xx, yy, zz);		% 畫出立體網狀圖
subplot(1,2,2);surf(xx, yy, zz);		% 畫出立體曲面圖 

把 mesh 變得跟 surf 一樣

雖然沒啥路用,純粹知道其他參數的用意

[xx,yy,zz] = peaks(25);
figure('Name','Mesh vs Surf','NumberTitle','off');
subplot(1,2,1);mesh(xx, yy, zz,'FaceColor','flat','EdgeColor','black');colorbar;
subplot(1,2,2);surf(xx, yy, zz);colorbar;
colormap('jet');
  • peaks(N):生成 NxN 的二維矩陣,懶惰一點連 N 也可以不打,直接 [xx,yy,zz] = peaks(),peaks 的方程式為 3(1-x)^2e^{-x^2-(y+1)^2}-10(\frac{x}{5}-x^3-y^5)e^{-x^2-y^2}-\frac{1}{3}e^{-(x+1)^2-y^2}
  • figure:創建一個新的視窗,並且透過 Name 設定視窗名稱、NumberTitle 設定為 off 來去隱藏醜醜的 figure 0 之類的文字。
  • subplot:於 這篇 有提到,主要作為多圖表共存一視窗處理。
  • mesh:繪製 3D 網格圖形,可以透過修改 FaceColor 為 flat(一個區塊一種顏色)以及 EdgeColor 邊線顏色為黑色,來達到外表跟 surf 差不多的功能。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *