matlab 程式設計入門篇 三維立體繪圖

67
MATLAB 程程程程程程程 程程程 程程 程程程 (Roger Jang) [email protected] http://mirlab.org/jang 程程程程程 程程 程程程程程

Upload: alcina

Post on 14-Jan-2016

62 views

Category:

Documents


8 download

DESCRIPTION

MATLAB 程式設計入門篇 三維立體繪圖. 張智星 (Roger Jang) [email protected] http://mirlab.org/jang 台大資工系 多媒體檢索實驗室. 4-1 基本立體繪圖指令. mesh 和 surf : mesh :可畫出立體的「網狀圖」( Mesh Plots ) surf :可畫出立體的「曲面圖」( Surface Plots ) 範例 4-1: plotxyz001.m. z = [0 2 1; 3 2 4; 4 4 4; 7 6 8]; mesh(z); - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇三維立體繪圖

張智星 (Roger Jang)[email protected]

http://mirlab.org/jang台大資工系 多媒體檢索實驗室

Page 2: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 mesh 和 surf :

mesh :可畫出立體的「網狀圖」( Mesh Plots )

surf :可畫出立體的「曲面圖」( Surface Plots )

範例 4-1: plotxyz001.mz = [0 2 1; 3 2 4; 4 4 4; 7 6 8];

mesh(z);

xlabel('X 軸 = column index'); % X 軸的說明文字

ylabel('Y 軸 = row index'); % Y 軸的說明文字

Page 3: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖 Matrix Indexing

Coordinate Conversion from matrix indexing to x-y

coordinates jx iy

0 2 1

3 2 4

4 4 4

7 6 8

1

2

3

4

1 2 3

i (= y

)

j (= x)

(i, j) = (3, 2)

(x, y) = (2, 3)

Page 4: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-1 : plotxyz001.m

11.5

22.5

3

1

2

3

40

2

4

6

8

X = column index軸Y = row index軸

Page 5: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-2 : plotxyz002.m 若要將與曲面對應的 x 座標和 y 座標都一併畫出來,還是可以使用 mesh 指令

z = [0 2 1; 3 2 4; 4 4 4; 7 6 8];

mesh(z);

xlabel('X 軸 = column index'); % X 軸的說明文字

ylabel('Y 軸 = row index'); % Y 軸的說明文字

for i=1:size(z,1)

for j=1:size(z,2)

h=text(j, i, z(i,j), num2str(z(i, j))); % 標示曲面高度

set(h, 'hori', 'center', 'vertical', 'bottom', 'color', 'r'); % 改變位置及顏色

end

end

Page 6: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-2 : plotxyz002.m

11.5

22.5

3

1

2

3

40

2

4

6

8

1

4

2

4

X = column index軸

2

8

0

4

3

6

Y = row index軸

4

7

Page 7: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

控制 Y 軸的方向 axis xy: 由小變大 axis ij: 由大變小

11.5

22.5

3

1

2

3

40

2

4

6

8

1

4

2

4

X = column index軸

2

8

0

4

3

6

Y = row index軸

4

7

11.5

22.5

3

1

2

3

4

0

2

4

6

8

1

8

46

4

X = column index軸

47

24

2

Y = row index軸

3

0

Hint: Use the command after plotting the surface/mesh.

Page 8: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-3 : plotxyz011.m meshgrid 的作用是產生 x 及 y (均為向量) 為基準的格子點 ( Grid Points ),其輸出為 xx 及 yy (均為矩陣),分別代表格子點的 x 座標及 y 座標。

Page 9: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 若要產生一個曲面 z=x*y ,其中

x=3:6, y=5:9

y

x

3 4 5 6

3 4 5 6

3 4 5 6

3 4 5 6

3 4 5 6

1

2

3

4

51 2 3 4

5 5 5 5

6 6 6 6

7 7 7 7

8 8 8 8

9 9 9 9

1

2

3

4

5

1 2 3 4

15 20 25 30

18 24 30 36

21 28 35 42

24 32 40 48

27 36 45 54

1

2

3

4

5

1 2 3 4

zz xx yy= .*

= .*

Generated by meshgrid!

Page 10: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-3 : plotxyz011.m x = 3:6;

y = 5:9;

[xx, yy] = meshgrid(x, y); % xx 和 yy 都是矩陣

zz = xx.*yy; % 計算函數值 zz,也是矩陣

subplot(2,2,1); mesh(xx);

title('xx'); axis tight

subplot(2,2,2); mesh(yy);

title('yy'); axis tight

subplot(2,2,3); mesh(xx, yy, zz);

title('zz 對 xx 及 yy 作圖 '); axis tight

Page 11: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-3 : plotxyz011.m

12

34

24

3

4

5

6

xx

12

34

24

6

8

yy

34

56

68

20

40

zz xx yy 對 及 作圖

Page 12: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 如果你不習慣使用 meshgrid ,也可以使用傳統的 for-loop 來一一填入曲面的值,但要小心座標和矩陣索引的對應關係。範例( plotxyz011.m )如下:

x = 3:6;

y = 5:9;

zz=zeros(length(y), length(x));

for i=1:length(y)

for j=1:length(x)

zz(i,j)=y(i)*x(j);

end

end

mesh(x, y, zz);

xlabel('X'); ylabel('Y'); zlabel('Z'); axis tight

3

4

5

6

5

6

7

8

9

20

30

40

50

XY

Z

Page 13: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

範例 4-4 : plotxyz01.m使用 linspace 來產生較密集的資料,以便畫出由函數 形成的立體網狀圖

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 的矩陣

mesh(xx, yy, zz); % 畫出立體網狀圖

4-1 基本立體繪圖指令

22 yxxez

Page 14: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-4 : plotxyz01.m

-2-1

01

2

-2

-1

0

1

2-0.5

0

0.5

Page 15: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

範例 4-5 : plotxyz02.msurf 和 mesh 指令的用法類似

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×2 的矩 陣

surf(xx, yy, zz); % 畫出立體曲面圖

4-1 基本立體繪圖指令

Page 16: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-5 : plotxyz02.m

-2-1

01

2

-2

-1

0

1

2-0.5

0

0.5

Page 17: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 peaks :

為了方便測試立體繪圖,MATLAB 提供了一個peaks 函數,可產生一個凹凸有致的曲面,包含了三個局部極大點( Local Maxima)及三個局部極小點( Local Minima)

其方程式為:

222222 15312

3

1

51013 yxyxyx eeyx

xexz

Page 18: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 畫出此函數的最快方法,即是在 MATLAB 命令視窗直接鍵入 peaks ,可得到下列方程式

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)

Page 19: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 peaks 的圖形

-3-2

-10

12

3

-2

0

2

-5

0

5

x

Peaks

y

Page 20: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 meshz :

meshz 指令有將曲面加上「圍裙」或「舞台」的效果

範例 4-6: plotxyz03.m[x, y, z] = peaks;

meshz(x,y,z);

axis tight;

Page 21: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-6: plotxyz03.m

-3-2

-10

12

3

-2

0

2

-5

0

5

Page 22: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 waterfall :

waterfall 指令可在 x 方向或 y 方向產生水流效果

範例 4-7: plotxyz04.m[x, y, z] = peaks;

waterfall(x,y,z);

axis tight;

Page 23: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-7: plotxyz04.m

-3-2

-10

12

3

-2

0

2

-5

0

5

Page 24: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 meshc :

meshc 可同時畫出網狀圖與「等高線」( Contours )

範例 4-8: plotxyz05.m[x, y, z] = peaks;

meshc(x, y, z);

axis tight;

Page 25: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-8: plotxyz05.m

-3-2

-10

12

3

-2

0

2

-10

-5

0

5

Page 26: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 plot3 :

plot3 指令可畫出三度空間中的曲線 範例 4-9: plotxyz06.m

t = linspace(0,20*pi, 501); % 在 0 及 20*pi 中間取 501 點

plot3(t.*sin(t), t.*cos(t), t); % 畫出 tsin(t),tcos(t),t 的曲線

Page 27: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-9: plotxyz06.m

-100-50

050

100

-100

-50

0

50

1000

20

40

60

80

Page 28: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 plot3 :

亦可同時畫出兩條三度空間中的曲線 範例 4-10: plotxyz07.m

t = linspace(0, 10*pi, 501);

plot3(t.*sin(t), t.*cos(t), t, t.*sin(t), t.*cos(t), -t); % 同時畫兩條曲線

Page 29: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-10: plotxyz07.m

-40-20

020

40

-40

-20

0

20

40-40

-20

0

20

40

Page 30: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 plot3 :

如果輸入引數是三個大小相同的矩陣 x 、 y 、z ,那麼 plot3 會依序畫出每個行向量在三度空間所對應的曲線

範例 4-11: plotxyz08.m[x, y] = meshgrid(-2:0.1:2);

z = y.*exp(-x.^2-y.^2);

plot3(x, y, z);

Page 31: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-11: plotxyz08.m

-2-1

01

2

-2

-1

0

1

2-0.5

0

0.5

Page 32: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 plot3 :

上例中,所有的資料點都必需是在格子點上, MATLAB 才能根據每點的高度來作圖。如果所給的資料點不在格子點上,我們必需先用 griddata 指令來進行內插法以產生格子點

Page 33: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-12: plotxyz09.m

x = 6*rand(100,1)-3; % x 為介於 [-3, 3] 的 100 點亂數

y = 6*rand(100,1)-3; % y 為介於 [-3, 3] 的 100 點亂數

z = peaks(x, y); % z 為 peaks 指令產生的 100 點輸出

[X, Y] = meshgrid(-3:0.1:3);

Z = griddata(x, y, z, X, Y, 'cubic');

mesh(X, Y, Z);

hold on

plot3(x, y, z, '.', 'MarkerSize', 16); % 晝出 100 個取樣

hold off

axis tight

Page 34: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 範例 4-12: plotxyz09.m

-3-2

-10

12

3

-2

0

2

-2

0

2

4

6

Page 35: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 整理:基本三維立體繪圖指令的列表

類別 指令 說明

網狀圖

mesh, ezmesh 立體網狀圖

meshc, ezmeshc 網狀圖加上等高線

meshz網狀圖加上“圍裙”(或“舞臺”)

曲面圖

surf, ezsurf 立體曲面圖

surfc, ezsurfc 曲面圖加上等高線

surfl 曲面圖加上光源

Page 36: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 整理:基本三維立體繪圖指令的列表

類別 指令 說明

曲線圖 plot3, ezplot3 立體曲線圖

低階函數surface Surf 用到的低階指令

line3 Plot3 用到的低階指令

等高線

contour, ezcontour

平面上的等高線

contour3 空間中的等高線

影像表示 pcolor在二維平面中以顏色表示曲面的高度

Page 37: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 ezmesh, ezsurf :

如果我們只是要很快地檢視一個具有二個輸入的函數的圖形,就可以使用 ezmesh 或是 ezsurf 等來快速地畫出函數的曲面圖形

範例 4-13: plotxyz091.msubplot(2,2,1); ezmesh('sin(x)/x*sin(y)/y');

subplot(2,2,2); ezsurf('sin(x*y)/(x*y)');

subplot(2,2,3); ezmeshc('sin(x)/x*sin(y)/y');

subplot(2,2,4); ezsurfc('sin(x*y)/(x*y)');

Page 38: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-1 基本立體繪圖指令 基礎

span=4*pi*[-1, 1]; ezplot('sin(x)/x', span);

-10 -5 0 5 10

-0.2

0

0.2

0.4

0.6

0.8

1

x

sin(x)/x

1sin

lim0

x

xx

Quiz!

Quiz!

Proof:1.Taylor expansion2.l’Hospital’s rule3.圖解說明法

Page 39: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

Result of ez-family

-6 -4 -2 0 2 4 6

-5

0

5

-1

-0.5

0

0.5

1

x

sin(x)/x sin(y)/y

y-6 -4 -2 0 2 4 6

-5

0

5

-1

-0.5

0

0.5

1

x

sin(x y)/(x y)

y

-6 -4 -2 0 2 4 6

-5

0

5

-1

-0.5

0

0.5

1

x

sin(x)/x sin(y)/y

y-6 -4 -2 0 2 4 6

-5

0

5

-1

-0.5

0

0.5

1

x

sin(x y)/(x y)

y

Page 40: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-2 立體圖形與圖軸的基本技巧 hidden off :

在繪製網狀圖時, MATLAB 會隱藏被遮蓋的網線,若要使被遮蓋的網線亦能呈現出來,可用 hidden off 指令

若再鍵入 hidden on ,則恢復原先的設定 範例 4-14: plotxyz10.m

[x,y,z] = peaks;

mesh(x,y,z);

hidden off

axis tight

Page 41: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-2 立體圖形與圖軸的基本技巧 範例 4-14: plotxyz10.m

-3-2

-10

12

3

-2

0

2

-5

0

5

Page 42: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-2 立體圖形與圖軸的基本技巧 整理:以 on/off 來切換的指令:

指令 說明

hidden on/off

隱藏( on )或顯示( off )被遮蓋的網線。

zoom on/off允許( on )或取消( off )以滑鼠點選來放大圖形。

rotate3d on/off

允許( on )或取消( off )以滑鼠點選來旋轉三維圖軸。

axis on/off 顯示( on )或不顯示( off )圖軸。

box on/off顯示( on )或不顯示( off )圖軸的外框。

hold on/off在繪製新圖時,保留( on )或消去( off )舊圖。

more on/off允許( on )或不允許( off )指令視窗的輸出暫停。

echo on/off允許( on )或不允許( off )指令在檔案內執行時,逐一顯示在視窗。

Page 43: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-2 立體圖形與圖軸的基本技巧 rotate3d on :

若要能夠旋轉立體圖形,可已在產生 3D 圖形之後(例如輸入 peaks 之後),再輸入「 rotate3d on 」,此時您可以壓下滑鼠左鍵來拖曳圖軸,以選取最理想的觀測角度。

也可以點選圖形視窗上面的 圖示,就可以開始旋轉立體圖形。

Page 44: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-2 立體圖形與圖軸的基本技巧 三維曲線的觀測角度:

一般而言,三維曲線的觀測角度是由 Azimuth (方位角)及 Elevation (仰角)來決定

Elevation

Azimuth

觀測點

原點

x

z y

Page 45: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-2 立體圖形與圖軸的基本技巧 對二維圖形而言,預設值為 Azimuth = 0°,

Elevation = 90° ;對三維圖形而言,預設值為 Azimuth = -37.5°, Elevation = 30° 。若要改變觀測角度,可用 view 指令

範例 4-15: plotxyz11.mpeaks;

view([0,-30]);

Page 46: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-2 立體圖形與圖軸的基本技巧 範例 4-15: plotxyz11.m

-3 -2 -1 0 1 2 3

-2

0

2-6

-4

-2

0

2

4

6

8

y

x

Peaks

Page 47: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-2 立體圖形與圖軸的基本技巧 NaN :

有時候我們希望將曲面圖切掉一部份,以呈現不同的效果,此時可用 NaN 或 nan( Not a Number ,即“非數值”)來取代矩陣某一部份的值, MATLAB 一碰到 NaN ,就會“鏤空”

範例 4-16: plotxyz12.m[X, Y, Z] = peaks;

Z(10:20,10:20) = nan; % 將 Z 矩陣的一部分代換為 nan

surf(X, Y, Z);

axis tight

Quiz!

Page 48: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-2 立體圖形與圖軸的基本技巧 範例 4-16: plotxyz12.m

-3-2

-10

12

3

-2

0

2

-5

0

5

Page 49: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 colorbar :

利用 colorbar 指令,可顯示 MATLAB 如何以不同顏色來代表曲面的高度

例如先輸入「 peaks 」,再輸入「 colorbar 」

-2

0

2

-2

0

2

-5

0

5

x

Peaks

y

-6

-4

-2

0

2

4

6

8

Page 50: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 整理:常用顏色的 RGB 成分:

顏色 Red (紅色) Green (綠色) Blue (藍色)

black (黑) 0 0 0

white (白) 1 1 1

red (紅) 1 0 0

green (綠) 0 1 0

blue (藍) 0 0 1

yellow (黃) 1 1 0

magenta (錳紫) 1 0 1

cyan (青藍) 0 1 1

gray (灰) 0.5 0.5 0.5

dark red (暗紅) 0.5 0 0

copper (銅色) 1 0.62 0.4

aquamarine (碧綠) 0.49 1 0.83

Quiz!

Page 51: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 colormap :

MATLAB 預設的顏色對應表可由 colormap 得知

cm 是一個 64×3 的矩陣,因此 MATLAB 在畫圖時,會把 cm 第一列的顏色設定給曲面的最低點,把 cm 的最後一列的顏色設定給曲面的最高點,其餘高度的顏色則依線性內插法來決定。(注意:colorbar 的顯示和 cm剛好是上下顛倒!)

>> cm = colormap;

>> size(cm)

ans =

64 3

Page 52: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 colormap :

改變顏色對應表,可得到不同顏色的曲面 ,欲改變顏色對應表,也是用 colormap 指令

範例 4-17: plotxyz13.m

peaks;

colormap(rand(64,3)); % 以亂數產生顏色對應表

colorbar;

Page 53: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 範例 4-17: plotxyz13.m

-2

0

2

-2

0

2

-5

0

5

x

Peaks

y

-6

-4

-2

0

2

4

6

8

Page 54: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 整理:MATLAB 現成的顏色對照表:

指令 說明

co lo rm ap h sv H S V 的顏色對應表(預設值)

co lo rm ap h o t “ ”代表 熱 的顏色對應表

co lo rm ap co o l “ ”代表 冷 的顏色對應表

co lo rm ap su m m er “ ”代表 夏天 的顏色對應表

co lo rm ap g ray “ ”代表 灰階 的顏色對應表

co lo rm ap co p p er “ ”代表 銅色 的顏色對應表

co lo rm ap au tu m n “ ”代表 秋天 的顏色對應表

co lo rm ap w in te r “ ”代表 冬天 的顏色對應表

co lo rm ap sp rin g 代表 “ ”春天 的顏色對應表

co lo rm ap b o n e “代表 X ”光片 的顏色對應表

co lo rm ap p in k “ ”代表 粉紅 的顏色對應表

co lo rm ap flag “ ”代表 旗幟 的顏色對應表

Page 55: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

Change Color Map colormap cool

使您的曲面使用感覺較冷的顏色

範例 4-18:plotxyz14.m

Result

peaks;

colormap cool;

colorbar

-2

0

2

-2

0

2

-5

0

5

x

Peaks

y

-6

-4

-2

0

2

4

6

8

Page 56: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

Change Color Map colormap hot

使您的曲面使用感覺較熱的顏色

Result

peaks;

colormap hot;

colorbar

-2

0

2

-2

0

2

-5

0

5

x

Peaks

y

-6

-4

-2

0

2

4

6

8

Page 57: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

連續改變 colormap 顏色如何變化?為什麼?試看看!

peaks;

colormap hsv

colorbar

colormap(colormap.^2)

colormap(colormap.^2)

colormap(colormap.^2)

colormap(colormap.^2)

peaks;

colormap hsv

colorbar

colormap(colormap.^.5)

colormap(colormap.^.5)

colormap(colormap.^.5)

colormap(colormap.^.5)

Page 58: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 surf和mesh 的顏色設定:

除了以高度來設定顏色之外, surf 及mesh 指令都可以接受第 4 個輸入引數來設定顏色

例如:以曲面的斜率來設定顏色 範例 4-19: plotxyz15.m[X, Y, Z] = peaks;

surf(X, Y, Z, gradient(Z));

axis tight;

colormap hot

Quiz: How to compute gradient?

-3-2

-10

12

3

-2

0

2

-5

0

5

Page 59: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 surf和mesh 的顏色設定:

例如:以曲面的曲率來設定顏色 範例 4-20: plotxyz16.m

[X, Y, Z] = peaks;

surf(X, Y, Z, del2(Z));

axis tight;

colormap hot

-3-2

-10

12

3

-2

0

2

-5

0

5

Page 60: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 brighten :

我們可用 brighten 指令來使顏色對照表變亮或變暗

範例 4-21: plotxyz17.mcolormap copper

subplot(3, 1, 1); rgbplot(colormap);

brighten(colormap, 0.5)

subplot(3, 1, 2); rgbplot(colormap);

brighten(colormap, -0.8)

subplot(3, 1, 3); rgbplot(colormap);

Page 61: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 範例 4-21: plotxyz17.m

0 10 20 30 40 50 60 700

0.5

1

0 10 20 30 40 50 60 700

0.5

1

0 10 20 30 40 50 60 700

0.5

1

Page 62: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 True Color :

前例 MATLAB 決定顏色的方法稱為「索引顏色」( Indexed Color )法,因為曲面上每個方塊先對應至顏色對應表的索引

如果您的顯示器能支援 24 位元全彩,則我們可以直接定義一千六百萬( 2^24 )種顏色,而不需要再定義顏色對應表。此種方法稱為「真實顏色」( True Color )法

Quiz:1.Definition of true and indexed color2.Their strength and weakness

Page 63: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 範例 4-22: plotxyz18.m

Z = peaks(50);

C(:, :, 1) = rand(50); % C(:,:,1) 代表 R( Red ,紅色)的份量

C(:, :, 2) = rand(50); % C(:,:,2) 代表 G ( Green ,綠色)的份量

C(:, :, 3) = rand(50); % C(:,:,3) 代表 B( Blue ,藍色)的份量

surf(Z, C);

axis tight

5040

3020

101020

3040

-5

0

5

50

Page 64: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 shading :

若要使表面的顏色產生連續性的變化,可使用 shading 指令

例如我們可以先輸入「 peaks 」,再輸入「 shading interp 」,就可以得到下列顏色漸進變化的圖形

Page 65: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 整理:

指令 功能

shading interp

使用 Bilinear Interpolation 來使「瓷磚」根據四頂點的顏色產生連續的變化

shading flat

「瓷磚」的顏色是單一的。

shading faceted 「瓷磚」的顏色是單一的,而且同時

顯色「瓷磚」交接的「邊」。(此為預設值)

Page 66: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 colormap和 shading :

使用 colormap 及 shading ,可產生意想不到的結果

範例 4-23: plotxyz19.m

surfl(peaks); % 曲面圖加上光源

axis tight

colormap(pink);

shading interp

Page 67: MATLAB  程式設計入門篇 三維立體繪圖

MATLAB 程式設計入門篇:三維立體繪圖

4-3 曲面顏色的控制 範例 4-23: plotxyz19.m

是不是很像平滑無暇的絲緞呢?