IDL/New Graphics

서피스(Surface) 그림의 이동

이상우_idl 2023. 3. 2. 13:35
728x90
반응형

IDL의 NG 체계에서 SURFACE 함수로 표출된 그림에 대하여 시선방향을 조절하는 방법에 관한 게시물을 제가 예전에 올렸던 바 있습니다. 여기서는 표출된 서피스(Surface) 그림 개체에 대하여 Rotate 메서드를 사용하여 몇 차례의 회전을 가하는 방식으로 소개를 했고, 이 과정에서 Rotate 메서드를 적용하는 방법에 관하여 자세히 언급하였습니다. 오늘은 서피스 그림 개체에 대하여 Translate 메서드를 적용하여 이동시키는 방법에 관하여 다뤄보고자 합니다. 사실 NG 체계에서 표출된 그림 개체에 대하여 Translate 메서드를 사용하여 이동시키는 방식 자체는 그리 복잡한 것은 아닙니다. 특히 PLOT, IMAGE 등의 함수들에 의하여 2차원적으로 표출된 그래픽 개체의 경우에는 X축 또는 Y축 방향으로 이동시키면 되므로 매우 간단합니다. 즉 X축 방향이 좌우 방향 그리고 Y축 방향은 위아래 방향에 대응되기 때문에 직관적이기도 합니다.

 

그런데 SURFACE, PLOT3D, SCATTERPLOT3D, VOLUME 등의 함수들에 의하여 3차원적으로 표출된 그림의 경우에는 Z축 방향이 추가된다는 특성 때문인지는 몰라도 약간 미묘한 부분 즉 우리의 생각과는 좀 다른 특성이 있습니다. 그래서 오늘은 SURFACE 함수에 의하여 표출된 그림을 Translate 메서드를 사용하여 이동시키는 방법에 관하여 자세히 살펴보고자 합니다. 먼저 예제 데이터를 생성하고 서피스의 형태로 표출하는 과정 및 표출 결과는 다음과 같습니다.

 

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)
sf = SURFACE(data, COLOR='hot pink', /CURRENT)

 

 

이제 이 그림에 대하여 Translate 메서드를 적용하여 이동을 시켜보겠습니다. 지금부터 여러가지 방식으로 이동을 시켜본 결과들을 보여드릴텐데, 그 기준은 위의 그림이 될 것입니다. 일단 IDL 도움말에서 Translate 메서드를 사용하는 문법은 다음과 같이 소개되어 있습니다.

 

graphic.Translate, X, Y, Z [, /DATA] [, /DEVICE] [, /NORMAL] [, /RESET]

 

즉 X, Y, Z 각 축 방향으로 이동시키고자 하는 양을 순서대로 적어주면 되는데, 이동할 거리는 좌표계에 맞춰서 적절한 값을 주면 됩니다. 여기서는 Normal 좌표계를 기준으로 해보겠습니다. 먼저 X축 방향으로 Normal 좌표계 기준으로 0.2만큼 이동시켜봅시다. 그 과정 및 결과는 다음 그림과 같습니다.

 

* 이후의 표출 그림들에서는 원활한 비교를 위하여 원래 위치의 서피스 그림을 흐릿하게 처리하여 중첩해놓았습니다. 물론 이것은 제가 편의상 일부러 삽입한 것일 뿐 실제로는 이 흐릿한 서피스는 나타나지 않는다는 점을 유의하시기 바랍니다.

 

sf.Translate, 0.2, 0, 0, /NORMAL

 

 

맨 처음에 표출했던 기준 그림과 비교해보면 분명히 이동을 한 것은 확인이 됩니다. 다만 그 방향에 주목해야 하는데요. 앞서 제가 "X축 방향으로 Normal 좌표계 기준으로 0.2만큼" 이동시킨다고 했는데, 여기서 "X축"은 서피스 개체의 XYZ축을 구성하는 X축에 대응된다는 점을 유의해야 합니다. 즉 평면적인 그림상에서의 가로방향(오른쪽 또는 왼쪽)이 아니라는 뜻입니다.

 

방금 언급한 내용은 나머지 Y, Z 축의 경우도 마찬가지입니다. 즉 다음과 같이 Y축 방향으로 이동을 시켜서 결과를 보면 다음과 같습니다. 여기서는 먼저 Translate 메서드를 RESET 키워드와 함께 사용함으로써 서피스 개체의 위치를 초기화한 후에 Y축 방향으로 이동을 시켰음을 유의해야 합니다.

 

sf.Translate, /RESET

sf.Translate, 0, 0.2, 0, /NORMAL

 

 

이와 같이 "Y축"은 서피스 개체의 XYZ축을 구성하는 Y축에 해당된다는 것을 확인할 수 있습니다. 그리고 다음과 같이 Z축 방향으로 이동도 테스트해보면 결과는 다음과 같습니다.

 

sf.Translate, /RESET

sf.Translate, 0, 0, 0.2, /NORMAL

 

 

이와 같이 "Z축"은 서피스 개체의 XYZ축을 구성하는 Z축에 해당된다는 것을 확인할 수 있습니다. 여기까지 서피스 그래픽 개체를 이동시키는데 있어서 Translate 메서드를 Normal 좌표계 기반으로 적용하는 방법 및 결과를 살펴보았습니다. 사실은 Normal 좌표계 이외에도 Data 및 Device 좌표계 기반으로도 이동시키는 것도 가능합니다만, 제가 테스트해본 바로는 Normal 좌표계 기반으로 하는 것이 가장 직관적인 것 같아서 이 방법을 추천해드리고 싶습니다. 다만 여기서 한가지 더 짚어보고자 하는 것이 있는데요. 이동의 방향을 평면적인 그림상에서의 가로방향(오른쪽 또는 왼쪽)으로 할 수는 없을까 하는 것입니다. 일단 세로방향의 경우는 바로 앞서 Z축 방향으로의 이동으로 가능한 반면 가로방향은 위의 방법으로는 바로 되지는 않습니다. 물론 가로방향의 이동도 결국은 가능은 합니다만 이를 위해서는 추가적인 과정이 필요합니다. 예를 들어 서피스 개체를 Normal 좌표계 기준으로 0.5만큼 오른쪽으로 이동시키는 방법은 다음과 같습니다.

 

sf.Rotate, /RESET
sf.Translate, 0.5, 0, 0, /NORMAL
sf.Rotate, 30, /XAXIS
sf.Rotate, 30, /YAXIS
sf.Rotate, -90, /XAXIS

 

여기서는 Translate 외에도 Rotate 메서드가 여러 차례 사용되었습니다. 이것은 서피스 개체의 시선 방향을 리셋을 한 상태에서 원하는 방향으로 이동을 시킨 다음 원래의 시선 방향으로 돌려놓는 과정이라고 보면 됩니다. 결과는 다음 그림과 같습니다.

 

 

이 그림을 보면 정확히 가로 방향으로 이동했음을 확인할 수 있습니다. 그리고 세로 방향도 당연히 가능한데, 0.5만큼 위쪽으로 이동시키려면 위의 과정에서 Translate 메서드가 사용된 부분만 다음과 같이 바꿔주면 됩니다.

 

sf.Translate, 0, 0.5, 0, /NORMAL

 

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

 

 

따라서 SURFACE 함수로 표출된 서피스 그래픽 개체를 이동시키는데 있어서는 이와 같은 방법들을 적절히 활용하면 될 것 같습니다. 그리고 오늘 소개된 방법들은 서피스 뿐만 아니라 PLOT3D, SCATTERPLOT3D, VOLUME 등과 같이 3차원적인 그림을 표출하는 모든 그래픽 함수들에 대해서 동일하게 적용된다는 점을 염두에 두시기 바랍니다.

반응형