얼마전에 IDL User 게시판에 올라왔던, 극좌표계(Polar Coordinate)에서 벡터장을 표출하는 방법에 관한 질문이 있었습니다. 제가 간단하게 답변을 달긴 했는데 아무래도 이 기회에 한번 다뤄볼만한 주제인 것 같아서 여기서 간략하게 한번 요약을 해보려고 합니다.
그냥 일반적인 직교좌표계가 아닌 극좌표계에서의 벡터 표현이라는 부분이 조금 헷갈릴 수 있는 부분인데요. 일단 설명을 위한 예제 자료를 다음과 같이 r, theta이라는 배열로 만들어보았습니다. 각각 30개짜리 1차원 배열입니다.
r = FINDGEN(31)/30
theta = 2*!PI*r
그리고 다음과 같이 그림을 그리기 위하여 그래픽 창을 띄우고 PLOT 프로시저를 사용하였습니다.
DEVICE, DECOMPOSED=0
WINDOW, XSIZE=400, YSIZE=400, RETAIN=2
LOADCT, 0
PLOT, r, theta, /POLAR, PSYM=4, BACKGROUND=255, COLOR=0, $
XST=5, XRANGE=[-1, 1], YST=5, YRANGE=[-1, 1]
AXIS, 0, 0, XAX=0, COLOR=0
AXIS, 0, 0, YAX=0, COLOR=0
이 내용은 DG(Direct Graphics) 체계에서 그림 표출을 위하여 거치게 되는 일반적인 과정들이긴 합니다. 주목할 부분은 PLOT 프로시저에서 /POLAR 키워드를 사용하여 극좌표계 기반으로 그림을 그렸다는 점입니다. 또한 XST, YST 키워드를 5로 설정한 부분, 그리고 바로 뒤에서 AXIS 프로시저를 사용한 부분이 좀 생소할 수 있습니다. 이러한 과정은 극좌표계 그림을 좀 더 그럴듯하게 그리기 위하여 사용된 기교라고 보시면 됩니다. 이 과정에 대해서는 너무 자세히 언급하지는 않겠습니다. 일단 이와 같은 과정을 거친 그림은 다음과 같습니다.
그런데 지금 우리는 이러한 위치마다 벡터값들이 존재하는 경우를 보고 있습니다. 따라서 각 위치마다 존재하는 벡터의 X방향 성분 및 Y방향 성분의 값들이 u, v라는 배열로 존재한다고 가정합시다. 물론 u, v도 다음과 같이 임의로 생성하였습니다.
u = (RANDOMU(seed, 31)-0.5)/3
v = (RANDOMU(seed, 31)-0.5)/3
당연한 얘기지만 u, v 모두 r, theta와 배열구조는 같습니다. 그러면 이 벡터들을 표출해야 하는데, 지금 현재 그려진 그림은 극좌표계 기반입니다. 그런데 IDL에서 벡터를 표출하는 프로시저나 함수들이 물론 있지만, 모두 직교좌표계 기반으로 작동합니다. 극좌표계 기반으로 작동하는 명령은 없습니다. 따라서 벡터를 표출하는데 있어서는 직교좌표계 기반의 x, y, u, v와 같은 형태의 값들이 필요합니다. 즉, 벡터의 위치좌표, 각 성분 크기가 모두 직교좌표계 기반의 데이터로 존재해야 합니다. 그래서 다음과 같이 극좌표 기반의 위치좌표 데이터를 이용하여 직교좌표 기반의 위치좌표들로 바꾸었습니다.
x = r*COS(theta)
y = r*SIN(theta)
별로 대단한 것은 아니고 그냥 삼각법으로 사인, 코사인만 취한 것 뿐입니다. 이제는 벡터들을 표출해야 하는데, 다음과 같이 ARROW라는 프로시저를 사용해보았습니다.
LOADCT, 5
ARROW, x, y, x+u, y+v, /DATA, COLOR=50, THICK=2
LOADCT, 0
참고로 벡터의 색상을 푸른색으로 표현하기 위하여 5번 컬러테이블을 잠시 사용하였습니다. 여기서는 ARROW 프로시저에 붙어있는 인수들의 형태를 잘 봐야 하는데요. 각 벡터의 시작 X좌표, 시작 Y좌표, 끝 X좌표, 끝 Y좌표의 순서라고 보면 됩니다. 자세한 것은 IDL 도움말에 잘 나와 있습니다. 어쨌든 이와 같은 과정을 거치면 다음과 같은 그림을 얻게 됩니다.
각 위치마다 해당 벡터의 방향 및 성분이 고려된 화살표들이 표시된 것을 볼 수 있습니다. 혹시나 화살표의 길이가 현재 좌표계의 스케일과 완전히 다른 경우라면 그냥 u, v 성분에 일정 값을 곱하는 식으로 조절이 가능할 것입니다. 그리고 그림이 좀 투박해 보일 수 있는데, ARROW 프로시저의 각종 키워드 옵션들을 조정하여 구미에 맞도록 개선해나갈 수 있을겁니다.
참고로 이와 유사한 그림은 NG(New Graphics) 체계에서도 구현이 가능합니다. 방법은 다음과 같습니다.
win = WINDOW(DIMENSIONS=[500, 500])
pp = POLARPLOT(r, theta, SYMBOL='d', LINESTYLE='', XRANGE=[-1, 1], YRANGE=[-1, 1], /CURRENT)
FOR i = 0, N_ELEMENTS(x)-1 DO $
arr = ARROW([x[i], x[i]+u[i]], [y[i], y[i]+v[i]], /DATA, HEAD_SIZE=0.5, COLOR='Blue')
여기서는 POLARPLOT, ARROW 함수가 활용되었습니다. POLARPLOT 함수의 경우는 인수 및 키워드의 사용에 있어서 그리 어려운 부분은 없습니다. 그냥 DG 체계에서 PLOT 프로시저에 /POLAR 키워드 사용한 것과 유사하다고 보면 됩니다. 그리고 ARROW라는 함수가 사용되었는데, 앞서 사용했던 ARROW 프로시저와 유사합니다. 즉, 사용되는 인수들의 구성은 거의 같다고 보면 됩니다. 다만 8.1버전 현재 ARROW 함수는 아직 배열들을 인수로 받지는 못하는 상황이어서 이와 같이 부득이하게 반복문을 사용했습니다. 참고로 8.2버전에서는 배열들도 인수로 받게 될거라고 합니다. 어쨌든 이와 같이 NG 체계에서 그려본 그림은 다음과 같습니다.
물론 iTools의 iVector 프로시저도 다음과 같이 사용이 가능합니다. 이 테스트는 각자 해보시기 바랍니다. 어차피 iTools에서도 유사한 키워드 옵션들이 있기 때문에 적당히 조절하면 유사한 결과를 얻을 수 있을겁니다.
iVector, u, v, x, y
'IDL > Direct Graphics' 카테고리의 다른 글
DG 그래픽 체계에서 Z-buffer에 그림을 그리고 저장하는 방법 (0) | 2012.11.21 |
---|---|
플롯상의 각 점들을 서로 다른 색상으로 표출하는 방법 [2] (0) | 2012.07.27 |
Mac OS X Lion에서 TVRD 사용시 에러 해결방법 (0) | 2011.11.21 |
PostScript에서 플롯과 이미지를 함께 표출하기 [1] (0) | 2011.11.07 |
불연속적인 색상분포의 컬러테이블을 사용하려면? (0) | 2011.10.24 |