제 16장 3차원 모델링 -...
TRANSCRIPT
제 4 장
3차원 그래픽
3차원 곡선
• plot3: 3차원 공간에서 곡선을 그리는 기본적인 함수 • 형식: plot3(x1,y1,z1,s1, x2,y2,z2,s2, ....) • x ,y ,z 은 좌표를 나타내는 벡터나 행렬이며 s 은 보통 생략 가능 • plot3에서는 plot 함수에서와 동일하게 선 속성을 설정 가능 • plot3 함수는 일반적으로 하나의 3차원 변수를 나타내는 데에 적합 >> t = 0:pi/100:5*pi; >> w = plot3(sin(t),cos(t),t,'b'); >> title('Helix'), xlabel('sin(x)'), ylabel('cos(x)'), zlabel('t') >> grid on, text(0,0,0,'Origin')
-1-0.5
00.5
1
-1-0.5
0
0.510
5
10
15
20
sin(x)
Origin
Helix
cos(x)
t•Plot3의 간단한 사용
• ezplot3: ezplot의 3차원 버전 >> ezplot3('cos(2*pi*t)', 'sin(2*pi*t)', 't', [-2 2])
-1-0.5
00.5
1
-1-0.5
0
0.51
-2
-1
0
1
2
x
x = cos(2 π t), y = sin(2 π t), z = t
y
z
•Ezplot3을 이용한 나선모양의 곡선
3차원 공간의 면
• 3차원 공간에서 면을 생성하는 두 가지의 기본적인 MATLAB 함수: mesh, surf
• mesh: 투명한 “격자” 공간을 생성, surf: 불투명하고 음영을 갖는 곡면을 생성
z=f(x,y) 형식의 곡면: mesh 함수
• MATLAB에서 의 그래프를 생성하는 경우 x, y는 축에 관한 배열정보, z는 행렬 정보를
필요로 하는데 이들은 meshgrid 함수에 의하여 생성
>> x=-3:3; y=1:5; [X,Y]=meshgrid(x,y) X = -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 Y = 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5
• meshgrid: 3D 그래프를 위한 X와 Y축의 좌표 배열을 만드는 역할을 수행 • 의 그래프를 그리기 위해서는 먼저 다음을 수행: >> Z = X.^2-Y.^2 Z = 8 3 0 -1 0 3 8 5 0 -3 -4 -3 0 5 0 -5 -8 -9 -8 -5 0 -7 -12 -15 -16 -15 -12 -7 -16 -21 -24 -25 -24 -21 -16
• 의 범위에서 “등마루 곡면” 는 다음으로부터 생성:
>> [X, Y] = meshgrid(-2:0.1:2, -2:0.1:2); >> Z = X.^2 - Y.^2; mesh(X, Y, Z)
•등마루 곡면
• mesh: z좌표의 점을 x-y 평면상의 직사각형으로 묶어 표시하는 함수 • mesh를 surf로 대체하면 불투명한 곡면을 얻음 • mesh 함수의 다양한 옵션: % meshUsage.m : mesh 함수의 옵션 clear all x = -2:0.1:2; y = -2:0.1:2; [X,Y] = meshgrid(x,y); Z = (X+Y).*exp(-X.^2-Y.^2); subplot(1,2,1) mesh(Z); hidden off % 투명한 곡면 title('transparent surface') subplot(1,2,2) meshc(X,Y,Z); % 곡면 아래의 x-y 평면에 수준곡선을 표시 title('surface with contour curves')
•곡면
파라미터 곡면: surf 함수 • 형태의 식으로 나타낼 수 없는 곡면(구 )을 도시할 경우: >> [Z, Theta] = meshgrid(-1:0.1:1, (0:0.1:2)*pi); >> X = sqrt(1 - Z.^2).*cos(Theta); >> Y = sqrt(1 - Z.^2).*sin(Theta); >> surf(X, Y, Z); axis square
-1-0.5
00.5
1
-1
-0.5
00.5
1-1
-0.5
0
0.5
1
•단위구
• surf: 선이 아닌 면에서 데이터를 취급 가능 • surf함수의 다양한 옵션: % surfusage.m : surf 곡면의 옵션 clear all x = -2:0.1:2; y = -2:0.1:2; [X,Y] = meshgrid(x,y); Z = (X+Y).*exp(-X.^2-Y.^2); subplot(2,2,1) surf(X,Y,Z); % surf에 의한 곡면 title('surface by surf') subplot(2,2,2) surf(X,Y,Z); shading flat % 격자선을 삭제 title('shading flat') subplot(2,2,3) surf(X,Y,Z); shading interp % 색의 변화를 부드럽게 title('shading interp')
•Surf 곡면의 여러가지 옵션
• cylinder 함수를 이용한 shading faceted 옵션: >> t = 0:pi/10:2*pi; >> [X,Y,Z] = cylinder(1+cos(t)); >> surf(X,Y,Z) >> axis square >> shading faceted
-2-1
01
2
-2
-1
01
20
0.2
0.4
0.6
0.8
1
•Cylinder 함수를 이용한 shading faceted 옵션
수준곡선
• 3차원 그래프를 평면 z=c로 절단하여 수준곡선 생성:
% contourcurve.m : 3차원 공간에서 수준곡선의 생성 clear all f = inline('10*x.^2 + y.^2', 'x', 'y'); x = -1:0.1:1; y = 0:0.1:4; [X,Y] = meshgrid(x,y); Z = f(X,Y); [r,c] = size(Z); c1=6; c2=12; c3=18; for i=1:r for j=1:c Z1(i,j)=c1; Z2(i,j)=c2; Z3(i,j)=c3; end end
subplot(1,2,1) % 크기 z = 6,12,18인 교차평면 surf(X,Y,Z) shading flat hold on mesh(X,Y,Z1), mesh(X,Y,Z2), mesh(X,Y,Z3) hold off title('(가) 크기 z = 6,12,18인 교차평면') subplot(1,2,2) % 해당되는 수준곡선 levels = [c1, c2, c3]; contour(X,Y,Z,levels,'k') title('(나) 해당되는 수준곡선')
• pcolor: 컬러맵의 색들에 해당되도록 x, y 평면에 색을 입힐 수 있음 % contourF.m : contour와 pcolor의 사용예 clear all x = -2:0.05:2; y = -2:0.05:3; [X,Y] = meshgrid(x,y); f = inline('6*exp(-3*x.^2-y.^2)+0.5*x+y','x','y'); Z = f(X,Y); pcolor(X,Y,Z) hold on contour(X,Y,Z,10,'k') xlabel(' x axis') ylabel(' y axis') hold off
• 의 수준 곡선
• contour3: 손쉽게 3차원 수준곡선을 나타낼 수 있음. contour3 함수의 4번째 파라미터는 나타낼 수준곡선들의 수를 표시.
>> x = -2:0.1:2; y = -2:0.1:2; >> [X,Y]=meshgrid(x,y); >> Z=(X+Y).*exp(-X.^2-Y.^2); >> contour3(X,Y,Z,16)
• contour3 대신 contour를 사용하면 수준곡선들이 3차원이 아닌 2차원의 형태
-2-1
01
2
-2-1
0
12
-1
-0.5
0
0.5
1
•Countour3를 이용한 3차원 수준곡선 표시
부피의 표현
• slice: 3차원 객체의 면들을 나타낼 수 있음. % sliceusage.m : slice 함수의 사용예 x = -2:0.2:2; y = -2:0.2:2; z = -2:0.2:2; [X,Y,Z] = meshgrid(x,y,z); V = sqrt(X.^2 + Y.^2 + Z.^2); slice(X,Y,Z,V,[-1.5 1.5 2],2,[-2 0])
Slice를 이용한 3차원 객체의 표현
3차원 애니메이션
• getframe: 동영상으로 변환. 완성된 동영상은 avi 파일로 저장 가능
% movieanim.m : z축 방향으로 늘어나는 애니메이션을 동영상화하는 보기 close all clear all figure;set(1,'doublebuffer','on'); t = 0:pi/100:5*pi; count=1; for k=0.1:0.01:1; plot3(sin(t),cos(t),k*t,'b') title('Helix'); xlabel('sin(x)'); ylabel('cos(x)'); zlabel('t') grid; text(0,0,0,'Origin'); zlim([0 20]) drawnow; M(count) = getframe(gcf); count = count+1; end disp('Please push any key to start movie') close all movie(M)
-1-0.5
00.5
1
-1-0.5
0
0.510
5
10
15
20
sin(x)
Origin
Helix
cos(x)
t
•movie2avi: 동영상을 avi 파일로 저장( ‘quality' 옵션: 화상 질의 설정을 변경) movie2avi(M,'helixcoil.avi','quality',100)
•3차원 애니메이션의 보기
컬러맵
• 컬러맵: 함수의 그래프에 색을 부여하는 수단. 색들의 스펙트럼.
• 기본 컬러맵은 jet로서 짙은 청색으로부터 초록, 노랑, 그리고 오렌지 색의 명암을 지
나 밝은 빨강색에 이름
• 명령어 surf를 사용시 그래프의 가장 낮은 부분에 짙은 청색, 가장 높은 부분에 밝은
빵강색들이 부여
• colorbar: 컬러맵의 색들의 범위와 z 좌표로 부여된 수치값들을 볼 때. 명암도와 수치
범위를 보여줌. 컬러맵의 색 할당으로 격자 상에서 함수의 최대 및 최소점들을 색깔
로 구별지을 수 있음.
• MATLAB 내장 컬러맵:
hsv hot gray bone copper pink white flag lines colorcube jet prism cool autumn spring winter summer
• gray: colormap(gray)에 의하여 기존의 컬러맵을 변경한다. 그래프의 가장 낮은 부분은 검정색이며 가장 높은 부분은 흰색이고 그 사이는 회색의 명암으로 나타남
% colormapexam.m : gray colormap 사용의 보기 [X,Y] = meshgrid(-1:0.1:2); f = inline('x + y + 3*exp(-x.^2 - y.^2)', 'x', 'y'); fx = inline('1 - 6*x.*exp(-x.^2 - y.^2)', 'x', 'y'); fy = inline('1 - 6*y.*exp(-x.^2 - y.^2)', 'x', 'y'); Z = f(X,Y); W = sqrt(fx(X,Y).^2 + fy(X,Y).^2); surf(X,Y,Z,W); colormap(gray); shading interp colorbar xlabel('x'), ylabel('y')
-1
0
1
2
-1
0
1
2-2
0
2
4
6
xy
0.5
1
1.5
2
2.5
3
3.5
•컬러맵 gray가 의 크기로 결정되는
의 그래프
시각(view point)의 설정
• light: surf로부터 생성된 곡면에 대해서 광원의 방향을 설정 • rotate3d: 3차원 도형을 마우스를 이용하여 회전시키고 임의의 방향에서 도형을 보는
것이 가능. 그림창 메뉴바에 있는 3차원 회전 아이콘 (Rotate 3D)을 클릭해도 동일한 기능을 수행
% lightsource.m : light 함수를 사용한 광원 방향의 설정 clear all x = -2:0.1:2; y = -2:0.1:2; [X,Y] = meshgrid(x,y); Z = (X+Y).*exp(-X.^2-Y.^2); surf(Z); shading interp light('Position',[1 -2 1]) rotate3d
•light 함수를 이용한 곡면 광원방향의 설정.
시각(view point)의 설정
• view: 그래픽 객체를 바라보는 시각 설정
• view(a,b): z-축을 중심으로 하는 시계 반대방향으로의 회전을 각도 a로 설정하고 수
직 높이를 각도 b로 설정. 기본값은 view(-37.5,30)
• view(2): 위에서 내려다본 곡면의 2D 모양을 제공. view(0,90)과 동일
>> plot(fft(eye(17))); view(3); grid
-1-0.5
00.5
1
-1-0.5
0
0.51
-1
-0.5
0
0.5
1
• view 함수의 사용 예.
• 재귀함수 M-파일 viewFractal.m을 이용하여 프랙탈 경치를 생성하고 스크립트 M-파
일 showFractal.m을 이용하여 viewFractal을 호출하여 생성되는 프랙탈 모양을 다양
한 시각에서 보이는 예:
% viewFractal.m : 프랙탈 모양의 구현 function B = viewFractal(A) % A: 차원이 N = 2^n +1 인 정방행렬로서 꼭지점에 위치한 4개 원소들을 % 입력 파라미터로 이용 N = size(A,1); d = (N+1)/2; level = log2(N-1); sf = 0.05*(2^(0.9*level)); B = A; B(d,d) = mean([A(1,1),A(1,N),A(N,1),A(N,N)]) + sf*randn; B(1,d) = mean([A(1,1),A(1,N)]) + sf*randn; B(d,1) = mean([A(1,1),A(N,1)]) + sf*randn; B(d,N) = mean([A(1,N),A(N,N)]) + sf*randn; B(N,d) = mean([A(N,1),A(N,N)]) + sf*randn; if N > 3 B(1:d,1:d) = viewFractal(B(1:d,1:d)); B(1:d,d:N) = viewFractal(B(1:d,d:N)); B(d:N,1:d) = viewFractal(B(d:N,1:d)); B(d:N,d:N) = viewFractal(B(d:N,d:N)); end
• viewFractal에서 취하는 기본 단계: 각 꼭지점에만 0이 아닌 원소가 있는 N x N 행렬
의 (1,d), (d,1), (d,d), (d,N) 및 (N,d) 위치를 아래와 같은 방식으로 채움으로써 보정하
여 주는 것. noise는 복수의 randn을 0이 아닌 각각의 새로운 원소에 추가함으로써
도입. 전체 행렬이 모두 채워질 때까지 각 꼭지점 부분이 0이 아닌 원소들로 정의되
는 4개의 정방형 부행렬들에 대하여 이 과정이 재귀적으로 반복. noise에 대한 척도
인자는 각 재귀단계 수준에서 만큼 감소. viewFractal(A)에서 입력인수 A는 차원이 인
정방행렬이며 A의 꼭지점 부분만이 결과에 영향을 미침
% showFractal.m : 프랙탈 모양을 여러 시각으로 제시 randn('state',10); k = 2^5+1; A = zeros(k); A([1 k], [1 k]) = [1 1.25; 1.1 2.0]; B = viewFractal(A); subplot(221), meshz(B) FS = 'FontSize' title('Default view',FS,12) Bval = max(B,mean(mean(B))); Bmin = min(min(Bval)); Bmax = max(max(Bval)); subplot(222), meshz(Bval) title('Default view',FS,12) subplot(223), meshz(Bval) view([-75 40]) axis([0 k 0 k Bmin Bmax]) title('view([-75 40])',FS,12) subplot(224), meshz(Bval) view([240 65]) axis([0 k 0 k Bmin Bmax]) title('view([240 65])',FS,12)
• (1,1) 위치의 첫 번째 부그래프는 기본적인 모양의 B
• (1,2) 위치의 두 번째 부그래프에서는 평균값보다 작은 모든 높이들을 올려 줌으로써
“바닥수준”을 부여. 데이터 행렬 Bval은 기본 모양으로도 도시
• (2,1) 및 (2,2) 위치의 세 번째 및 네 번째 부그래프에서는 각각 view([-75 40])과
view([240 65])가 이용
•프랙탈 경치보기
지정 그래프 영역의 추출
• find: 영역에 속하는 z 값의 지수들을 구하고 이 원소들을 기존의 곡면상에 나타냄 >> [x,y,z] = peaks; >> surfl(x,y,z) >> axis tight >> colormap(gray(64)) >> ind = find(2<=z & z<=4); >> size(ind) ans = 234 1 >> hold on >> plot3(x(ind),y(ind),z(ind),'.') -3
-2-1
01
23
-2
0
2
-6
-4
-2
0
2
4
6
8
• 범위의 곡면부분.
• view(2)에 의한 x-y 영역의 도시: >> view(2) >> shading flat
-3 -2 -1 0 1 2 3-3
-2
-1
0
1
2
3
•view(2)에 의한 x-y 영역의 도시.
• view(90,0)에 의한 z 영역의 도시: >> view(90,0) >> grid >> hold off
-3 -2 -1 0 1 2 3
-6
-4
-2
0
2
4
6
8
• view(90,0)에 의한 z 영역의 도시.
3차원 통계그래프
bar3와 bar3h 함수 • bar3 및 barh3: 2차원 막대그래프 함수인 bar 및 barh의 3차원 버전
• 사용 예(수능 등급별 학생수):
수능 등급 1반 2반 3반
1등급 5 7 4
2등급 12 11 15
3등급 19 20 17
4등급 7 6 5
5등급 2 1 3
% threeDbars.m : 여러 가지 막대그래프의 보기 clear all x = [1 2 3 4 5]; class1 = [5 12 19 7 2]'; % 열 벡터 class2 = [7 11 20 6 1]'; class3 = [4 15 17 5 3]'; y = [class1 class2 class3]; % 학생수 행렬 subplot(2,2,1), bar3(x,y); subplot(2,2,2), bar3h(x,y); subplot(2,2,3), bar3(x,y,'stack')
12
3
12
34
5
0
10
20
010
20
1
2
3
4
5
12
34
5
0
20
40
60
• 3차원 막대그래프.
pie3 함수
• pie3: 2차원 pie 함수의 3차원 버전 >> x = [1.5 3.4 4.2]; >> pie3(x,[0 1 0])
• 3차원 파이 차트.
MATLAB의 3차원 그래프 함수
함수 생성되는 그래프 함수 생성되는 그래프
plot3, ezplot3
간단한 x-y-z 그래프 waterfall
한쪽 방향으로의 선 격자
contour, ezcontour
등고선 그래프 bar3
3D 막대그래프
contourf, ezcontourf
속이 채워진 등고선 그래프
bar3h 3D 수평막대 그래프
contour3, ezcontour3
3D 등고선 그래프 pie3 3D 파이 차트
mesh, ezmesh 선 격자 표면 fill3 채워진 다각형
meshc, ezmeshc 등고선이 있는 선 격자 표면
comet3 3D 동영상화된 혜성모양의 그래프
meshz 커튼이 있는 선 격자 표면
scatter3 3D 분산 그래프
surf, ezsurf 채워진 표면 stem3 스템 그래프
surfc, ezsurfc
등고선이 있는 채워진 표면