IDL/New Graphics

3차원 공간상에서 문자 표시 팁

이상우_idl 2022. 2. 15. 14:18
728x90
반응형

IDL에서 그래픽 표출 작업을 할 때 문자들도 함께 표시되는 경우가 대부분입니다. 특히 X, Y, Z 축들이 사용되는 2차원 또는 3차원 그래픽 개체들을 표출할 경우에는 각 축의 눈금 문자들이 표시되는 것 뿐만 아니라 필요에 따라서는 별도의 문자들을 삽입하기도 합니다. 그런데 오늘 다뤄보고자 할 내용은 3차원 그래픽에서 문자를 표시하는 경우에 촛점을 맞추었습니다. 일단 왜 이런 이슈를 제가 들고나온 것인지를 설명하기 위하여 사례를 먼저 하나 보겠습니다. 다음과 같이 SURFACE 함수를 사용하여 서피스 그림을 표출하고 TEXT 함수를 사용하여 특정한 위치에 'IDL Surface'라는 캡션 문자도 추가해봅시다.

 

data = HANNING(400, 400)*100
add = FLTARR(400, 400)
add[240, 40] = HANNING(150, 150)*50
data = data + add
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
s = SURFACE(data, COLOR='sky blue', /CURRENT)

tx = TEXT(100, 100, 90, 'IDL Surface', FONT_SIZE=20, COLOR='brown', /DATA)

 

 

이와 같이 서피스(Surface) 개체는 기본적으로 3차원 공간상에서 표출됩니다. 그리고 이 모습은 SURFACE 함수를 사용하여 서피스 그림을 표출한 통상적인 모습입니다. 그런데 이와 같이 3차원 공간상에서 존재하는 그래픽 개체에 대해서는 시선방향을 조정하는 것이 가능합니다. 이러한 조정은 마우스 왼쪽 버튼으로 그래픽 개체를 클릭한 후 드래그하는 방법 또는 Rotate 메서드를 사용하여 시선방향을 직접 정의하여 표출되도록 하는 방법이 있는데, 이와 관련된 자세한 내용은 관련 게시물의 내용을 참조하시기 바랍니다. 여기서는 다음과 같이 Rotate 메서드를 사용하여 시선방향을 좀 더 비스듬하게 변경해봅시다.

 

s.Rotate, /RESET
s.Rotate, 15, /XAXIS
s.Rotate, 30, /YAXIS
s.Rotate, -90, /XAXIS

 

그 모습은 다음 그림과 같습니다.

 

 

그런데 이 그림에서 문자들을 잘 보면 서피스 개체와 마찬가지로 비스듬하게 기울어져 있는 것을 볼 수 있습니다. TEXT 함수를 사용하여 추가한 캡션 문자도 그렇고, X축과 Y축의 눈금 문자들도 마찬가지입니다. 원래 문자 개체들은 그 형태가 평면적이기 때문에 이렇게 비스듬하게 기울어지면 알아보기가 힘들 수가 있습니다. 3차원 공간상에 존재하기 때문에 어쩔 수 없는 측면이기도 합니다. 그런데 이러한 단점을 극복할 수 있는 방법이 하나 있습니다. 바로 TEXT 함수의 ONGLASS 속성을 사용하는 것입니다. 앞서 TEXT 함수가 사용되었던 내용에 다음과 같이 이 속성을 추가해봅시다.

 

tx = TEXT(100, 100, 90, 'IDL Surface', FONT_SIZE=20, COLOR='brown', /ONGLASS, /DATA)

 

이렇게 변경한 후 다시 표출해보면 결과는 다음 그림과 같습니다.

 

 

이 그림을 잘 보면 캡션 문자인 'IDL Surface'가 기울어짐이 전혀 없이 마치 나를 정면으로 바라보고 있는 듯한 모습으로 보입니다. 이와 같이 TEXT 함수의 ONGLASS 속성을 사용하면 내가 정면으로 바라보는 평면상에 문자가 표시되도록 설정됩니다. 즉 서피스 개체의 시선 방향이 어떤 방향이 되든 문자는 항상 나를 정면으로 바라보는 방향으로 표시되도록 하는 기능입니다. 이름 그대로 마치 유리면에 문자가 붙어있는 듯한 느낌이 됩니다. 따라서 다음과 같이 서피스 개체를 더 회전시키더라도 캡션 문자는 계속 똑같은 모습으로 나를 바라보게 됩니다.

 

s.Rotate, -20, /ZAXIS

 

 

따라서 이와 같이 TEXT 함수와 ONGLASS 속성을 함께 사용하여 3차원 개체 내에 추가된 문자가 항상 정면을 바라보도록 처리함으로써 가독성을 유지하는 것이 가능합니다. 그런데 그림을 잘 보면 한가지 아쉬운 부분이 있는데, 서피스의 축 눈금 문자들(특히 X 및 Y축)은 여전이 비스듬하게 기울어진 상태로 남아있다는 것입니다. 이러한 눈금 문자들에 대해서도 ONGLASS와 같은 처리를 할 수는 없을까하는 궁금증이 생깁니다. 일단 제가 확인한 바로는 SURFACE 함수 내에서 직접적으로 이러한 기능이 지원되지는 않습니다. 하지만 그나마 다행스러운 것은 약간의 코딩을 추가하면 가능은 하다는 것입니다. 좀 번거롭긴 하지만 그 과정도 소개해보겠습니다. 먼저 X, Y 축들에 대하여 눈금값 및 눈금문자들을 배열로 추출합니다.

 

pxtv = s.AXES[0].TICKVALUES
pxtn = s.AXES[0].TICKNAME
pytv = s.AXES[1].TICKVALUES
pytn = s.AXES[1].TICKNAME

 

이 과정에서는 서피스 개체인 s에 대하여 여러 축(Axis)들에 해당되는 AXES라는 항목들 중 X 및 Y축에 해당되는 두 항목에 대하여 눈금값들인 TICKVALUES 및 눈금문자들인 TICKNAME 속성 정보를 추출하였습니다. 그 다음에는 X축에 대하여 먼저 기존의 비스듬한 눈금 문자들을 보이지 않도록 처리합니다.

 

s.AXES[0].SHOWTEXT = 0

 

그 다음에는 X축의 눈금 위치별로 새로운 눈금 문자들을 표시합니다. 이를 위해서는 반복형 구문을 사용하여 TEXT 함수로 하나씩 추가하게 됩니다.

 

FOR j = 0, N_ELEMENTS(pxtv)-1 DO $
  tx = TEXT(pxtv[j], pytv[0]-20, STRING(pxtn[j]), $
  ALIGNMENT=0.5, VERTICAL_ALIGNMENT=1, /ONGLASS, /DATA)

 

여기서는 새로 추가되는 눈금 문자들에 대하여 /ONGLASS 속성을 적용하였습니다. 결과는 다음 그림과 같습니다.

 

 

그러면 이와 같이 X축의 눈금 문자들이 모두 나를 정면으로 바라보는 방향으로 표시되는 효과를 얻게 됩니다. 유사한 방식으로 Y축 눈금 문자들에 대해서도 처리할 수 있습니다. 그 과정은 다음과 같습니다.

 

s.AXES[1].SHOWTEXT = 0
FOR j = 0, N_ELEMENTS(pytv)-1 DO $
  tx = TEXT(pxtv[0]-10, pytv[j], STRING(pytn[j]), $
  ALIGNMENT=1, VERTICAL_ALIGNMENT=0.5, /ONGLASS, /DATA)

 

그리고 결과는 다음 그림과 같습니다.

 

 

그리고 필요하다면 Z축에 대해서도 유사한 방식으로 처리를 할 수 있습니다. 물론 이러한 처리를 위하여 추가적인 코딩이 필요하다는 것이 번거롭긴 하지만 어쨌든 축 눈금 문자들에 대하여 ONGLASS 효과를 주려면 이와 같은 방식으로 하면 됩니다. 어쨌든 3차원 그래픽에서 문자들을 표시하는데 있어서 기울어짐으로 인하여 가독성이 나빠질 경우에는 이와 같은 해결 방법도 있다는 것을 염두에 두시면 됩니다.

 

* 그 외에도 3차원 공간상에서 문자를 표시할 때 기저선 및 방향을 직접 설정하는 것도 가능한데, 이를 위해서는 BASELINE 및 UPDIR 속성을 사용하면 된다는 것도 일단 참고로 언급해둡니다.

반응형