IDL/New Graphics

IDL 9.0의 그림 저장 문제에 관하여 [2]

이상우_idl 2024. 6. 25. 17:50
728x90
반응형

얼마전에 IDL 9.0의 NG 체계에서 그래픽 요소들이 중첩된 그림을 표출했을 때 중첩이 정상적으로 되지 않는 문제에 관한 게시물을 올린 바 있습니다. 그리고 이러한 문제점의 증상을 살펴보고, 만족스럽지는 않지만 나름의 대안도 함께 살펴보았는데요. 만족스럽지는 않지만 나름 써볼만한 괜찮은 대안이 있어서 오늘 소개해보고자 합니다. 일단 지난 게시물에서 제시했던 예제를 그대로 사용하면서 여기에 TEXT 함수로 문자를 삽입하는 내용까지 추가해보기로 합니다. 그 과정은 다음과 같습니다.

 

x = FINDGEN(101)
y = SQRT(x) + RANDOMU(-1, 101) * 2 - 1
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(x, y, THICK=2, FONT_SIZE=11, MARGIN=0.1, /CURRENT)
sym = SYMBOL(40, 6.8, 'circle', /SYM_FILLED, SYM_FILL_COLOR='tomato', SYM_SIZE=6, /DATA)

tx = TEXT(60, 8, 'ABCDEFG', COLOR='green', FILL_COLOR='gold', FONT_SIZE=24, /DATA)
win.Save, 'graphics_overlay.png', WIDTH=600

 

이러한 과정으로 표출된 그림에서 플롯의 표출 이후 중첩된 심볼이 플롯의 선(Line)을 덮어쓰지 않는 것이 문제점이었습니다. 그 모습은 다음과 같습니다. 물론 이 그림에서는 심볼 뿐 아니라 문자 역시 동일한 현상을 보입니다. 즉 심볼과 문자는 플롯보다 나중에 중첩되었지만 두 개체 모두 플롯 선을 덮어쓰지 않는 현상입니다.

 

그런데 위의 내용에서 PLOT 함수가 사용된 부분만 다음과 같이 수정해봅시다.

 

p = PLOT(x, y, THICK=2, ANTIALIAS=0, FONT_SIZE=11, MARGIN=0.1, /CURRENT)

 

즉 PLOT 함수에서 ANTIALIAS 속성을 사용하면서 그 값을 0으로 설정하는 것입니다. 이렇게 수정한 후 다시 실행해보면 결과는 다음 그림과 같습니다.

 

이 그림을 보면 나중에 중첩된 심볼과 문자가 플롯 선을 덮어쓴 것이 확인됩니다. 여기서 추가로 사용한 ANTIALIAS 속성은 플롯의 선(Line)을 표시할 때 Antialiasing 기법의 적용 여부를 결정하는 역할을 합니다. 원래 디폴트 값은 1이며 이 경우에는 Antialiasing 기법이 적용됩니다. 즉 이러한 기법이 적용되면 플롯의 선을 좀 더 매끈하게 보이도록 다듬어줍니다. 반대로 이 값을 0으로 설정하면 Antialiasing 기법이 적용되지 않게 되고 그러면 선이 좀 거칠고 투박하게 보이게 됩니다. 그런데 ANTIALIAS 속성을 0으로 설정해주면 중첩의 문제점은 일단 해결이 됩니다. 다만 그림 내의 선들이 약간 더 투박해진다는 반대 급부는 있습니다. 다만 위의 두 그림을 비교해보면 그리 큰 차이는 느껴지지 않습니다. 실제로 테스트해본 바로는 화면상에서는 그 차이가 나름 느껴지는데, PNG 파일로 저장된 그림을 보면 그 차이가 좀 덜한 것 같습니다.

 

따라서 ANTIALIAS 속성을 0으로 설정하는 것이 나름 나쁘지 않은 대안이 될 수도 있습니다. 이 ANTIALIAS 속성은 NG 체계의 그래픽 함수들 중 PLOT 계열의 함수들(PLOT, BARPLOT, SCATTERPLOT 등) 및 CONTOUR 함수 등에서 지원됩니다. 따라서 IDL 9.0에서 이러한 그림을 표출하면서 그 위에 심볼이나 문자 등과 같은 요소들을 추가할 때 중첩의 순서와 맞지 않는 현상이 문제가 될 경우에는 ANTIALIAS 속성을 사용하는 것도 당분간은 대안이 될 수 있다는 것을 참조해두시면 좋을 것 같습니다. 물론 근본적으로는 ANTIALIAS 속성의 설정과 관계없이 중첩이 정상적으로 수행되도록 수정되는 것이 가장 중요할 것입니다. 이 문제는 NV5 Geospatial에서도 이미 인지하고 있으며 아마 차기 버전에서는 해결이 되지 않을까 기대해보고 있습니다.

반응형