lec 07. graphs ii

55
MATLAB Programming Data Visualization II 김탁은 [email protected] 1

Upload: tak-eun-kim

Post on 15-Jun-2015

879 views

Category:

Education


12 download

TRANSCRIPT

Page 1: Lec 07. Graphs II

MATLAB Programming

Data Visualization II

김 탁 은[email protected]

1

Page 2: Lec 07. Graphs II

MATLAB Programming

MATLAB의 3D Plotting 원리

어떠한 함수 f(X,Y)가 주어지고, X 값과 Y 값이 아래와 같이 각각 길이 m, n인 벡터로주어졌다고 가정

• 𝑋𝑋 = 𝑥𝑥1, 𝑥𝑥2, … , 𝑥𝑥𝑚𝑚• 𝑌𝑌 = 𝑦𝑦1,𝑦𝑦2, … , 𝑦𝑦𝑛𝑛

MATLAB에서 그래프를 그리는 방법은

• 1. 두 벡터 X, Y의 카테시안 곱(cartesian product)을 통해 grid를 생성– 𝑋𝑋 × 𝑌𝑌 = { 𝑥𝑥𝑖𝑖,𝑦𝑦𝑗𝑗 , 𝑓𝑓𝑓𝑓𝑓𝑓 𝑎𝑎𝑎𝑎𝑎𝑎 𝑖𝑖 = 1. .𝑚𝑚, 𝑗𝑗 = 1. .𝑛𝑛 }

• 2. 모든 𝑥𝑥𝑝𝑝, 𝑦𝑦𝑞𝑞 점에 대해, 𝑓𝑓 𝑥𝑥𝑝𝑝,𝑦𝑦𝑞𝑞 계산 n x m 개의 f(X,Y) 값이 생성

• 3. 모든 𝑥𝑥𝑝𝑝, 𝑦𝑦𝑞𝑞 점에 대해, 𝑓𝑓(𝑥𝑥𝑝𝑝, 𝑥𝑥𝑝𝑝), 𝑓𝑓(𝑥𝑥𝑝𝑝+1, 𝑥𝑥𝑝𝑝), 𝑓𝑓(𝑥𝑥𝑝𝑝, 𝑥𝑥𝑝𝑝+1), 𝑓𝑓(𝑥𝑥𝑝𝑝+1, 𝑥𝑥𝑝𝑝+1) 과 선으로 연결하여 mesh 생성

• 4. mesh를 채워 surface를 생성

𝒙𝒙𝟏𝟏 𝒙𝒙𝟐𝟐 … 𝒙𝒙𝒎𝒎𝒚𝒚𝟏𝟏 𝑥𝑥1,𝑦𝑦1 𝑥𝑥2,𝑦𝑦1 … 𝑥𝑥𝑚𝑚,𝑦𝑦1𝒚𝒚𝟐𝟐 𝑥𝑥1,𝑦𝑦2 𝑥𝑥2,𝑦𝑦2 … 𝑥𝑥𝑚𝑚,𝑦𝑦2… … … … …

𝒚𝒚𝒏𝒏 𝑥𝑥1,𝑦𝑦𝑛𝑛 𝑥𝑥2,𝑦𝑦𝑛𝑛 … 𝑥𝑥𝑚𝑚,𝑦𝑦𝑛𝑛

𝒙𝒙𝟏𝟏 𝒙𝒙𝟐𝟐 … 𝒙𝒙𝒎𝒎𝒚𝒚𝟏𝟏 𝑓𝑓 𝑥𝑥1,𝑦𝑦1 𝑓𝑓 𝑥𝑥2,𝑦𝑦1 … 𝑓𝑓 𝑥𝑥𝑚𝑚,𝑦𝑦1𝒚𝒚𝟐𝟐 𝑓𝑓 𝑥𝑥1,𝑦𝑦2 𝑓𝑓 𝑥𝑥2,𝑦𝑦2 … 𝑓𝑓 𝑥𝑥𝑚𝑚,𝑦𝑦2… … … … …

𝒚𝒚𝒏𝒏 𝑓𝑓 𝑥𝑥1,𝑦𝑦𝑛𝑛 𝑓𝑓 𝑥𝑥2,𝑦𝑦𝑛𝑛 … 𝑓𝑓 𝑥𝑥𝑚𝑚,𝑦𝑦𝑛𝑛

2

Page 3: Lec 07. Graphs II

MATLAB Programming

plot3

plot3( x, y, z, s )• 𝑥𝑥, 𝑦𝑦, 𝑧𝑧는 동일한 길이의 벡터• s는 linestyle

plot3( x1, y1, z1, s1, x2, y2, z2, s2, … )• 여러 그래프를 동시에 그림

t = 0:0.1:10*pi;x = exp(-t/20) .* cos(t);y = exp(-t/20) .* sin(t);z = t;plot3( x, y, z, ‘r:’ );grid on;

• t 가벡터이므로수식에서 exp(-t/20), cos(t), sin(t)는각각 length(t) 길이의벡터

• 따라서, exp(-t/20)과 cos(t)는각각벡터의원소간곱이므로, “.*” 로곱셈해야함

3

Page 4: Lec 07. Graphs II

MATLAB Programming

몇 가지 properties

축 label의 방향을 설정• eg) 𝑥𝑥, 𝑦𝑦축의 label 방향과 동일하게 𝑧𝑧축의 label 방향 설정

t = 0:0.1:10*pi;x = exp(-t/20) .* cos(t);y = exp(-t/20) .* sin(t);z = t;plot3( x, y, z, ‘r:’ );grid on

xlabel(‘x’);ylabel(‘y’);h = zlabel(‘z’);set( h, ‘rotation’, 180 )

4

Page 5: Lec 07. Graphs II

MATLAB Programming

몇 가지 properties

그래프의 축에 box를 씌워줌• axes object에 box property를 이용• eg) 𝑥𝑥, 𝑦𝑦축의 label 방향과 동일하게 𝑧𝑧축의 label 방향 설정

t = 0:0.1:10*pi;x = exp(-t/20) .* cos(t);y = exp(-t/20) .* sin(t);z = t;plot3( x, y, z, ‘r:’ );grid on

set( gca, ‘box’, ‘on’ );

5

Page 6: Lec 07. Graphs II

MATLAB Programming

mesh

mesh( X, Y, Z )• 𝑋𝑋, 𝑌𝑌는 meshgrid 함수로부터 얻어진 행렬로, 두 행렬은 동일한 크기• Z = 𝑓𝑓(𝑋𝑋,𝑌𝑌) 인 행렬로, Z 행렬의 크기는 𝑋𝑋 (또는 𝑌𝑌) 와 동일

𝒙𝒙𝟏𝟏 𝒙𝒙𝟐𝟐 … 𝒙𝒙𝒎𝒎𝒚𝒚𝟏𝟏 𝑥𝑥1,𝑦𝑦1 𝑥𝑥2,𝑦𝑦1 … 𝑥𝑥𝑚𝑚,𝑦𝑦1𝒚𝒚𝟐𝟐 𝑥𝑥1,𝑦𝑦2 𝑥𝑥2,𝑦𝑦2 … 𝑥𝑥𝑚𝑚,𝑦𝑦2… … … … …

𝒚𝒚𝒏𝒏 𝑥𝑥1,𝑦𝑦𝑛𝑛 𝑥𝑥2,𝑦𝑦𝑛𝑛 … 𝑥𝑥𝑚𝑚,𝑦𝑦𝑛𝑛

𝒙𝒙𝟏𝟏 𝒙𝒙𝟐𝟐 … 𝒙𝒙𝒎𝒎𝒚𝒚𝟏𝟏 𝑓𝑓 𝑥𝑥1,𝑦𝑦1 𝑓𝑓 𝑥𝑥2,𝑦𝑦1 … 𝑓𝑓 𝑥𝑥𝑚𝑚,𝑦𝑦1𝒚𝒚𝟐𝟐 𝑓𝑓 𝑥𝑥1,𝑦𝑦2 𝑓𝑓 𝑥𝑥2,𝑦𝑦2 … 𝑓𝑓 𝑥𝑥𝑚𝑚,𝑦𝑦2… … … … …

𝒚𝒚𝒏𝒏 𝑓𝑓 𝑥𝑥1,𝑦𝑦𝑛𝑛 𝑓𝑓 𝑥𝑥2,𝑦𝑦𝑛𝑛 … 𝑓𝑓 𝑥𝑥𝑚𝑚,𝑦𝑦𝑛𝑛

[X, Y] = meshgrid(-2:0.25:2);Z = X .* exp(-X.^2 - Y.^2);mesh( X, Y, Z );

6

Page 7: Lec 07. Graphs II

MATLAB Programming

mesh

mesh( X, Y, Z )• 𝑋𝑋, 𝑌𝑌는 meshgrid 함수로부터 얻어진 행렬로, 두 행렬은 동일한 크기• Z = 𝑓𝑓(𝑋𝑋,𝑌𝑌) 인 행렬로, Z 행렬의 크기는 𝑋𝑋 (또는 𝑌𝑌) 와 동일

[X,Y] = meshgrid(x, y)• 주어진 벡터 x를 행렬 x에 대한 각각의 행으로 취함• 벡터 y를 행렬 Y에 대한 각각의 열로 취함

𝒙𝒙𝟏𝟏 𝒙𝒙𝟐𝟐 … 𝒙𝒙𝒎𝒎𝒚𝒚𝟏𝟏 𝑥𝑥1,𝑦𝑦1 𝑥𝑥2,𝑦𝑦1 … 𝑥𝑥𝑚𝑚,𝑦𝑦1𝒚𝒚𝟐𝟐 𝑥𝑥1,𝑦𝑦2 𝑥𝑥2,𝑦𝑦2 … 𝑥𝑥𝑚𝑚,𝑦𝑦2… … … … …

𝒚𝒚𝒏𝒏 𝑥𝑥1,𝑦𝑦𝑛𝑛 𝑥𝑥2,𝑦𝑦𝑛𝑛 … 𝑥𝑥𝑚𝑚,𝑦𝑦𝑛𝑛

𝒙𝒙𝟏𝟏 𝒙𝒙𝟐𝟐 … 𝒙𝒙𝒎𝒎𝒚𝒚𝟏𝟏 𝑓𝑓 𝑥𝑥1,𝑦𝑦1 𝑓𝑓 𝑥𝑥2,𝑦𝑦1 … 𝑓𝑓 𝑥𝑥𝑚𝑚,𝑦𝑦1𝒚𝒚𝟐𝟐 𝑓𝑓 𝑥𝑥1,𝑦𝑦2 𝑓𝑓 𝑥𝑥2,𝑦𝑦2 … 𝑓𝑓 𝑥𝑥𝑚𝑚,𝑦𝑦2… … … … …

𝒚𝒚𝒏𝒏 𝑓𝑓 𝑥𝑥1,𝑦𝑦𝑛𝑛 𝑓𝑓 𝑥𝑥2,𝑦𝑦𝑛𝑛 … 𝑓𝑓 𝑥𝑥𝑚𝑚,𝑦𝑦𝑛𝑛

>> [X, Y] = meshgrid(1:1:3, 5:1:10)

X =

1 2 31 2 31 2 31 2 31 2 31 2 3

Y =

5 5 56 6 67 7 78 8 89 9 9

10 10 10

벡터 x의길이만큼행생성

벡터 y의길이만큼행생성

7

Page 8: Lec 07. Graphs II

MATLAB Programming

mesh

[X,Y] = meshgrid(x, y)• 주어진 벡터 x를 행렬 x에 대한 각각의 행으로 취함• 벡터 y를 행렬 Y에 대한 각각의 열로 취함

X =

1 2 3

1 2 3

1 2 3

1 2 3

1 2 3

1 2 3

Y =

5 5 5

6 6 6

7 7 7

8 8 8

9 9 9

10 10 10

𝒙𝒙𝟏𝟏 𝒙𝒙𝟐𝟐 𝒙𝒙𝟑𝟑𝒚𝒚𝟏𝟏 𝑓𝑓 𝑥𝑥1,𝑦𝑦1 𝑓𝑓 𝑥𝑥2,𝑦𝑦1 𝑓𝑓 𝑥𝑥3,𝑦𝑦1𝒚𝒚𝟐𝟐 𝑓𝑓 𝑥𝑥1,𝑦𝑦2 𝑓𝑓 𝑥𝑥2,𝑦𝑦2 𝑓𝑓 𝑥𝑥3,𝑦𝑦2𝒚𝒚𝟑𝟑 𝑓𝑓 𝑥𝑥1,𝑦𝑦3 𝑓𝑓 𝑥𝑥2,𝑦𝑦3 𝑓𝑓 𝑥𝑥3,𝑦𝑦3𝒚𝒚𝟒𝟒 𝑓𝑓 𝑥𝑥1,𝑦𝑦4 𝑓𝑓 𝑥𝑥2,𝑦𝑦4 𝑓𝑓 𝑥𝑥3,𝑦𝑦4𝒚𝒚𝟓𝟓 𝑓𝑓 𝑥𝑥1,𝑦𝑦5 𝑓𝑓 𝑥𝑥2,𝑦𝑦5 𝑓𝑓 𝑥𝑥3,𝑦𝑦5𝒚𝒚𝟔𝟔 𝑓𝑓 𝑥𝑥1,𝑦𝑦6 𝑓𝑓 𝑥𝑥2,𝑦𝑦6 𝑓𝑓 𝑥𝑥3,𝑦𝑦6

𝑓𝑓 𝑥𝑥𝑖𝑖𝑗𝑗 ,𝑦𝑦𝑖𝑖𝑗𝑗 = 𝑥𝑥𝑖𝑖𝑗𝑗𝑒𝑒−𝑥𝑥𝑖𝑖𝑖𝑖2−𝑦𝑦𝑖𝑖𝑖𝑖2

8

Page 9: Lec 07. Graphs II

MATLAB Programming

meshc, meshz 함수

meshc( X, Y, Z )• 등고선(contour) 정보를 함께 보여줌

meshz( X, Y, Z )• mesh 함수와 동일하나, 커튼(curtain) 형태로 표시함

[X, Y] = meshgrid(-2:0.25:2);Z = X .* exp(-X.^2 - Y.^2);meshc( X, Y, Z );figure;meshz( X, Y, Z );

9

Page 10: Lec 07. Graphs II

MATLAB Programming

surf, surfc

surf( X, Y, Z )• mesh와 동일하나, mesh 함수로부터 얻어진 각 격자에 색이 칠해진 그래프

surfc( X, Y, Z )• surf 함수와 등고선(contour)을 함께 나타낸 그래프

[X, Y] = meshgrid(-2:0.25:2);Z = X .* exp(-X.^2 - Y.^2);surf( X, Y, Z );figure;surfc( X, Y, Z );

10

Page 11: Lec 07. Graphs II

MATLAB Programming

ezsurf vs. surf

두 함수는 용도가 서로 다름

• ezsurf 함수의 경우, 그래프의 방정식이 주어지는 경우에만 그래프를 그릴 수

있음

• surf 함수는 그래프의 방정식이 주어지지 않아도 수집한 데이터를 바탕으로

그래프를 그릴 수 있음

[X, Y, Z] = peaks;

% random noise를줌

Z = Z + rand(size(Z));

surf(X,Y,Z)

11

Page 12: Lec 07. Graphs II

MATLAB Programming

Quiz

토러스의 방정식은 다음과 같습니다.• x(t) = cos(u) * (r + a*cos(v)), y(t) = sin(u) * (r + a*cos(v), z(t) = a*sin(v)

a = 0.5, r = 2일 때, 토러스를 surf 함수를 이용하여 그려봅시다.

12

Page 13: Lec 07. Graphs II

MATLAB Programming

Quiz Sol.

토러스의 방정식은 다음과 같습니다.• x(t) = cos(u) * (r + a*cos(v)), y(t) = sin(u) * (r + a*cos(v), z(t) = a*sin(v)

a = 0.5, r = 2일 때, 토러스를 surf 함수를 이용하여 그려봅시다.

a = 0.5;r = 2;u = linspace(0, 2*pi, 40);v = u;[U,V] = meshgrid(u, v);X = cos(U).*(r + a*cos(V));Y = sin(U).*(r + a*cos(V));Z = a*sin(V);surf(X,Y,Z);axis image;

13

Page 14: Lec 07. Graphs II

MATLAB Programming

surface color shading

shading• surface의 color shading mode를 결정

[X, Y, Z] = peaks();surf( X, Y, Z );

>> shading faceted

>> shading interp

>> shading flat

14

Page 15: Lec 07. Graphs II

MATLAB Programming

NaN으로 불연속 곡선 그리기

NaN (Not a Number) 값을 가지는 부분은 그려지지 않고 hole로 남음

[X, Y, Z] = peaks();Z(30:40, 20:30) = NaN;surf( X, Y, Z );

t = linspace(0, 2*pi, 100);y = sin(t);y(50:60) = NaN;plot(t, y);

15

Page 16: Lec 07. Graphs II

MATLAB Programming

3D surf plot + NaN

3D 그래프에서 특정 조건을 만족하는 값들만으로 표시된 그래프 그리기• 예) 함수 값이 1보다 크고 6보다 적은 부분만 표시

close all;[X,Y,Z] = peaks;surf(X,Y,Z);ind = find(1 <= Z & Z <= 6);

Z2 = nan(size(Z));Z2(ind) = Z(ind)+10;hold on;s2 = surf(X,Y,Z2)

16

Page 17: Lec 07. Graphs II

MATLAB Programming

contour

[C, h] = contour( Z )• Z축에 관한 행렬을 입력 받아 등고선을 그리고, contour 행렬 C와 handle h를 반환

[C, h] = contour( Z, k )• 행렬 Z에 대한 k개의 등고선을 그림 (k 값은 스칼라)

[C, h] = contour( Z, v )• 행렬 Z에 대한 등고선을 벡터 v 값에 근거하여 그림 (v는 벡터)• length(v) 개수 만큼의 등고선을 그리며, 그리고자 하는 각 벡터 원소 vi에 대해 f(x, y) =

vi인 등고선들을 그림– 즉, 등고선의 높이가 v에 적힌 숫자들에 해당하는 것들만 그림

17

Page 18: Lec 07. Graphs II

MATLAB Programming

contour

아래와 같이 함수 Z = f(X,Y)가 주어졌을 때,

x = -3:0.05:3;y = -1.5:0.025:1.5;[X,Y] = meshgrid(x,y);Z = 4*X.^2 - 2.1*X.^4 + X.^6/3 + X.*Y - 4*Y.^2 + 4*Y.^4;

>> [C, h] = contour(Z) >> [C, h] = contour(Z, 20) >> cvals = [-2:.5:2 2.3 3:5 6:2:10];>> [C, h] = contour(Z, 20)

18

Page 19: Lec 07. Graphs II

MATLAB Programming

contour에 label 붙이기

clabel( C, h, v )• contour 함수로부터 반환되는 contour matrix C, contour의 핸들 h, 벡터 v의각 벡터 원소 vi에 대해 f(x, y) = vi인 등고선들의 값을 붙임

x = -3:0.05:3;y = -1.5:0.025:1.5;[X,Y] = meshgrid(x,y);Z = 4*X.^2 - 2.1*X.^4 + X.^6/3 + X.*Y - 4*Y.^2 + 4*Y.^4;cvals = [-2:.5:2 2.3 3:5 6:2:10];[C, h] = contour(X,Y,Z, cvals);clabel(C, h, cvals);

19

Page 20: Lec 07. Graphs II

MATLAB Programming

마우스로 선택한 contour에 label 붙이기

clabel( C, h, ‘manual’ )• contour 함수로부터 반환되는 contour matrix C, contour의 핸들 h, 벡터 v의각 벡터 원소 vi에 대해 f(x, y) = vi인 등고선들의 값을 붙이는 것은 동일하나, 마우스로 클릭한 등고선에 대해서만 값을 text 로 출력해서 보여줌

x = -3:0.05:3;y = -1.5:0.025:1.5;[X,Y] = meshgrid(x,y);Z = 4*X.^2 - 2.1*X.^4 + X.^6/3 + X.*Y - 4*Y.^2 + 4*Y.^4;cvals = [-2:.5:2 2.3 3:5 6:2:10];[C, h] = contour(X,Y,Z, cvals);clabel(C, h, ‘manual’ );

20

Page 21: Lec 07. Graphs II

MATLAB Programming

ezcontour vs. contour

ezcontour는 수식만으로 간단히 쉽게 그릴 수 있음 contour는 ezcontour보다 세밀한 등고선을 그릴 수 있음

vs

21

Page 22: Lec 07. Graphs II

MATLAB Programming

contour3

3차원 contour plot을 그려줌• contour와 함수와 사용 방법 거의 동일

x = -3:0.05:3;y = -1.5:0.025:1.5;[X,Y] = meshgrid(x,y);Z = 4*X.^2 - 2.1*X.^4 + X.^6/3 + X.*Y - 4*Y.^2 + 4*Y.^4;cvals = [-2:.5:2 2.3 3:5 6:2:10];[C, h] = contour3(X,Y,Z, cvals);clabel(C, h, cvals);

22

Page 23: Lec 07. Graphs II

MATLAB Programming

contourf

contour plot을 그릴 때 등고선들 사이의 면들에 색을 넣어서 그림• contour 함수와 사용법, 입출력 매개변수 등이 거의 동일

– contourf( X, Y, Z), contourf( X, Y, Z, k ), contourf( X, Y, Z, v)

x = -3:0.05:3;y = -1.5:0.025:1.5;[X,Y] = meshgrid(x,y);Z = 4*X.^2 - 2.1*X.^4 + X.^6/3 + X.*Y - 4*Y.^2 + 4*Y.^4;cvals = [-2:.5:2 2.3 3:5 6:2:10];[C, h] = contourf(X,Y,Z, cvals);clabel(C, h, cvals);

23

Page 24: Lec 07. Graphs II

MATLAB Programming

quiver: vector field plot

주로 사용하는 방법은 아래와 같이contour와 기울기 벡터를 함께 나타냄

[X, Y] = meshgrid(-1.1:0.2:1.1);quiver(-X, Y);axis image;

[X, Y] = meshgrid(-2:0.2:2);Z = (X+Y) .* exp(-X.^2 - Y.^2);[dX,dY] = gradient(Z, 0.5, 0.5);contour(X, Y, Z, 10);hold on;quiver(X, Y, dX, dY);hold off;

24

Page 25: Lec 07. Graphs II

MATLAB Programming

quiver

quiver( X, Y, U, V )• velocity vector (x, y)의 위치에서 (u, v) 방향의 화살표로 나타냄

quiver( U, V )• velocity vector를 (u, v) 방향의 화살표로 나타냄• 각 화살표는 x-y 평면 상에 균등하게 배치됨

quiver( U, V, S ) 또는 quiver( X, Y, U, V, S )• 화살표를 S 크기 만큼 rescaling

quiver( … , LINESPEC )• 화살표의 선 모양을 설정• eg)

[X, Y] = meshgrid(-1.1:0.2:1.1);quiver( -X, Y, ‘LineWidth’, 3 );axis image;

25

Page 26: Lec 07. Graphs II

MATLAB Programming

quiver3

quiver( X, Y, Z, U, V, W )• velocity vector (x, y, z)의 위치에서 (u, v, w) 방향의 화살표로 나타냄

[x,y] = meshgrid(-2:.2:2,-1:.15:1);z = x .* exp(-x.^2 - y.^2);[u,v,w] = surfnorm(x,y,z);quiver3(x,y,z,u,v,w);hold on;surf(x,y,z)hold off

26

Page 27: Lec 07. Graphs II

MATLAB Programming

sphere

[X, Y, Z] = sphere()• 원 surface의 패치를 의미하는 (N+1) x (N+1) 행렬• 기본값으로 N = 20 설정

[X, Y, Z] = sphere( N )• 설정한 N 값 만큼 (N+1) x (N+1) 행렬

>> [X, Y, Z] = sphere();>> surf(X, Y, Z)

패치

27

Page 28: Lec 07. Graphs II

MATLAB Programming

ellipsoid

[X, Y, Z] = ellipsoid( XC, YC, ZC, XR, YR, ZR, N)• 타원의 중심이 (XC, YC, ZC) 이며 각 축별 반지름이 각각 XR, YR, ZR• 타원의 surface의 패치를 의미하는 (N+1) x (N+1) 행렬을 리턴

>> [X, Y, Z] = ellipsoid(0, 0, 0, 8, 4, 2);>> surf( X, Y, Z )>> axis image>> figure;>> mesh( X, Y, Z )

28

Page 29: Lec 07. Graphs II

MATLAB Programming

cylinder

[X, Y, Z] = cylinder( R, N )• 실린더의 높이 (z축)을 균등하게 분할하고, 벡터 R의 각 값을 해당 분할지점의 반지름으로 하는 실린더를 그림

>> t = 0:pi/2:2*pi;>> [X,Y,Z] = cylinder(1+cos(t).*sin(2*t));>> surf(X,Y,Z)

1+cos(t).*sin(t) 그래프가 z축의모양

29

Page 30: Lec 07. Graphs II

MATLAB Programming

surfnorm

[Nx, Ny, Nz] = surfnorm( X, Y, Z )• Normal vector [Nx, Ny, Nz]를 반환

>> t = 0:pi/10:2*pi;>> [X,Y,Z] = cylinder(1+cos(t).*sin(2*t));>> surfnorm(X,Y,Z)

30

Page 31: Lec 07. Graphs II

MATLAB Programming

colormap

함수 그래프에 색을 부여할 때 사용되는 색들의 스펙트럼

내장 컬러맵• hsv, hot, gray, bone, copper, pink, white, flag, lines, colorcube, jet,

prism, cool, autumn, spring, winter, summer

hsv spring coolwhite

>> surf(peaks(30))>> colormap('hsv')

31

Page 32: Lec 07. Graphs II

MATLAB Programming

comet: trajectory plot

comet(x, y)• 2차원 그래프에 대해 trajectory plot

comet3(x, y, z)• 3차원 그래프에 대해 trajectory plot

>> t = -pi:pi/2000:pi;>> comet(t,tan(sin(t))-sin(tan(t)))

>> t = -pi:pi/500:pi;>> comet3(sin(5*t),cos(3*t),t)

32

Page 33: Lec 07. Graphs II

MATLAB Programming

Volume 시각화

𝑽𝑽 = 𝒇𝒇(𝑿𝑿,𝒀𝒀,𝒁𝒁)인 함수에 대한 시각화

• slice

– Volume을 X-Y, Y-Z, X-Z 평면으로 잘라서 색상 또는 등고선 정보를

보여주는 시각화 기법

• isosurface

– Volume에서, 함수 값 V = τ인표면을보여주는시각화방법

33

Page 34: Lec 07. Graphs II

MATLAB Programming

Volume 시각화: slice

𝑽𝑽 = 𝒇𝒇(𝑿𝑿,𝒀𝒀,𝒁𝒁)인 3변수 함수 시각화• V 값은 (X, Y, Z) 좌표에서 색상으로 표현할 수 있음• Volume의 각 지점에 대해 함수 값이 정의되므로, 오브젝트 내부의 함수 값을보기 위해서는 X-Y 평면, X-Z 평면, Y-Z 평면 등으로 잘라서 봐야 함

x = linspace(-3, 3, 15);y = 1:20;z = -5:5;

[X, Y, Z] = meshgrid(x, y, z);

V = sqrt( X.^2 + Y.^2 + Z.^2 );slice( X, Y, Z, V, 0, 5, -3);

xlabel('x-axis');ylabel('y-axis');zlabel('z-axis');

34

Page 35: Lec 07. Graphs II

MATLAB Programming

Volume 시각화: slice

• 벡터 값을 설정하면 여러 slice의 값을 동시에 보여줌

x = linspace(-3, 3, 15);y = 1:20;z = -5:5;

[X, Y, Z] = meshgrid(x, y, z);

V = sqrt( X.^2 + Y.^2 + Z.^2 );slice( X, Y, Z, V, [0 3], [5 17], [-3 1]);

xlabel('x-axis');ylabel('y-axis');zlabel('z-axis');

35

Page 36: Lec 07. Graphs II

MATLAB Programming

Volume 시각화: slice

각 슬라이스에서 contour 그리기

x = linspace(-3, 3, 15);y = 1:20;z = -5:5;

[X, Y, Z] = meshgrid(x, y, z);

V = sqrt( X.^2 + Y.^2 + Z.^2 );slice( X, Y, Z, V, [1 3], 5, 2);h = contourslice( X, Y, Z, V, 3, 5, 2);set(h, 'edgecolor', 'k', 'linewidth', 1.5);

xlabel('x-axis');ylabel('y-axis');zlabel('z-axis');

36

Page 37: Lec 07. Graphs II

MATLAB Programming

Volume 시각화: isosurface

isosurface( X, Y, Z, V, isovalue)

• isovalue에 해당하는 surface를 그림

x = linspace(-3, 3, 15);y = 1:20;z = -5:5;

[X, Y, Z] = meshgrid(x, y, z);

V = sqrt( X.^2 + Y.^2 + Z.^2 );

isosurface(X, Y, Z, V, 1.5)isosurface(X, Y, Z, V, 2.5)isosurface(X, Y, Z, V, 4)

grid on

37

Page 38: Lec 07. Graphs II

MATLAB Programming

Text Object

h = text(x, y, ‘string’)• 2차원 그래프에서 주어진 좌표 (x, y)에 문자열을 출력

h = text(x, y, z, ‘string’)• 3차원 그래프에서 주어진 좌표 (x, y, z)에 문자열 출력

h = text(x, y, z, ‘propertyname’, ‘propertyvalue’)• 주어진 좌표 (x, y, z)에 특성을 설정• 2차원의 경우 x, y만 기술함

t = 0:900;plot(t, .25 * exp(-0.005 * t));text(300, 0.25*exp(-0.005*300), 't=300')

38

Page 39: Lec 07. Graphs II

MATLAB Programming

Font 종류 변경

text(300, 0.25*exp(-0.005*300), ‘\bf\it\fontname(times}t=300')

font 종류 속성

\bf bold\it italic\sl oblique\rm normal

\fontname{fontname} font

39

Page 40: Lec 07. Graphs II

MATLAB Programming

특수 문자

위첨자 : ^ 아래첨자: _ font 크기: \fontsize{}

그리스 문자: \alpha, \beta,\gamma, \delta, \epsilon,…

x = 0:0.1:2;y = sin(x);plot(x, y, 'o', x, cos(x), ':');title('Comparison between sin(\omega_0

{\it t}) wave and cos(\omega_0 {\it t})');xlabel('time in second [{\bf time}]');ylabel('amplitude [{\bf Volt}]');

40

Page 41: Lec 07. Graphs II

MATLAB Programming

Patch

꼭지점들로 이루어지는 닫힌 공간 (또는 면)

• 조각의 모서리: 꼭지점들 사이의 선

• 조각의 면: 꼭지점들을 연결한 선들로 쌓여진 영역

언제 사용하나?

• 함수로 그릴 수 없는 복잡한 도형 (또는 입체 오브젝트)를 그릴 때

Adrien Maglo, et al., Progressive compression of manifold polygon meshes, SMI 2012 41

Page 42: Lec 07. Graphs II

MATLAB Programming

Patch

2차원 Patch

x = [0 1 1 0];

y = [0 0 1 1];

patch(x, y, 'r')

axis([-1.5 2 -1.5 2]);

(0,0) (1,0)

(1,1)(0,1)

42

Page 43: Lec 07. Graphs II

MATLAB Programming

Patch

시작 꼭지점과 마지막 꼭지점이 동일하지 않을 때

• 두 꼭지점을 연결한 닫힌 영역을 생성

• 꼭지점들 간의 연결 순서에 따라 경계선들이 교차할 수 있음

x = [0 1 0 2];

y = [0 0 1 0.5];

patch(x, y, 'b');

43

Page 44: Lec 07. Graphs II

MATLAB Programming

Patch

경계선들이 교차하는 patch

x = [0 0.5 0.5 0.4 0.5 0.6 0.5 0.5 1 0.5];

y = [0 0 0.1 0.2 0.3 0.2 0.1 0 0 1];

patch(x, y, 'r');

44

Page 45: Lec 07. Graphs II

MATLAB Programming

Patch

여러 Patch가 겹쳐지는 경우

• 나중에 그려진 patch가 먼저 그려진 patch를 덮음

x1 = [0 1 1 0];

y1 = [0 0 1 1];

x2 = x1 + 0.5;

y2 = y1 + 0.5;

patch(x1, y1, 'r');

patch(x2, y2, 'y');

45

Page 46: Lec 07. Graphs II

MATLAB Programming

3차원 Patch

각 꼭지점에 해당하는 x, y, z 값을 함께 설정

xt = [ 0 1 0.5 ];

yt = [ 0 0 1 ];

zt = [ 0 0 1 ];

patch(xt, yt, zt, 'r')

view(3)

box

xlabel x, ylabel y, zlabel z

46

Page 47: Lec 07. Graphs II

MATLAB Programming

3차원 Patch

평면에 위치하지 않는 4개의 점으로 구성되는 Patch

x = [0 1 1 0];y = [0 0 1 1];z = [0 0 0 1];subplot(1,2,1);patch(x,y,z,'b');view(-40,10); box;xlabel x, ylabel y, zlabel z;subplot(1,2,2);patch(x,y,z,'r');view(33,30); box;xlabel x; ylabel y; zlabel z;

47

Page 48: Lec 07. Graphs II

MATLAB Programming

3차원 Patch

복잡한 3차원 객체는 교차하지 않는 3차원 조각들로부터 구성

• 삼각뿔 모양의 객체

• 변수 x, y, z의 각 행이 하나의 삼각형 조각을 구성

x = [0 0 0.5 0; 0.5 0.5 1 1; 1 0.5 0.5 0.5];y = [0 0 1 0; 1 1 0 0; 0 0.5 0.5 0.5];z = [0 0 0 0; 0 0 0 0; 0 1 1 1];patch(x,y,z,'r');xlabel x, ylabel y, zlabel z;view(3); box;

x =0 0 0.5000 0

0.5000 0.5000 1.0000 1.00001.0000 0.5000 0.5000 0.5000

y =0 0 1.0000 0

1.0000 1.0000 0 00 0.5000 0.5000 0.5000

z =0 0 0 00 0 0 00 1 1 1 48

Page 49: Lec 07. Graphs II

MATLAB Programming

다면체 조각 구성

꼭지점과 모서리들의 행렬로 정의

• 각 행이 꼭지점, 꼭지점으로 이루어지는 모서리

vm = [0 0 0; % 꼭지점 10.5 1 0; % 꼭지점 2

1 0 0; % 꼭지점 30.5 0.5 1]; % 꼭지점 4

fm = [1 2 3; % 1,2,3 꼭지점으로이루어지는모서리

1 2 4;2 3 4;1 3 4];

patch('Vertices', vm, 'Faces', fm, 'FaceColor', 'g');view(162, 44);box;xlabel x, ylabel y, zlabel z;

49

Page 50: Lec 07. Graphs II

MATLAB Programming

Patch Face Color

vm = [0 0; 0 1; 1 1; 1 0];

fm = [1 2 3 4];

h = patch('Vertices', vm, 'Faces', fm, 'FaceColor', 'g');

T = [1 2 3 4];

set(h, 'FaceVertexCData', T', 'FaceColor', 'interp', 'EdgeColor', 'none');

50

Page 51: Lec 07. Graphs II

MATLAB Programming

예제: 가열되는 파이프 면의 온도 분포

열원의 위치 (x,y,z) = (-0.5, 0, 0.25)

임의의 위치에서의 온도는 열원으로부터 반비례

• 𝑇𝑇 = ⁄1 (𝑥𝑥 + 0.5)2+𝑦𝑦2 + (𝑧𝑧 − 0.25)2

N = 20;dt = 2*pi/N;t = 0:dt:(N-1)*dt;x = [cos(t) cos(t)];y = [sin(t) sin(t)];z = [zeros(size(t)) ones(size(t))];v = [x' y' z'];f = [1:N; N+1:2*N; [N+2:2*N N+1]; [2:N 1]]';h = patch('Vertices', v, 'Faces', f, 'FaceColor', 'g');xlabel x; ylabel y; zlabel z;

51

Page 52: Lec 07. Graphs II

MATLAB Programming

예제: 가열되는 파이프 면의 온도 분포

열원의 위치 (x,y,z) = (-0.5, 0, 0.25)

임의의 위치에서의 온도는 열원으로부터 반비례

• 𝑇𝑇 = ⁄1 (𝑥𝑥 + 0.5)2+𝑦𝑦2 + (𝑧𝑧 − 0.25)2

dist = sqrt((x+0.5).^2 + y.^2 + (z-0.25).^2);T = 1./dist;colormap(hot);set(h, 'FaceVertexCData', T', …

'FaceColor', 'interp', 'EdgeColor', 'none');

52

Page 53: Lec 07. Graphs II

MATLAB Programming

예제: 스트레스를 받는 케이블

한번 뒤틀린 나사 모양의 케이블이 받는 스트레스를 색상으로 표시

t = linspace(0, 2*pi, 20);x = cos(t);y = t;z = sin(t);V = [x' y' z']; % 꼭지점행렬f = 1:20; % 면행렬fvc = summer(20);clfpatch('Vertices', V, 'Faces', f, 'FaceVertexCdata', fvc, ...

'FaceColor', 'interp', 'EdgeColor', 'r', 'Marker', 'o', ...'MarkerFaceColor', 'flat');

view(44, 18); axis equal; box;

53

Page 54: Lec 07. Graphs II

MATLAB Programming

Quiz

길이가 2m인 정사각형 모양의 철판이 있을 때, 열원이 아래와 같이

주어지는 경우 온도 분포를 시각화 해보자.

• 철판의 각 꼭지점은 (0, 0, 0), (2, 0, 0), (0, 0, 2), (2, 0, 2)

• 열원의 위치 (x,y,z) = (1, -0.5, 1)

열원은 철판의 중앙에서 0.5m 떨어진 곳에 위치

• 임의의 위치에서 온도는 열원으로부터 반비례

𝑇𝑇 = ⁄1 (𝑥𝑥 − 1)2+(𝑦𝑦 + 0.5)2+(𝑧𝑧 − 1)2

• 문제를 풀 때 주의할 점!

• 열원이 정사각형의 중앙에 있으므로,

patch를 하나만 사용하는 경우에는

열원과 각 꼭지점 간의 거리가 동일!

• 따라서 오른쪽과 같은 시각화가 안됨!!

54

Page 55: Lec 07. Graphs II

MATLAB Programming

Quiz Sol.

길이가 2m인 정사각형 모양의 철판이 있을 때, 열원이 아래와

같이 주어지는 경우 온도 분포를 시각화 해보자.

• 철판의 각 꼭지점은 (0, 0, 0), (2, 0, 0), (0, 0, 2), (2, 0, 2)

• 열원의 위치 (x,y,z) = (1, -0.5, 1)

x = [0:2 0:2 0:2];y = zeros(1, 9);z = [0 0 0 1 1 1 2 2 2];fm = [1 2 5 4; 2 3 6 5; 4 5 8 7; 5 6 9 8];vm = [x' y' z'];

h = patch('Vertices', vm, 'Faces', fm, 'FaceColor', 'g');xlabel x; ylabel y; zlabel z;

dist = sqrt((x-1).^2 + (y+0.5).^2 + (z-1).^2);T = 1./dist;colormap(hot);set(h, 'FaceVertexCData', T', 'FaceColor', 'interp', 'EdgeColor', 'none');view(30, 30)grid on;

55