지난 주(2017년 3월 23~24)에 있었던 IDL New Graphics 정규 교육은 규모는 비교적 아담한 편이었지만 매우 밀도있고 열띤 분위기 속에서 진행되었습니다. 사진 촬영을 미처 못하는 바람에 교육 현장 사진들을 못올리게 되어 아쉽지만, 참석해주신 분들께 다시 한번 감사드립니다.
제가 교육을 진행하면서 그리고 진행한 후 가만 생각을 해보니, 이 블로그에서 미처 다루지 못했던 흥미로운 이슈들이 여전히 존재함을 깨닫게 되었습니다. 어차피 NG 교육 이후 첫 게시물이라 NG 관련 이슈를 다룰 생각인데, 오늘은 SURFACE 함수에 대한 간단한 소개를 해보고자 합니다. 제가 물론 다른 게시물에서 SURFACE를 사용한 적은 있었지만, SURFACE가 메인이 된 게시물이 하나도 없었다는 놀라운 사실을 이제서야 깨닫게 되었거든요.
SURFACE 함수는 IMAGE, CONTOUR 함수들과 더불어 2차원 데이터를 가시화하는 역할을 합니다. 예전 DG(Direct Graphics) 체계에서는 SURFACE 및 SHADE_SURF와 같은 프로시저형 명령들이 있었는데, 유사한 표출 기능을 NG 체계에서 바로 이 SURFACE 함수가 담당합니다. 사용법은 간단합니다. 다음과 같이 표출하고자 하는 2차원 배열을 인자로 부여하면 됩니다. 여기서는 HANNING 함수를 사용하여 50x50의 격자 구조를 갖고 화소값의 범위가 0~100인 가상의 2차원 데이터를 data라는 이름의 배열로 만들어 사용하였으며, 그 표출 결과는 다음 그림과 같습니다.
data = HANNING(50, 50)*100
win1 = WINDOW(DIMENSIONS=[500, 500])
sf1 = SURFACE(data, COLOR='pink', /CURRENT)
표출된 그림에서 알 수 있듯이 SURFACE는 원본 2차원 배열 내 값들의 고저를 Z축에 대응시켜 입체적으로 표현합니다. 또한 표면이 매끈하면서 약간 광택이 들어가 있는 것을 볼 수 있는데요. 이와 같은 표면 처리 및 광원 효과는 NG 체계의 SURFACE 함수에서는 기본적으로 구현해줍니다. 사실 엄밀하게 따지만 SURFACE로 구현된 입체의 모습은 일종의 폴리곤(Polygon)의 형태인데, 이러한 폴리곤을 그래픽으로 구현하는데 있어서 몇몇 기법들이 자동적으로 반영된 모습이라고 보면 됩니다. 그리고 이 그림과 같이 매끈한 표면의 형태로 구현하는 방식을 Solid Rendering이라고 합니다. 그런데 이러한 매끈한 표면이 아닌 다른 형태의 구현도 가능합니다. 예를 들어 다음과 같이 SURFACE 함수에서 STYLE이라는 속성을 추가로 사용하여 이 값을 1로 설정해 봅시다.
win2 = WINDOW(DIMENSIONS=[500, 500])
sf2 = SURFACE(data, COLOR='pink', STYLE=1, /CURRENT)
tx2 = TEXT(0.5, 0.91, 'STYLE = 1', ALIGNMENT=0.5, FONT_SIZE=20, /NORMAL)
여기서는 TEXT 함수를 추가적으로 사용하여, 이미 SURFACE로 표출된 그림의 가운데 상단에 캡션 문자도 삽입하였습니다. 이 결과는 다음 그림과 같습니다.
앞서 표출했던 모습과는 매우 다른데요. 마치 그물망을 짜놓은 듯한 느낌의 구현 방식이라서 실제로도 Mesh Rendering이라는 용어로 부르는 구현 기법입니다. 이와 같은 그물망 구현 방식을 사용하면 원본 2차원 데이터의 격자 구조를 잘 볼 수 있는 입체의 형태로 볼 수 있다는 특징이 있습니다. 이번에는 다음과 같이 STYLE 속성의 값만 0으로 변경해 봅시다. 그 결과는 다음 그림과 같습니다.
win2 = WINDOW(DIMENSIONS=[500, 500])
sf2 = SURFACE(data, COLOR='pink', STYLE=0, /CURRENT)
tx2 = TEXT(0.5, 0.91, 'STYLE = 0', ALIGNMENT=0.5, FONT_SIZE=20, /NORMAL)
이 그림은 아까와는 또 다른 방식인데, 각 격자점들을 점의 형태로만 구현한 것으로 Point Rendering이라고 부릅니다. 여기서 사용되고있는STYLE 속성에 대하여 다른 값을 적용해보면 나름 다양한 형태의 표출이 가능합니다. 이 속성의 디폴트값은 2입니다. 우리가 맨 처음에 본 매끈한 표면 형태의 구현 방식이 바로 이 값에 해당됩니다. 이번에는 좀 색다른 표출을 해보기 위하여 STYLE의 값을 다음과 같이 6으로 설정해 봅시다. 그 결과는 다음 그림과 같습니다.
win2 = WINDOW(DIMENSIONS=[500, 500])
sf2 = SURFACE(data, COLOR='pink', STYLE=6, /CURRENT)
tx2 = TEXT(0.5, 0.91, 'STYLE = 6', ALIGNMENT=0.5, FONT_SIZE=20, /NORMAL)
이 그림을 보면 각 격자를 나무막대와 같은 형태로 구현한 모습인데, 마치 레고 블록을 쌓아놓은 듯한 모습으로 보이기도 합니다. 실제로이러한 방식을 Lego Rendering이라고 부릅니다. 사용된 2차원 데이터의 격자 갯수가 많지 않은 상태에서 각 격자의 값을 불연속적인 나무막대와 같은 형태로 나타낼 때 유용한 방법일 것 같습니다.
이번에는 약간 색다른 표출 방식으로서, 다음과 같이 CONTOUR 함수를 추가적으로 사용하여 동일한 2차원 데이터에 대한 등위선의 모습을 중첩하여 표출해 봅시다. 여기서 말하는 "중첩"은 2차원 평면상의 중첩이긴 한데, SURFACE는 XYZ축들로 이루어진 3차원 공간입니다. 따라서 이 XYZ 3차원 공간상에서 XY 평면의 형태로 중첩됩니다. 그런데 아래 예제 코드에서는 이 XY 평면의 위치를 Z축상의 100이란 값에 위치시켰습니다. 이를 위하여 CONTOUR 함수의 ZVALUE 속성을 사용하였으며, 결국 등위선이 존재하는 XY 평면을 Z축에서 가장 높은 위치로 올린 셈입니다.
win3 = WINDOW(DIMENSIONS=[500, 500])
sf3 = SURFACE(data, COLOR='pink', /CURRENT)
cno = CONTOUR(data, COLOR='dodger blue', ZVALUE=100, C_VALUE=[20, 40, 60, 80], $
C_LABEL_SHOW=1, C_THICK=2, /OVERPLOT)
따라서 이 코드를 실행하면 다음 그림과 같은 모습을 볼 수 있게 됩니다.
우리가 2차원 데이터를 표출하는데 있어서 이미지와 등위선을 중첩하는 경우는 꽤 있지만, 이와 같이 서피스와 등위선을 중첩하는 경우가 자주 있지는 않은 것으로 알고 있습니다. 하지만 이러한 중첩을 위와 같이 비교적 간단한 문법만으로 구현해볼 수 있으며 그 결과도 나름 괜찮게 표출되는 것 같습니다. 여러분이 갖고 계신 2차원 데이터도 이와 같은 방식으로 표출해보면 어떨까요?
SURFACE 함수의 사용법에 관해서는 제가 한번 정도 더 소개할 생각입니다. 기대해주시기 바랍니다.
'IDL > New Graphics' 카테고리의 다른 글
IMAGE and CONTOUR in NG [1] (0) | 2017.04.07 |
---|---|
SURFACE 함수 소개 [2] (0) | 2017.03.31 |
PLOT3D에서 육면체(Cube) 심볼을 사용해보자 (0) | 2017.02.13 |
IDL 8.6 NG 체계의 폰트 관련 변경 사항 (0) | 2017.02.02 |
ELLIPSE 함수의 사용에 있어 주의할 점 (0) | 2016.04.28 |