IDL/New Graphics

그래픽 좌표 체계 Relative 소개

이상우_idl 2022. 1. 12. 15:39
728x90
반응형

IDL에서 지원되는 3종의 그래픽 좌표 체계들인 데이터(Data), 디바이스(Device), 노멀(Normal)에 관해서는 관련 게시물을 통하여 자세히 소개한 바 있습니다. 그런데 사실은 이 3종 외에도 하나가 더 있습니다. 제 4의 좌표 체계라고도 할 수 있는 바로 Relative 좌표 체계라는 것인데요. 우리말로 번역을 어떻게 하는 것이 좋을지 모르겠습니다. "상대적" 좌표 체계라고 불러볼까도 했는데 일단 당분간은 그냥 영문으로 적겠습니다. 오늘은 이 Relative 좌표 체계에 관하여 소개해보고자 합니다. 이 좌표 체계가 도입된 시기는 저도 정확히는 모르겠지만 대략 IDL 8.2 버전쯤부터인 것으로 파악됩니다. 그리고 소개에 앞서 가장 먼저 유의해야 할 것이 있는데, 이 Relative 좌표 체계는 NG 체계에서만 지원되고 DG 체계에서는 지원되지 않는다는 것입니다. 좀 아쉬운 부분이긴 하지만 좌표 체계 자체의 특성상 어느 정도 수긍이 가는 측면도 있긴 합니다.

 

Relative 좌표 체계는 Normal 좌표 체계와 약간 비슷한 면이 있습니다. 다만 그 차이는 Normal의 경우는 그래픽창 전체에 대하여 각 방향을 0~1로 정규화한 것인 반면, Relative의 경우는 데이터 공간에 대하여 각 방향을 0~1로 정규화한 좌표 체계라는 것이 다릅니다. 그러면 예제와 함께 자세히 알아보도록 하겠습니다. 일단 그래픽창을 띄우고 플롯 하나를 표출해야 하는데 그 과정은 다음과 같습니다.

 

win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
x = FINDGEN(101)
y = SQRT(x)
p = PLOT(x, y, COLOR='blue', FONT_SIZE=10, MARGIN=[0.1, 0.1, 0.2, 0.2], /CURRENT)

 

일단 이 과정에서 주목해야 할 부분은 바로 플롯의 여백인데, MARGIN 속성에 설정된 여백이 좌측 및 하단은 0.1이지만 우측 및 상단은 0.2입니다. 따라서 표출된 그림을 보면 다음과 같이 여백이 균일하지 않습니다.

 

 

굳이 이렇게 한 이유는 Relative 좌표 체계의 특성을 명확하게 설명하기 위한 것입니다. 이제 Relative 좌표 체계 기준으로 좌표가 (0.5, 0.5)인 지점에 문자열 및 보조선을 표시해보겠습니다. 그 과정은 다음과 같습니다.

 

tx = TEXT(0.5, 0.5, 'IDL', COLOR='crimson', FONT_SIZE=12, $
  /RELATIVE, TARGET=p)
line = POLYLINE([0.5, 0.5, 0], [0, 0.5, 0.5], LINESTYLE=2, COLOR='crimson', $
  /RELATIVE, TARGET=p)

 

여기서는 좌표 체계에 대한 설정을 위하여 /RELATIVE 키워드를 사용하였습니다. 그리고 이 키워드 외에도 플롯 개체의 이름인 p를 TARGET 속성에 부여하였는데요. 이와 같이 좌표 체계를 Relative로 설정할 경우에는 TARGET 속성도 반드시 함께 사용하여 그 대상이 될 그래픽 개체를 명확히 지정해줘야 한다는 것을 반드시 유념해야 합니다. 만약 TARGET 속성을 사용하지 않고 그냥 /RELATIVE 키워드만 사용할 경우에는 /NORMAL 키워드를 사용한 것과 마찬가지 결과를 얻게 됩니다. 따라서 /RELATIVE 키워드를 사용할 경우에는 반드시 TARGET 속성도 함께 사용해야 한다는 것을 유의해야 합니다. 표출된 결과를 보면 다음 그림과 같습니다.

 

 

이와 같이 데이터 공간의 X축 및 Y축 방향이 0~1로 정규화된 좌표 체계를 기준으로 (0.5, 0.5)인 좌표에 대하여 문자열 및 보조선이 표시되었음을 볼 수 있습니다. 즉 이 좌표값은 X축 방향으로 중간 지점 그리고 Y축 방향으로도 중간 지점이 됩니다. 여기서 ConvertCoord 메서드를 사용하여 이 좌표를 데이터 좌표계로 변환해봅시다. 이를 위해서는 다음과 같이 플롯 개체인 p에 대하여 ConvertCoord 메서드를 적용하면서 /RELATIVE 및 /TO_DATA 키워드를 함께 사용하면 됩니다.

 

crd = p.ConvertCoord(0.5, 0.5, /RELATIVE, /TO_DATA)
HELP, crd
PRINT, crd

 

출력된 결과 내용을 보면 다음과 같습니다.

 

CRD             DOUBLE    = Array[3]
       50.000000       5.0000000      -0.0000000

 

즉 Relative 좌표 (0.5, 0.5)는 데이터 좌표 (50, 5)로 변환된다는 뜻입니다. 표출된 플롯의 X축 범위가 0~100이고 Y축 범위가 0~10이라는 점을 감안한다면 딱 중간인 지점에 대한 데이터 좌표로 제대로 변환되었음을 알 수 있습니다. Relative 좌표계의 의미에 대해서는 이 정도면 충분히 전달되었을 것으로 봅니다.

 

그런데 만약에 앞서 강조했던 것처럼 /RELATIVE 키워드와 TARGET 속성을 함께 사용하지 않고 그냥 /RELATIVE 키워드만 달랑 사용할 경우에는 어떤 일이 벌어지는지 한번 봅시다.

 

tx = TEXT(0.5, 0.5, 'IDL', COLOR='crimson', FONT_SIZE=12, $
  /RELATIVE)
line = POLYLINE([0.5, 0.5, 0], [0, 0.5, 0.5], LINESTYLE=2, COLOR='crimson', $
  /RELATIVE)

 

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

 

 

이와 같이 그냥 /NORMAL 키워드를 사용한 경우와 마찬가지의 결과 즉 그래픽창의 가로 및 세로 방향이 0~1로 정규화된 Normal 좌표 체계 기준으로 (0.5, 0.5)인 좌표로 인식된 결과임을 알 수 있습니다. 따라서 위의 내용에서 /RELATIVE 키워드를 /NORMAL 키워드로 바꿔도 결과는 똑같습니다. 홀로 사용된 /RELATIVE 키워드는 /NORMAL 키워드와 마찬가지이기 때문입니다. 따라서 다시 한번 강조하지만 /RELATIVE 키워드를 사용하여 좌표 체계를 Relative로 설정하기 위해서는 TARGET 속성도 반드시 함께 사용해야 한다는 것을 유의하시기 바랍니다. 제 생각에는 아마도 이렇게 대상 그래픽 개체를 지정해줘야 하는 특성 때문에 Relative 좌표 체계가 NG 체계에서만 지원되고 DG에서는 지원되지 않는 것은 아닐까 생각도 듭니다만 이건 뭐 어디까지나 제 추측일 뿐입니다.

 

Relative 좌표 체계는 나름 효용성이 있습니다. 특히 그래픽 요소들을 추가할 때 데이터 축을 기준으로 좌표 설정을 하는 것이 편할 경우에 유용합니다. 다음은 앞서 맨 처음에 기본 플롯까지만 표출해놓았던 상태에서 몇가지 그래픽 요소들을 추가하는 예제인데, Relative 좌표를 활용해본 것입니다.

 

tx1 = TEXT(0.5, 1.06, 'Plot Title', COLOR='magenta', FONT_SIZE=20, $
  ALIGNMENT=0.5, /RELATIVE, TARGET=p)
line = ARROW([1.1, 1.1], [0, 1], COLOR='green', /RELATIVE, TARGET=p)
tx2 = TEXT(1.17, 0.5, 'Y Axis', FONT_SIZE=15, ORIENTATION=90, $
  ALIGNMENT=0.5, /RELATIVE, TARGET=p)

 

이와 같이 X축 또는 Y축의 범위를 약간 넘어서는 위치쯤에 뭔가를 표시하고 싶을 경우에는 Relative 좌표를 사용하는 것이 나을 수도 있습니다. 특히나 이와 같이 코딩을 해놓으면 혹시나 데이터가 변경되어서 축의 범위값이 달라지더라도 프로그램의 내용을 수정을 할 필요가 전혀 없다는 잇점이 있습니다. 결과는 다음 그림과 같습니다.

 

반응형