지난 회에 이어서 VOLUME 함수를 이용한 3차원 볼륨 자료의 가시화에 관한 내용을 계속 소개합니다. 지난 회에는 3차원 격자의 구조를 갖는 복셀(Voxel) 기반의 자료를 VOLUME 함수를 사용하여 표출해보았습니다. 오늘은 3차원 볼륨을 특정한 평면으로 잘라낸 단면도를 보기로 합니다. 먼저 어떤 방향의 평면으로 할 것인지를 정해야 합니다. 여기서는 XY평면, 즉 Z축에 수직한 평면을 사용하겠습니다. 평면의 Z좌표는 30으로 합니다. 이 예제 자료가 80X100X57의 구조를 갖는 배열이므로, Z좌표가 30이면 Z축상으로 거의 중간 지점쯤에 해당됩니다. 그러면 이 평면이 구체적으로 어디쯤에 위치하는 평면인가를 가시적으로 나타내기 위하여 다음과 같이 POLYGON이란 함수를 사용하여 직접 표출해보았습니다. 그 모습은 다음 그림과 같습니다.
z_val = 30
plane = POLYGON([0, 80, 80, 0, 0], [0, 0, 100, 100, 0], REPLICATE(z_val, 5), FILL_COLOR='gold', FILL_TRANSPARENCY=50, /DATA)
여기서는 Z축상의 평면의 위치인 30을 z_val이라는 변수에 담았습니다. 그리고 평면의 모습을 생성하기 위하여 사용된 POLYGON 함수에는 평면에 해당되는 사각형의 꼭지점들의 X, Y, Z축 좌표들이 순서대로 주어져 있습니다. 평면의 내부는 금색(gold)으로 채웠으며, 평면으로 가려진 볼륨의 모습도 볼 수 있도록 50%의 투명도가 적용된 상태입니다. 사실 단면도만 얻을 목적이라면 굳이 이러한 평면은 그리지 않아도 되지만, 설명을 위하여 한번 그려보았습니다.
단면의 위치는 눈으로 확인을 했고, 실제 이 단면도의 모습을 별도의 그래픽창에 그려보기로 하겠습니다. 단면에 해당되는 2차원 이미지 자료는 다음과 같은 배열 인덱싱에 의하여 얻을 수 있습니다. 그리고 IMAGE 함수를 사용하여 이 이미지를 표출해보았는데, 그 결과는 다음 그림과 같습니다.
img = REFORM(data[*, *, z_val])
im = IMAGE(img, RGB_TABLE=ct, MARGIN=0.1)
여기서 배열 인덱싱을 하면서 REFORM이란 함수를 사용한 이유는, 인덱싱의 결과로 얻어지는 배열의 구조가 80X100X1이 아닌 80X100이 되도록 하기 위함입니다. 그리고 IMAGE 함수에서는 앞서 VOLUME 함수에서 사용되었던 컬러테이블을 그대로 사용하되, 속성의 이름은 RGB_TABLE임을 유의해야 합니다.
볼륨자료의 단면도를 보는 방법은 이 정도면 충분한 설명이 되었다고 생각합니다. 다만, 좀 더 재미있는 장난을 쳐보기로 하겠습니다. 다음과 같은 내용을 예제코드에 추가하여 실행을 해보세요. 그러면 XY평면의 Z축 좌표가 10에서 50까지 연속적으로 바뀌면서, 단면도의 모습이 그 Z좌표에 맞도록 순차적으로 변하는 것을 볼 수 있습니다. NG체계의 그래픽 속성의 변경에 의하여 구현 가능한 재미있는 표출 방법 정도로 생각하면 좋을 것 같습니다.
FOR i = 10, 50 DO BEGIN
z_val = i
plane.SetData, [0, 80, 80, 0, 0], [0, 0, 100, 100, 0], REPLICATE(z_val, 5)
img = REFORM(data[*, *, z_val])
im.SetData, img
ENDFOR
다음 그림은 위 프로그램에 의하여 단면도가 변하는 모습을 제가 그냥 애니메이션 GIF로 만들어본 것입니다. 그러면 VOLUME 함수에 관한 소개는 이 정도로 마무리하겠습니다.
'IDL > New Graphics' 카테고리의 다른 글
PLOT3D를 좀 더 3차원스럽게 그려보려면? (0) | 2014.01.20 |
---|---|
IDL에서 동영상 제작 및 유튜브 업로드 (0) | 2014.01.15 |
VOLUME 함수의 활용 [1] (0) | 2013.07.09 |
NG 체계에서 산포도(Scatter Plot) 그리기 (0) | 2013.05.22 |
NG 체계에서 특수문자의 사용법 (0) | 2013.05.15 |