matlab graphs ii - kaist it academy web service v 2.0 · pdf file ·...
TRANSCRIPT
MATLAB의 3D Plotting 원리
2
…
…
…
… … … … …
…
…
…
…
… … … … …
…
plot3
3
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)는 각각 벡터의 원소 간 곱이므로, “.*” 로 곱셈해야 함
몇 가지 properties
4
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 )
몇 가지 properties
5
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’ );
mesh
6
…
…
…
… … … … …
…
…
…
…
… … … … …
…
[X, Y] = meshgrid(-2:0.25:2);
Z = X .* exp(-X.^2 - Y.^2);
mesh( X, Y, Z );
mesh
7
…
…
…
… … … … …
…
…
…
…
… … … … …
…
>> [X, Y] = meshgrid(1:1:3, 5:1:10)
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
벡터 x의 길이만큼 행 생성
벡터 y의 길이만큼 행 생성
mesh
[X,Y] = meshgrid(x, y) • 주어진 벡터 x를 행렬 x에 대한 각각의 행으로 취함
• 벡터 y를 행렬 Y에 대한 각각의 열로 취함
8
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
meshc, meshz 함수
meshc( X, Y, Z ) • 등고선(contour) 정보를 함께 보여줌
meshz( X, Y, Z ) • mesh 함수와 동일하나, 커튼(curtain) 형태로 표시함
9
[X, Y] = meshgrid(-2:0.25:2);
Z = X .* exp(-X.^2 - Y.^2);
meshc( X, Y, Z );
figure;
meshz( X, Y, Z );
surf, surfc
surf( X, Y, Z ) • mesh와 동일하나, mesh 함수로부터 얻어진 각 격자에 색이 칠해진 그래프
surfc( X, Y, Z ) • surf 함수와 등고선(contour)을 함께 나타낸 그래프
10
[X, Y] = meshgrid(-2:0.25:2);
Z = X .* exp(-X.^2 - Y.^2);
surf( X, Y, Z );
figure;
surfc( X, Y, Z );
ezsurf vs. surf
두 함수는 용도가 서로 다름
• ezsurf 함수의 경우, 그래프의 방정식이 주어지는 경우에만 그래프를 그릴 수
있음
• surf 함수는 그래프의 방정식이 주어지지 않아도 수집한 데이터를 바탕으로
그래프를 그릴 수 있음
11
[X, Y, Z] = peaks;
% random noise를 줌
Z = Z + rand(size(Z));
surf(X,Y,Z)
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
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 함수를 이용하여 그려봅시다.
13
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;
surface color shading
shading • surface의 color shading mode를 결정
14
[X, Y, Z] = peaks();
surf( X, Y, Z );
>> shading faceted
>> shading interp
>> shading flat
NaN으로 불연속 곡선 그리기
NaN (Not a Number) 값을 가지는 부분은 그려지지 않고 hole로 남음
15
[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);
3D surf plot + NaN
3D 그래프에서 특정 조건을 만족하는 값들만으로 표시된 그래프 그리기 • 예) 함수 값이 1보다 크고 6보다 적은 부분만 표시
16
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)
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
contour
아래와 같이 함수 Z = f(X,Y)가 주어졌을 때,
18
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)
contour에 label 붙이기
clabel( C, h, v ) • contour 함수로부터 반환되는 contour matrix C, contour의 핸들 h, 벡터 v의
각 벡터 원소 vi에 대해 f(x, y) = vi인 등고선들의 값을 붙임
19
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);
마우스로 선택한 contour에 label 붙이기
clabel( C, h, ‘manual’ ) • contour 함수로부터 반환되는 contour matrix C, contour의 핸들 h, 벡터 v의
각 벡터 원소 vi에 대해 f(x, y) = vi인 등고선들의 값을 붙이는 것은 동일하나, 마우스로 클릭한 등고선에 대해서만 값을 text 로 출력해서 보여줌
20
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’ );
ezcontour vs. contour
ezcontour는 수식만으로 간단히 쉽게 그릴 수 있음
contour는 ezcontour보다 세밀한 등고선을 그릴 수 있음
21
vs
contour3
3차원 contour plot을 그려줌 • contour와 함수와 사용 방법 거의 동일
22
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);
contourf
contour plot을 그릴 때 등고선들 사이의 면들에 색을 넣어서 그림 • contour 함수와 사용법, 입출력 매개변수 등이 거의 동일
– contourf( X, Y, Z), contourf( X, Y, Z, k ), contourf( X, Y, Z, v)
23
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);
quiver: vector field plot
24
주로 사용하는 방법은 아래와 같이 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;
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)
25
[X, Y] = meshgrid(-1.1:0.2:1.1);
quiver( -X, Y, ‘LineWidth’, 3 );
axis image;
quiver3
quiver( X, Y, Z, U, V, W ) • velocity vector (x, y, z)의 위치에서 (u, v, w) 방향의 화살표로 나타냄
26
[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
sphere
[X, Y, Z] = sphere() • 원 surface의 패치를 의미하는 (N+1) x (N+1) 행렬
• 기본값으로 N = 20 설정
[X, Y, Z] = sphere( N ) • 설정한 N 값 만큼 (N+1) x (N+1) 행렬
27
>> [X, Y, Z] = sphere();
>> surf(X, Y, Z)
패치
ellipsoid
[X, Y, Z] = ellipsoid( XC, YC, ZC, XR, YR, ZR, N) • 타원의 중심이 (XC, YC, ZC) 이며 각 축별 반지름이 각각 XR, YR, ZR
• 타원의 surface의 패치를 의미하는 (N+1) x (N+1) 행렬을 리턴
28
>> [X, Y, Z] = ellipsoid(0, 0, 0, 8, 4, 2);
>> surf( X, Y, Z )
>> axis image
>> figure;
>> mesh( X, Y, Z )
cylinder
[X, Y, Z] = cylinder( R, N ) • 실린더의 높이 (z축)을 균등하게 분할하고, 벡터 R의 각 값을 해당 분할
지점의 반지름으로 하는 실린더를 그림
29
>> 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축의 모양
surfnorm
[Nx, Ny, Nz] = surfnorm( X, Y, Z ) • Normal vector [Nx, Ny, Nz]를 반환
30
>> t = 0:pi/10:2*pi;
>> [X,Y,Z] = cylinder(1+cos(t).*sin(2*t));
>> surfnorm(X,Y,Z)
colormap
함수 그래프에 색을 부여할 때 사용되는 색들의 스펙트럼
내장 컬러맵 • hsv, hot, gray, bone, copper, pink, white, flag, lines, colorcube, jet,
prism, cool, autumn, spring, winter, summer
31
hsv spring cool white
>> surf(peaks(30))
>> colormap('hsv')
comet: trajectory plot
comet(x, y) • 2차원 그래프에 대해 trajectory plot
comet3(x, y, z) • 3차원 그래프에 대해 trajectory plot
32
>> 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)
Volume 시각화
33
Volume 시각화: slice
34
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');
Volume 시각화: slice
• 벡터 값을 설정하면 여러 slice의 값을 동시에 보여줌
35
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');
Volume 시각화: slice
각 슬라이스에서 contour 그리기
36
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');
Volume 시각화: isosurface
isosurface( X, Y, Z, V, isovalue)
• isovalue에 해당하는 surface를 그림
37
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
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만 기술함
38
t = 0:900;
plot(t, .25 * exp(-0.005 * t));
text(300, 0.25*exp(-0.005*300), 't=300')
Font 종류 변경
39
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
특수 문자
위첨자 : ^
아래첨자: _
font 크기: \fontsize{}
그리스 문자: \alpha, \beta, \gamma, \delta, \epsilon, …
40
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}]');
Patch
꼭지점들로 이루어지는 닫힌 공간 (또는 면)
• 조각의 모서리: 꼭지점들 사이의 선
• 조각의 면: 꼭지점들을 연결한 선들로 쌓여진 영역
언제 사용하나?
• 함수로 그릴 수 없는 복잡한 도형 (또는 입체 오브젝트)를 그릴 때
41 Adrien Maglo, et al., Progressive compression of manifold polygon meshes, SMI 2012
Patch
2차원 Patch
42
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)
Patch
시작 꼭지점과 마지막 꼭지점이 동일하지 않을 때
• 두 꼭지점을 연결한 닫힌 영역을 생성
• 꼭지점들 간의 연결 순서에 따라 경계선들이 교차할 수 있음
43
x = [0 1 0 2];
y = [0 0 1 0.5];
patch(x, y, 'b');
Patch
경계선들이 교차하는 patch
44
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');
Patch
여러 Patch가 겹쳐지는 경우
• 나중에 그려진 patch가 먼저 그려진 patch를 덮음
45
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');
3차원 Patch
각 꼭지점에 해당하는 x, y, z 값을 함께 설정
46
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
3차원 Patch
평면에 위치하지 않는 4개의 점으로 구성되는 Patch
47
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;
3차원 Patch
복잡한 3차원 객체는 교차하지 않는 3차원 조각들로부터 구성
• 삼각뿔 모양의 객체
• 변수 x, y, z의 각 행이 하나의 삼각형 조각을 구성
48
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.0000
1.0000 0.5000 0.5000 0.5000
y =
0 0 1.0000 0
1.0000 1.0000 0 0
0 0.5000 0.5000 0.5000
z =
0 0 0 0
0 0 0 0
0 1 1 1
다면체 조각 구성
꼭지점과 모서리들의 행렬로 정의
• 각 행이 꼭지점, 꼭지점으로 이루어지는 모서리
49
vm = [0 0 0; % 꼭지점 1
0.5 1 0; % 꼭지점 2
1 0 0; % 꼭지점 3
0.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;
Patch Face Color
50
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');
예제: 가열되는 파이프 면의 온도 분포
51
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;
예제: 가열되는 파이프 면의 온도 분포
52
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');
예제: 스트레스를 받는 케이블
한번 뒤틀린 나사 모양의 케이블이 받는 스트레스를 색상으로 표시
53
t = linspace(0, 2*pi, 20);
x = cos(t);
y = t;
z = sin(t);
V = [x' y' z']; % 꼭지점 행렬
f = 1:20; % 면 행렬
fvc = summer(20);
clf
patch('Vertices', V, 'Faces', f, 'FaceVertexCdata', fvc, ...
'FaceColor', 'interp', 'EdgeColor', 'r', 'Marker', 'o', ...
'MarkerFaceColor', 'flat');
view(44, 18); axis equal; box;
Quiz
54
Quiz Sol.
길이가 2m인 정사각형 모양의 철판이 있을 때, 열원이 아래와
같이 주어지는 경우 온도 분포를 시각화 해보자.
• 철판의 각 꼭지점은 (0, 0, 0), (2, 0, 0), (0, 0, 2), (2, 0, 2)
• 열원의 위치 (x,y,z) = (1, -0.5, 1)
55
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;