오늘은 NG(New Graphics) 체계에서 제공되는 그래픽 관련 메서드(Method)들 중에서 ConvertCoord 메서드를 이용하는 방법에 관하여 소개해보고자 합니다. 이 ConvertCoord 메서드는 그 명칭에서 짐작할 수 있듯이 좌표계를 변환하는 역할을 합니다. 원래 IDL의 그래픽에서는 기본적으로 Data, Device, Normal 3종의 좌표체계가 존재합니다. 그래서 특정한 좌표계를 기준으로 한 좌표가 있을 때 이를 다른 좌표계의 좌표로 변환해주는 역할을 하는 것이 바로 ConvertCoord 메서드입니다. 예를 들면 Data 좌표계 기준으로 (80, 4)라는 좌표가 있을 때 이 좌표를 Normal 좌표계 기준으로 변환하면 어떤 좌표가 될 것이냐를 알아내기 위하여 이 메서드를 활용하면 됩니다. 그러면 예제와 함께 살펴봅시다. 먼저 다음과 같이 x, y 데이터를 생성하고 플롯으로 표출합니다.
x = FINDGEN(101)
y = SQRT(x)
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(x, y, /CURRENT)
일단 여기까지 표출된 모습은 다음 그림과 같습니다.
이 플롯을 보면 X축은 0~100 그리고 Y축은 0~10의 범위를 갖고 있습니다. 여기서 Data 좌표계 기준으로 좌표가 (80, 4)인 점을 다음과 같이 SYMBOL 함수를 이용하여 찍어봅시다.
sym = SYMBOL(80, 4, 'circle', /SYM_FILLED, SYM_COLOR='red', /DATA)
그러면 다음 그림과 같이 X축에서 80, Y축에서 4의 위치에 점이 찍힙니다. Data 좌표계라는 것은 이와 같이 데이터를 사용하여 표출된 2차원 공간상의 X, Y축 값을 기준으로 좌표가 정해지는 방식에 해당됩니다.
이제 이 좌표를 Normal 좌표계 기준의 좌표로 변환해봅시다. Normal 좌표계는 그래픽창의 가로 및 세로 방향을 모두 0~1의 Normalized 좌표값으로 사용하는 좌표 체계입니다. 이를 위하여 ConverCoord 메서드를 다음과 같은 문법으로 사용하면 됩니다.
crd = p.ConvertCoord(80, 4, /DATA, /TO_NORMAL)
HELP, crd
PRINT, crd
이와 같이 Data 좌표계 기준의 (80, 4)라는 좌표를 Normal 좌표계 기준의 좌표로 환산한 결과를 crd라는 이름으로 가져오게 됩니다. 실제로 출력된 내용을 보면 다음과 같습니다.
CRD DOUBLE = Array[3]
0.76283333 0.42969688 0.0000000
이 내용을 보면 crd는 3개의 값들로 구성된 배열로 얻어지는데 그 이유는 X, Y, Z 좌표값들을 모두 포함하도록 되어 있기 때문입니다. 물론 여기서는 Z 좌표는 의미가 없기 때문에 그냥 앞의 두 값만 보면 됩니다. 대략 (0.76, 0.43) 정도가 되는데 바로 이 좌표가 앞서 표시했던 지점에 대한 Normal 좌표계 기준의 좌표가 됩니다. 위 그림을 보면 가장 바깥쪽에 사각형 윤곽이 보이는데 바로 그래픽창 자체의 윤곽을 나타낸 것입니다. 이 윤곽을 기준으로 본다면 (0.76, 0.43)이라는 좌표가 맞다는 것을 눈으로도 짐작할 수 있습니다. 그러면 이를 명확하게 확인하기 위하여 다음과 같이 SYMBOL 함수를 이용하여 Normal 좌표계 기준으로 다른 색상의 점을 찍어봅시다.
sym_o = SYMBOL(crd[0], crd[1], 'circle', /SYM_FILLED, SYM_COLOR='blue', /NORMAL)
그 결과는 다음 그림과 같습니다.
이와 같이 동일한 위치에 점이 표시된 것을 확인할 수 있고, 결국 좌표 변환이 제대로 수행되었다는 것도 알 수 있습니다. 이러한 좌표 변환은 모든 좌표계들에 대하여 서로서로 가능합니다. 이를 위하여 ConvertCoord 메서드에서는 /DATA, /DEVICE, /NORMAL, /TO_DATA, /TO_DEVICE, /TO_NORMAL 키워드들이 지원됩니다. 위의 예제에서는 이들 중 /DATA 및 /TO_NORMAL 키워드를 사용하여 Data 좌표계로부터 Normal 좌표계로의 변환을 수행한 것입니다. 만약 Device 좌표계로 변환한 결과를 얻으려면 다음과 같이 /DATA 및 /TO_DEVICE 키워드를 사용하면 됩니다.
crd = p.ConvertCoord(80, 4, /DATA, /TO_DEVICE)
HELP, crd
PRINT, crd
이 때 출력된 내용을 보면 다음과 같습니다.
CRD DOUBLE = Array[3]
457.70000 214.84844 0.0000000
이 내용을 보면 Data 좌표계 기준의 (80, 4)라는 좌표는 Device 좌표계 기준으로 대략 (458, 215) 정도의 좌표로 변환됨을 알 수 있습니다. 참고로 Device 좌표계는 그래픽창의 가로 및 세로 방향의 픽셀 크기를 그대로 반영한 좌표계입니다. 즉 그래픽창의 크기가 여기서는 600x500의 픽셀 크기로 정의되어 있는데, 이를 기준으로 (458, 215)의 좌표에 대응된다는 의미입니다.
또 다른 좌표의 예를 들어보자면, Normal 좌표계 기준으로 (0.5, 0.5)의 좌표가 Device 좌표계 또는 Data 좌표계 기준으로 어떤 좌표로 대응되는지를 알아내는 방법 및 결과는 다음과 같습니다.
먼저 Normal 좌표계로부터 Device 좌표계로 변환한 결과입니다.
crd = p.ConvertCoord(0.5, 0.5, /NORMAL, /TO_DEVICE)
HELP, crd
PRINT, crd
CRD DOUBLE = Array[3]
300.00000 250.00000 0.0000000
그리고 Normal 좌표계로부터 Data 좌표계로 변환한 결과입니다.
crd = p.ConvertCoord(0.5, 0.5, /NORMAL, /TO_DATA)
HELP, crd
PRINT, crd
CRD DOUBLE = Array[3]
46.947865 4.9350568 0.0000000
그리고 앞서 그래픽 표출을 했던 것과 동일한 요령으로 이 점의 위치를 그림상에 표시한 모습은 다음과 같습니다.
이와 같은 요령으로 ConverCoord 메서드를 활용하면 특정 좌표에 대한 좌표계 변환의 결과를 자유롭게 얻을 수 있다는 점을 잘 알아두시면 좋을 것이라 생각합니다.
'IDL > New Graphics' 카테고리의 다른 글
NG 체계 플롯에서 타이틀 문자의 세부 설정 (0) | 2021.08.09 |
---|---|
NG 체계의 IMAGE 함수를 이용한 표출시 유의사항 (0) | 2021.06.02 |
NG 체계에서 Select 메서드의 활용 (0) | 2021.03.23 |
색상을 채운 플롯(Filled Plot)의 표출 [3] (0) | 2021.03.03 |
벡터장(Vector Field)과 입자 추적(Particle Tracing) [2] (0) | 2021.01.26 |