ELLIPSE 함수는 IDL의 NG 체계의 등장과 함께 지원되기 시작한 그래픽 함수로서, 타원 또는 원을 쉽게 그릴 수 있도록 해주는 역할을 합니다. 사실 그 이전 시대에는 IDL 자체적으로 이러한 기능의 루틴을 제공하질 않았었기 때문에 TVELLIPSE와 같은 외부 라이브러리의 루틴들을 가져다 사용하는 경우가 많았습니다. 물론 ELLIPSE 함수는 NG 체계에서만 지원되기 때문에 DG 체계에서는여전히 전통적인 방법들을 사용해야 하기는 합니다.
오늘은 이 ELLIPSE라는 함수를 사용하여 원이나 타원을 그리는데 있어서 주의할 점에 대하여 언급을 해보고자 합니다. 이 함수는 명칭 그대로 타원(Ellipse)을 그리는 용도이긴 하지만 원(Circle)을 그리는 것도 당연히 가능합니다. 다음과 같이 X축 및 Y축의 범위가 0~100인 2차원 공간상에서 중심이 (50, 50)에 있고 반경이 50인 원을 그려 봅시다.
win = WINDOW(DIMENSIONS=[600, 400])
pl = PLOT(/TEST, /NODATA, XRANGE=[0, 100], YRANGE=[0, 100], /CURRENT)
ep = ELLIPSE(50, 50, MAJOR=50, COLOR='crimson', THICK=2, /DATA)
여기서는 그래픽 창을 600X400의 크기로 만들고 그 위에 PLOT으로 2차원 공간을 표출한 상태에서 ELLIPSE 함수를 사용하여 이 공간상에 원을 그립니다. 원을 그리기 위한 ELLIPSE 함수의 사용법은, 중심좌표 값들을 필수 인자로 전달하고 MAJOR 속성에 반경의 값을 주는 방식입니다. 원래 타원을 그릴 경우에는 MINOR 속성까지도 사용해야 하지만, IDL 도움말에서 관련 내용을 보면 타원이 아닌 원을 그릴 경우에는 MAJOR 속성만 사용해도 되는 것으로 언급되어 있습니다. 실제로 ELLIPSE 함수의 MINOR 속성에 대한 설명을 보면 다음과 같이 언급이 되어 있는데, 이 내용만보면 원을 그릴 경우에는 MAJOR 하나로 충분하다고 생각하는 것이 당연합니다.
If ECCENTRICITY and MINOR are not specified then a circle is drawn.
그런데 실제로 위의 예제 코드로 그림을 그려 보면 그 결과는 다음과 같습니다. 뭔가 문제가 있다는 것이 바로 보입니다.
문제의 핵심은, 원을 그리라고 했더니 정말로 원을 그렸다는 것입니다. 물론 원래 자신의 역할을 충실히 수행했다고 볼 여지도 있겠지만, 적어도 이 상황에서 우리의 기대는 XY축 공간상에 꼭 맞는 크기의 원이 그려지는 것인데, 실제 결과는 그렇지가 않습니다. 그렇다면 해결책은 무엇일까요? 사실은 이 경우에는 MINOR 속성까지 함께 사용해야 합니다. 즉, 위의 예제 코드에서 ELLIPSE 함수의 사용 방법이 다음과 같이 변경되어야 합니다.
ep = ELLIPSE(50, 50, MAJOR=50, MINOR=50, COLOR='crimson', THICK=2, /DATA)
이렇게 수정하여 다시 실행을 해보면 그 결과는 다음 그림과 같습니다. 우리가 원하던 결과는 바로 이런 그림이었을 것입니다.
결론적으로 얘기한다면, ELLIPSE 함수를 사용하여 원을 그릴 경우에는 MAJOR, MINOR 속성을 함께 사용하는 것이 안전합니다. 물론 MAJOR 하나만 사용해도 충분한 경우도 있습니다. X축과 Y축의 가로/세로 비율이 축 범위 스케일에 딱 맞도록 그려진 2차원 공간상에서만 그렇습니다. 즉, 제가 이전 게시물에서 언급했던 ASPECT_RATIO 속성이 사용된 경우입니다. 따라서 다음과 같은 예제 코드를 실행시키면 그 결과는 다음 그림과 같습니다.
win = WINDOW(DIMENSIONS=[600, 400])
pl = PLOT(/TEST, /NODATA, XRANGE=[0, 100], YRANGE=[0, 100], ASPECT_RATIO=1, /CURRENT)
ep = ELLIPSE(50, 50, MAJOR=50, MINOR=50, COLOR='crimson', THICK=2, /DATA)
하지만 우리가 실제로 그리게 되는 그림들은 대개 가로/세로 비율이 X축/Y축 값의 범위가 아닌 그래픽 창의 크기에 맞춰지는 경우가 더 많기 때문에, ELLIPSE 함수의 사용에 있어서 MAJOR, MINOR를 함께 사용하는 것이 더 안전하다고 생각해두는 것이 좋을 것 같습니다.
'IDL > New Graphics' 카테고리의 다른 글
PLOT3D에서 육면체(Cube) 심볼을 사용해보자 (0) | 2017.02.13 |
---|---|
IDL 8.6 NG 체계의 폰트 관련 변경 사항 (0) | 2017.02.02 |
ASPECT_RATIO 속성의 이해 (내용 일부 수정 있음) (0) | 2016.04.27 |
PLOT3D에서 구체(Sphere) 심볼 사용법 (0) | 2016.02.29 |
NG체계에서 다중 플롯 그리기 (Multi-Plot in NG) [2] - 업데이트! (0) | 2016.02.22 |