우리가 NG 체계에서 그림 표출을 할 때, 다수의 그래픽 개체들이 한 판에 올라가도록 해야 하는 경우들이 종종 있습니다. 즉 기본이 되는 그림을 하나 표출해놓고 그 위에 다른 그래픽 요소들을 계속 중첩해가는 경우입니다. 이런 예제를 들자면 뭐 수도 없이 많겠지만, 제가 예전에 게시물로 올렸던 케이스 하나를 예로 들어보겠습니다. 해당 게시물의 링크는 다음과 같습니다.
https://swrush.tistory.com/678
이 예제에서는 다음과 같은 표출 결과를 얻게 되어있습니다.
이와 같이 서피스 기반의 그림 상에 지도, 이미지, 등위선 형태의 그림들을 중첩하는 과정입니다. 그리고 전체적인 과정에 해당되는 소스 프로그램은 다음과 같습니다.
PRO test_map_image_contour_3d
TIC
data = HANNING(400, 400)*100
add = FLTARR(400, 400)
add[200, 200] = HANNING(200, 200)*50
data = data+add
PRINT, MIN(data), MAX(data)
lons = 120+FINDGEN(400)*0.05
lats = 30+FINDGEN(400)*0.05
xx = INDGEN(10)
yy = INDGEN(10)
zz = INDGEN(10)
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
p = PLOT3D(xx, yy, zz, /NODATA, $
XRANGE=[120, 140], YRANGE=[30, 50], ZRANGE=[0, 1000], $
XMINOR=0, YMINOR=0, XTICKLEN=0, YTICKLEN=0, $
XSHOWTEXT=0, YSHOWTEXT=0, /CURRENT)
mg = MAPGRID(LONGITUDE_MIN=120, LONGITUDE_MAX=140, $
LATITUDE_MIN=30, LATITUDE_MAX=50, COLOR='black', $
LABEL_POSITION=0, LINESTYLE=1)
m = MAP('Geographic', LIMIT=[30, 120, 50, 140], /OVERPLOT)
mc = MAPCONTINENTS(FILL_COLOR='gold', /HIRES)
im = IMAGE(data, lons, lats, RGB_TABLE=34, $
MIN_VALUE=0, MAX_VALUE=100, $
CLIP=0, /OVERPLOT, ZVALUE=500)
cn = CONTOUR(data, lons, lats, RGB_TABLE=34, $
MIN_VALUE=0, MAX_VALUE=100, /FILL, $
CLIP=0, /OVERPLOT, ZVALUE=999)
cno = CONTOUR(data, lons, lats, COLOR='black', C_THICK=2, $
MIN_VALUE=0, MAX_VALUE=100, /OVERPLOT, ZVALUE=1000)
TOC
END
그런데 오늘의 촛점은 이 과정에 의하여 그림을 표출하는데 소요되는 시간입니다. 위의 내용을 하나의 IDL 프로그램 파일(test_map_image_contour.pro)로 저장하고 컴파일 및 실행을 해보면, 내부에 삽입된 TIC, TOC 명령들에 의하여 프로그램의 시작부터 종료까지 소요된 시간이 초 단위로 표시될 것입니다. 물론 이 프로그램을 실행하는 PC의 사양이라든지 여러 여건에 따라 유저마다 다르게 측정될 것입니다만, 제 경우에는 약 2.3초 정도 소요되는 것으로 측정됩니다. 물론 그리 긴 시간은 아니긴 합니다.
다만 NG 체계에서는 서로 다른 그래픽 요소들을 중첩할 경우라든지 아니면 표시할 그래픽 개체들의 갯수가 많아질 경우에는 전체적인 표출에 소요되는 시간이 제법 있는 편입니다. 아마 NG 체계에서 그림 표출 작업을 많이 하시는 유저들은 종종 겪으실 겁니다. 이것은 NG 체계의 특성상 어쩔 수 없는 부분도 분명히 있습니다. 하지만 여기서 조금 더 시간을 줄일 수 있는 방법이 하나 있는데 그것이 바로 오늘 소개할 Refresh 메서드입니다. Refresh 메서드는 원래 NG 체계에서는 거의 모든 주요 그래픽 함수들에서 지원이 됩니다. 다만 오늘은 WINDOW 함수로 구현되는 그래픽 창 자체에 대하여 이 메서드를 적용해보고자 합니다. 그러면 앞서 제시했던 예제 프로그램에서 이 메서드를 활용하는 부분들을 추가해보겠습니다. 그 내용은 다음과 같은데, Refresh 메서드가 사용된 부분은 붉은 색 폰트로 표시하였습니다.
PRO test_map_image_contour_3d
TIC
data = HANNING(400, 400)*100
add = FLTARR(400, 400)
add[200, 200] = HANNING(200, 200)*50
data = data+add
PRINT, MIN(data), MAX(data)
lons = 120+FINDGEN(400)*0.05
lats = 30+FINDGEN(400)*0.05
xx = INDGEN(10)
yy = INDGEN(10)
zz = INDGEN(10)
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
win.Refresh, /DISABLE
p = PLOT3D(xx, yy, zz, /NODATA, $
XRANGE=[120, 140], YRANGE=[30, 50], ZRANGE=[0, 1000], $
XMINOR=0, YMINOR=0, XTICKLEN=0, YTICKLEN=0, $
XSHOWTEXT=0, YSHOWTEXT=0, /CURRENT)
mg = MAPGRID(LONGITUDE_MIN=120, LONGITUDE_MAX=140, $
LATITUDE_MIN=30, LATITUDE_MAX=50, COLOR='black', $
LABEL_POSITION=0, LINESTYLE=1)
m = MAP('Geographic', LIMIT=[30, 120, 50, 140], /OVERPLOT)
mc = MAPCONTINENTS(FILL_COLOR='gold', /HIRES)
im = IMAGE(data, lons, lats, RGB_TABLE=34, $
MIN_VALUE=0, MAX_VALUE=100, $
CLIP=0, /OVERPLOT, ZVALUE=500)
cn = CONTOUR(data, lons, lats, RGB_TABLE=34, $
MIN_VALUE=0, MAX_VALUE=100, /FILL, $
CLIP=0, /OVERPLOT, ZVALUE=999)
cno = CONTOUR(data, lons, lats, COLOR='black', C_THICK=2, $
MIN_VALUE=0, MAX_VALUE=100, /OVERPLOT, ZVALUE=1000)
win.Refresh
TOC
END
이 내용을 보면 Refresh 메서드가 두 군데에서 사용된 것을 확인할 수 있습니다. 먼저 WINDOW 함수로 그래픽창을 생성한 직후에 윈도우 개체인 win에 대하여 Refresh 메서드를 /DISABLE 키워드와 함께 사용한 것이 보입니다. 이것은 말 그대로 그래픽창에 대하여 Refresh를 비활성화라는 뜻인데요. 세부적인 의미는 그래픽창에서 다양한 그래픽 요소들이 중첩되어가면서 그림이 변화하는 모습을 매번 리프레쉬해서 보여주는 동작을 해제하라는 의미입니다. 즉 다시 말하면, 그림이 계속 업데이트되면서 최종 결과에 이르는 전 과정을 일일이 다 보여주지 않고 그냥 최종적인 모습만 보여주라는 의미가 됩니다. 실제로 위와 같은 상태로 프로그램을 실행해보면, 정말로 최종 결과물 그림만 보여줄 뿐 그 중간 과정은 전혀 보여주지 않는다는 것을 확인할 수 있을 것입니다. 또한 이로 인하여 전체적인 표출에 소요되는 시간도 약간 단축됩니다. 제 경우에는 약 1.7~1.8 초 정도로 나오는데, 그 이전에 2.3초였던 것에 비하면 어느 정도 시간 단축의 효과가 있는 것으로 분명히 나타납니다. 그리고 프로그램의 후반부에서도 Refresh 메서드가 한번 더 사용이 된 것이 보이는데, 여기서는 별도의 키워드 없이 그냥 Refresh라는 문구만 있습니다. 이렇게 하면 원상 회복의 의미라고 보면 됩니다.
이와 같이 Refresh 메서드를 적절히 활용을 하면 NG 체계에서 그래픽 결과물을 얻는데 있어서 걸리는 소요시간은 어느 정도 절감하는 효과는 분명히 있습니다. 그리고 이러한 시간 절감 효과는 표시될 그래픽 요소들이 다양하고 많을수록 더 두드러지게 나타난다는 것이 중요합니다. 즉 이번 예제에서는 2.3초가 1.8초 정도로 단축되는 정도의 효과이지만, 작업의 규모가 클수록 그 절감효과가 더 큽니다. 따라서 NG 체계에서 그래픽 결과물을 얻어야하는데 그 과정이 너무 시간이 많이 걸린다 싶을 경우, 그리고 어차피 그 중간의 변화 과정들을 굳이 안봐도 된다면, 이와 같이 Refresh 메서드를 적극적으로 활용해보는 것도 나쁘지 않습니다. 저도 나중에 혹시 시간 절감의 효과가 더 두드러진 예제가 생기면 다시 한번 시간 비교를 해보도록 하겠습니다.
'IDL > New Graphics' 카테고리의 다른 글
축의 라벨 문자들의 회전 처리 (2) | 2024.02.05 |
---|---|
데이터 포인트들을 다양한 색상으로 표출하기 [2] (0) | 2023.07.31 |
데이터 포인트들을 다양한 색상으로 표출하기 [1] (9) | 2023.05.31 |
3차원 공간상에서 지도와 타 그래픽 요소의 중첩 표출 [2] (0) | 2023.03.13 |
3차원 공간상에서 지도와 타 그래픽 요소의 중첩 표출 [1] (0) | 2023.03.08 |