IDL/New Graphics

NG 체계에서 Order 메서드의 활용

이상우_idl 2019. 9. 2. 18:30
728x90
반응형

오늘은 NG 체계에서 Order라는 메서드를 활용하는 방법에 관하여 소개해보기로 하겠습니다. 사실 제가 이 블로그에 올렸던 다른 게시물들에서 이 Order 메서드가 등장한 적이 있긴 합니다만, 오늘은 좀 더 구체적으로 살펴보고자 합니다. Order 메서드는 NG 체계에서 지원되는 거의 모든 그래픽 함수들(PLOT, CONTOUR, IMAGE, TEXT 등등)에서 지원이 됩니다. 이 메서드의 역할은 그래픽 요소를 앞쪽으로 또는 뒤쪽으로 옮기는 것입니다. NG 체계의 그래픽 요소들은 하나하나마다 일종의 층(Layer) 위에 얹혀져 있다고 보면 되는데, 그 레이어를 앞 또는 뒤로 왔다갔다하도록 하는 것을 바로 이 Order 메서드를 사용하여 제어할 수 있습니다. 이러한 기능은 DG 체계와 NG 체계 사이의 가장 큰 차이점들 중 하나이기도 합니다.


그러면 예제를 통하여 살펴보겠습니다. 다음과 같이 가상의 2차원 데이터를 생성하고 이 데이터에 대한 등위선(contour)과 이미지를 차례로 표출합니다.


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)

cn = CONTOUR(data, COLOR='black', C_THICK=2, MARGIN=0.1, /CURRENT)

im = IMAGE(data, RGB_TABLE=67, /OVERPLOT)


여기서는 이와 같이 CONTOUR 함수를 사용하여 등위선을 먼저 표출하고, 이어서 동일한 데이터에 대한 이미지를 IMAGE 함수를 사용하여 중첩하였습니다. 결과는 아마 충분히 예상할 수 있듯이 다음 그림과 같습니다.



이렇게 나올 수 밖에 없는 이유는 먼저 표출된 등위선 그림을 나중에 표출된 이미지가 덮어버렸기 때문입니다. 따라서 원래는 이미지를 먼저 표출하고 그 다음에 등위선 그림을 중첩하는 순서로 작업하는 것이 맞습니다. 이렇게 하는 방법에 관해서는 제가 전에 다른 게시물에서 소개했던 바 있습니다. 그런데 그냥 이와 같은 표출이 이미 되어버린 상태에서, 후속 작업에 의하여 등위선 그림을 전면으로 가져오는 것도 가능합니다. 바로 Order 메서드를 사용하면 됩니다. 이 상태에서 다음과 같이 Order 메서드를 사용해 봅시다.


im.Order, /SEND_BACKWARD


이 명령에서는 이미지 개체인 im에 대하여 Order 메서드를 사용하되 /SEND_BACKWARD라는 키워드를 함께 사용하였습니다. 일단 이 명령이 실행된 결과는 다음 그림과 같습니다.



이 그림에서는 이미지에 가려졌던 등위선 그림의 모습이 이미지 위에서 보이고 있습니다. 이렇게 된 이유는 위의 명령에 의하여 이미지 개체를 한 층(Layer) 밑으로 내려보냈기 때문입니다. 여기서 사용된 SEND_BACKWARD 키워드가 대상 개체를 한 층 밑으로 내려보내는 역할을 합니다. 반대로 한 층 위로 올리는 것도 가능합니다. 이 상태에서 다음과 같이 Order 메서드를 또 사용해 봅시다.


im.Order, /BRING_FORWARD


이 명령에서는 이미지 개체인 im에 대하여 Order 메서드를 사용하되 이번에는 /BRING_FORWARD라는 키워드를 함께 사용하였습니다. 이 키워드의 의미는 대상 개체를 한 층(Layer) 위로 올리라는 것입니다. 따라서 결과는 다음 그림과 같습니다.



이와 같이 그림이 맨 처음과 같은 모습으로 보이는 이유는, 앞서 한 층 아래로 내렸던 이미지 개체를 다시 한 층 위로 올렸기 때문입니다. 어쨌든 이와 같은 방식으로 어떤 그래픽 개체가 위치하는 층(Layer)를 올리고 내리는 동작이 가능합니다. 이 예제에서는 이미지 개체를 한 층 내렸다가 한 층 올리는 명령을 순서대로 실행하였는데요. 동일한 효과를 내기 위하여 대상 개체를 이미지 대신 다음과 같이 등위선으로 대체할 수도 있습니다.


cn.Order, /BRING_FORWARD

cn.Order, /SEND_BACKWARD


여기서는 애초에 아래 층에 있던 등위선 개체를 위로 한 층 올렸다가 다시 한 층 내려보내는 순서로 작업을 한 것입니다. 이렇게 해도 효과는 같습니다. 여러분들도 한번 테스트해보시기 바랍니다.


이번에는 새로운 예제를 살펴보겠습니다. 다음과 같이 동일한 데이터를 사용하여 등위선을 먼저 표출하고 이미지를 그 위에 중첩 표출하는 것은 앞의 예제와 유사한데, 다만 이번에는 그 사이에 TEXT 함수를 사용하여 "Hello!"라는 문자를 삽입해보았습니다.


win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)

cn = CONTOUR(data, COLOR='black', C_THICK=2, MARGIN=0.1, /CURRENT)

tx = TEXT(300, 300, 'Hello!', COLOR='yellow', FONT_SIZE=24, /DATA)

im = IMAGE(data, RGB_TABLE=67, /OVERPLOT)


여기서 유의할 것은 표출의 순서입니다. 등위선 그림을 먼저 표출하고, 그 위에 문자를 삽입한 후, 이미지를 중첩 표출하는 순서로 작업을 진행하였습니다. 이렇게 하면 나오는 결과는 아마도 짐작이 가실텐데요. 다음 그림과 같습니다.



당연히 이렇게 나오겠죠. 먼저 표출된 등위선과 문자는 맨 나중에 중첩되는 이미지에 모두 덮어지기 때문입니다. 그러면 이미지를 맨 뒤로 빼서 등위선과 문자가 모두 보이도록 처리하려면 어떻게 해야 할까요? 이 경우에는 Order 메서드를 다음과 같이 사용하면 됩니다.


im.Order, /SEND_TO_BACK


여기서는 이미지 개체에 대하여 Order 메서드를 적용하면서 SEND_BACKWARD 대신 SEND_TO_BACK 키워드를 사용하였다는 점에 유의해야 합니다. 일단 이 결과는 다음 그림과 같습니다.



여기서 사용된 SEND_TO_BACK 키워드의 역할은 대상 개체를 무조건 맨 아래 층으로 내려보내는 것입니다. 즉 SEND_BACKWARD의 경우는 한 층씩 아래로 내려보내는 반면, SEND_TO_BACK은 무조건 맨 아래 층으로 한번에 내려보낸다는 차이가 있습니다. 그래서 여기서는 이미지 개체를 맨 아래 층으로 내려보냈기 때문에, 등위선과 문자가 비로소 보이게 되는 것입니다. 이와 같이 무조건 맨 아래 층으로 내려보내는 것과는 반대로 무조건 맨 위층으로 올려보내는 역할을 하는 BRING_TO_FRONT 키워드도 있습니다. 참고로 함께 알아두시면 됩니다.


자 그러면 마지막으로 명령 하나만 더 실행해 봅시다. 우선 위 그림을 잘 보면 노란색의 "Hello!" 문자가 등위선보다 위에 있는 것이 보입니다. 처음에 등위선 표출을 한 후에 문자를 삽입했기 때문에 이렇게 보이게 됩니다. 만약 문자가 등위선보다는 바로 아래에 위치하도록 하고 싶다면 어떻게 하면 될까요? 이미 다 짐작하실 수 있을 겁니다. 다음과 같이 해주면 됩니다.


tx.Order, /SEND_BACKWARD


여기서는 문자 개체에 대하여 Order 메서드를 적용하면서 SEND_BACKWARD 키워드를 사용하였습니다. 결과는 다음 그림과 같습니다.



이 그림은 얼핏 보면 앞서 봤던 그림과 별 차이가 없어 보일 수도 있지만, 잘 보면 문자와 등위선 라인들의 상대적 위치가 서로 다름을 알 수 있습니다. 즉 앞선 그림에서는 문자가 등위선 라인들을 가렸지만 이번 그림에서는 등위선 라인들이 문자 위를 지나가는 모습을 볼 수 있습니다. 이와 같이 처리하면 이번 그림에서 보는 바와 같이 문자를 한 층 아래로 내려보내기 때문에, 등위선의 라인들이 문자보다 위에서 보이도록 할 수 있게 됩니다.


정리를 해본다면, 오늘 소개해드린 Order 메서드에서는 다음과 같은 4종의 키워드들이 지원되며, 대상 그래픽 개체가 위치하는 층(Layer)을 이 키워드를 사용하여 세부 조정할 수 있습니다.


BRING_FORWARD : 대상 그래픽 개체를 한 층(Layer) 위로 올린다.

SEND_BACKWARD : 대상 그래픽 개체를 한 층(Layer) 밑으로 내린다.

BRING_TO_FRONT : 대상 그래픽 개체를 맨 위의 층(Layer)으로 올려보낸다.

SEND_TO_BACK : 대상 그래픽 개체를 맨 아래의 층(Layer)으로 내려보낸다.


따라서 NG 체계에서는 이러한 기능을 사용하여 그래픽 표출에 있어서 좀 더 많은 자유도를 가질 수 있게 된다는 점을 잘 알아두시면 좋을 것 같습니다.

반응형