IDL/New Graphics

TEXT 함수 소개

이상우_idl 2022. 7. 26. 15:39
728x90
반응형

* 이 내용은 원래 2022년 1월 18일에 올렸던 게시물에 대하여 빠졌던 그림을 보강하고 약간의 내용을 추가한 버전입니다.

 

TEXT 함수는 NG 체계에서 문자를 삽입하는 기능을 수행하는 그래픽 함수이며, 제가 이 블로그에서 올린 다양한 게시물들에서 자주 활용해왔던 함수이기도 합니다. 다만 오늘은 이 TEXT 함수 자체에 집중하면서 주요 기능 및 관련 예제를 다양하게 소개해보고자 합니다. 그러면 간단한 예제부터 시작해봅시다. 다음은 그래픽창을 하나 띄우고 그 안에 문자열 하나를 삽입하는 예제입니다.

 

win = WINDOW(DIMENSIONS=[600, 400], /NO_TOOLBAR)
tx = TEXT(0.5, 0.5, "What's up?", COLOR='green', FONT_SIZE=36, /NORMAL)

 

여기서 생성된 그래픽창은 600x400의 픽셀 크기를 갖습니다. TEXT 함수를 사용할 때에는 문자열의 위치 좌표 그리고 삽입할 문자열의 내용을 명시하는 것이 필수입니다. 그 다음에는 여러가지 키워드 및 속성들을 사용하게 됩니다. 여기서는 그래픽창 내에서 좌표가 (0.5, 0.5)인 위치에 What's up?이라는 문자열을 삽입한 것입니다. (0.5, 0.5)라는 좌표값은 노멀(Normal) 좌표계를 기준으로 한 값이며, 이를 명확히 규정하기 위하여 /NORMAL 키워드가 사용되었습니다. 참고로 Normal 좌표계는 그래픽창의 가로 및 세로 방향의 좌표를 모두 0~1 범위의 정규화된(Normalized) 값으로 나타내는 방식입니다. 따라서 (0.5, 0.5)라는 노멀 좌표는 그래픽창 내에서 가로 및 세로 방향 모두 0.5에 해당되는 정가운데 위치가 됩니다. COLOR 속성은 말 그대로 문자의 색상을 설정하는 것입니다. FONT_SIZE 속성은 문자의 크기를 설정하는 것인데 디폴트 크기는 9이므로 상황에 맞게 조정하면 됩니다. 위의 과정에 의하여 그래픽창 내에 문자열이 표출된 모습은 다음과 같습니다.

 

 

그런데 여기서 문자열을 표시하는 좌표와 실제 문자열의 위치 사이의 관계를 명확히 살펴볼 필요가 있습니다. 즉 좌표의 위치는 하나의 지점이고 문자열은 여러 철자들이 이어지는 형태입니다. 따라서 그 좌표에 해당되는 지점과 문자열의 상대적 위치 관계를 살펴보기 위하여 다음과 같이 SYMBOL 함수를 사용하여 노멀 좌표 (0.5, 0.5)인 위치에 원형 기호를 추가해봅시다.

 

pt = SYMBOL(0.5, 0.5, 'circle', SYM_COLOR='red', /SYM_FILLED, SYM_SIZE=2, /NORMAL)

 

이렇게 원형 심볼까지 추가된 모습은 다음 그림과 같습니다.

 

 

이 그림을 보면 문자열의 좌표와 문자열의 실제 위치가 어떤 관계에 있는지를 명확하게 알 수 있는데, 바로 좌표에 해당되는 지점이 문자열의 좌측 하단에 위치하도록 문자열이 표시된다는 것을 알 수 있습니다. 따라서 TEXT 함수로 문자열을 표시할 때에는 문자열의 길이나 폰트 크기 등을 고려하여 어떤 위치에 오도록 하는 것이 적절한가에 대한 고려가 필요합니다. 이러한 부분은 사전에 정확히 계산할 수도 있겠지만 통상적으로는 여러번의 시행/착오를 거쳐 확정짓는 경우가 많습니다.

 

그러면 여기서 좌표 위치와 문자열의 위치 관계를 정렬(Alignment)이란 관점에서 조정해봅시다. 정렬에는 수평 방향(Horizontal) 정렬과 수직 방향(Vertical) 정렬 두 종류가 있는데요. 먼저 ALIGNMENT 속성을 사용해볼텐데 이것은 문자열이 좌표 위치를 기준으로 수평 방향으로 어떤 방식의 정렬이 될 것인가를 조정하는 역할을 합니다. 이 속성의 디폴트 값은 0이며 이는 왼쪽 정렬(Left Aligned)에 해당됩니다. 위의 그림은 디폴트인 왼쪽 정렬로 문자열이 표시된 경우입니다. 즉 좌표 위치가 수평 방향으로 문자열의 왼쪽이 되는 방식입니다. 만약 다음과 같이 ALIGNMENT 속성의 값을 1로 설정할 경우에는 오른쪽 정렬(Right Aligned)이 됩니다. 즉 위에서 TEXT 함수가 사용되었던 내용을 다음과 같이 변경해봅시다.

 

tx = TEXT(0.5, 0.5, "What's up?", COLOR='green', FONT_SIZE=36, $
  ALIGNMENT=1, /NORMAL)

 

이 경우의 표출 결과는 다음 그림과 같습니다.

 

 

이와 같이 좌표 위치가 수평 방향으로 문자열의 오른쪽이 되는 방식입니다. 그리고 ALIGNMENT 속성의 값을 다음과 같이 0.5로 설정하면 가운데 정렬(Center Aligned)이 됩니다. 즉 좌표 위치가 수평 방향으로 문자열의 한가운데가 되는 방식입니다.

 

tx = TEXT(0.5, 0.5, "What's up?", COLOR='green', FONT_SIZE=36, $
  ALIGNMENT=0.5, /NORMAL)

 

이 경우의 표출 결과는 다음 그림과 같습니다.

 

 

이러한 정렬은 수평 방향 뿐 아니라 수직 방향으로도 가능한데 수직 방향의 정렬 방식을 설정하려면 VERTICAL_ALIGNMENT 속성을 이용하면 됩니다. 이 속성의 디폴트 값은 0이며 이는 하단 정렬(Bottom Aligned)에 해당됩니다. 즉 좌표 위치가 수직 방향으로 문자열의 하단이 되는 방식입니다. 만약 다음과 같이 VERTICAL_ALIGNMENT 속성의 값을 1로 설정할 경우에는 상단 정렬(Top Aligned)이 됩니다. 위에서 TEXT 함수가 사용되었던 내용을 다음과 같이 변경해봅시다.

 

tx = TEXT(0.5, 0.5, "What's up?", COLOR='green', FONT_SIZE=36, $
  ALIGNMENT=0.5, VERTICAL_ALIGNMENT=1, /NORMAL)

 

이 경우의 표출 결과는 다음 그림과 같습니다.

 

 

이와 같이 좌표 위치가 수직 방향으로 문자열의 상단이 되는 방식입니다. 그리고 VERTICAL_ALIGNMENT 속성의 값을 다음과 같이 0.5로 설정하면 수직 방향으로 가운데 정렬(Center Aligned)이 됩니다. 즉 좌표 위치가 수직 방향으로 문자열의 한가운데가 되는 방식입니다.

 

tx = TEXT(0.5, 0.5, "What's up?", COLOR='green', FONT_SIZE=36, $
  ALIGNMENT=0.5, VERTICAL_ALIGNMENT=0.5, /NORMAL)

 

여기서는 결국 ALIGNMENT 및 VERTICAL_ALIGNMENT 속성의 값이 둘 다 0.5로 설정되었으므로 수평 및 수직 방향 모두 가운데 정렬이 됩니다. 즉 이 경우의 표출 결과는 다음 그림과 같습니다.

 

 

이와 같이 좌표 위치가 수평 및 수직 방향 모두 문자열의 한가운데가 되도록 처리할 수도 있습니다. 어쨌든 정렬과 관련된 속성들인 ALIGNMENT 및 VERTICAL_ALIGNMENT 속성의 값을 적절히 조절하여 좌표 위치와 문자열의 위치 관계를 설정할 수 있다는 것을 유념해두시기 바랍니다.

 

TEXT 함수에서는 그 외에도 몇가지 주목해볼만한 속성들이 더 있는데요. 그 중 하나인 ORIENTATION 속성은 문자열의 기울기 각도를 조절하는 역할을 합니다. 이 속성의 디폴트 값은 0인데, 다음과 같이 45로 설정해봅시다.

 

tx = TEXT(0.5, 0.5, "What's up?", COLOR='green', FONT_SIZE=36, $
  ALIGNMENT=0.5, VERTICAL_ALIGNMENT=0.5, ORIENTATION=45, /NORMAL)

 

이 경우의 표출 결과는 다음 그림과 같습니다. 즉 문자열의 기울기 각도를 45도로 설정한 것입니다.

 

 

이와 같이 ORIENTATION 속성을 사용하여 문자열의 기울기를 조정할 수 있으며 그 값은 0~360까지 가능합니다. 따라서 다음과 같이 반복형 구문을 이용한 간단한 장난(?)도 가능한데요. TEXT 함수의 내용은 위의 상태 그대로 둔 상태에서 바로 뒤에 이 반복형 구문을 추가하여 직접 한번 실행해보시기 바랍니다.

 

FOR j = 0, 360 DO tx.ORIENTATION = 45+j

 

이것은 텍스트 개체가 이미 존재하는 상태에서 ORIENTATION 속성만 후속 변경을 순차적으로 반복하는 것으로서 이 내용을 실행하면 문자열의 기울기가 45도인 상태에서 반시계 방향으로 한바퀴 빙글 도는 효과를 볼 수 있습니다. 그래서 이러한 반복의 결과를 애니메이션 GIF 파일로 저장해볼 수도 있는데, 제가 전에 올렸던 관련 게시물의 내용을 참조하여 그 과정을 적어보면 다음과 같습니다.

 

gif_file = 'text_func_gif.gif'
FOR j = 0, 360, 4 DO BEGIN
  tx.ORIENTATION = 45+j
  cap = win.CopyWindow(WIDTH=600)
  frame = COLOR_QUAN(cap, 1, r, g, b)
  WRITE_GIF, gif_file, frame, r, g, b, /MULTIPLE, $
    DELAY_TIME=1, REPEAT_COUNT=0
ENDFOR
WRITE_GIF, gif_file, /CLOSE

 

여기서는 361회라는 반복 횟수가 너무 많은 것 같아서 간격을 4로 설정하여 반복 횟수를 91회로 줄여보았습니다. 그리고 REPEAT_COUNT 키워드의 값을 0으로 설정하여 무한 반복이 되도록 하였습니다. 결과로 얻은 GIF 파일의 모습은 다음과 같습니다.

 

 

이번에는 문자열의 색상과 관련된 속성들을 보고자 하는데 일단 먼저 COLOR 속성이 있습니다. 말 그대로 문자의 색상을 설정하는 역할을 합니다. 예를 들면 다음과 같습니다.

 

tx = TEXT(0.5, 0.5, "What's up?", COLOR='yellow', FONT_SIZE=36, $
  ALIGNMENT=0.5, VERTICAL_ALIGNMENT=0.5, /NORMAL)

 

표출 결과는 다음 그림과 같습니다.

 

 

그런데 이와 같이 문자열의 색상에 따라서는 뒷 배경과 구분하기 힘들어서 가독성이 떨어지는 경우가 있습니다. 그 외에도 문자가 표시될 부분의 배경이 여러 색상들로 혼재되어 있으면 문자열 자체를 어떤 색상으로 처리를 해도 가독성을 높이기 쉽지 않을 경우도 꽤 있습니다. 이럴 경우에는 문자열의 배경색만 따로 설정해주는 것이 해결책이 될 수 있습니다. 즉 다음과 같이 FILL_BACKGROUND 및 FILL_COLOR 속성을 사용하는 방법입니다.

 

tx = TEXT(0.5, 0.5, "What's up?", COLOR='yellow', FONT_SIZE=36, $
  FILL_COLOR='blue', /FILL_BACKGROUND, $
  ALIGNMENT=0.5, VERTICAL_ALIGNMENT=0.5, /NORMAL)

 

이렇게 처리하면 배경색을 따로 설정할 수 있게 됩니다. 위의 결과는 다음 그림과 같습니다.

 

 

이와 같이 배경색을 따로 설정함으로써 문자열의 가독성을 좀 더 높이는 효과를 얻을 수 있습니다.

 

TEXT 함수에는 그 외에도 여러가지 기능들이 더 지원되긴 하지만 일단 기본적으로 필요한 내용들은 이 정도로 소개를 해도 충분할 것 같습니다. 어차피 이 함수는 자주 사용되기 때문에 블로그 내의 다른 게시물들에서도 여러가지 사용 예제들을 많이 보실 수 있다는 점 염두에 두시면 되겠습니다.

반응형