지난 6월초쯤에 제 블로그의 자매 사이트라 할 수 있는 idluser.org에 어떤 분께서 VECTOR 함수에 관한 질문을 올리신 적이 있습니다. 그 내용을 저도 자세히 확인해보니 아무래도 이 VECTOR 함수 자체에 뭔가 문제가 있다는 판단이 들었고, 본사인 ITTVIS에 문의해본 결과 문제가 있다는 답을 받았습니다. 물론 ITTVIS에서 이 문제점을 조만간 수정해주길 바라긴 하지만, 실제로 언제쯤 수정이 될지는 저도 예측은 못합니다. 그래서 이 문제가 어떤 문제인지, 그리고 완벽하진 않지만 나름의 해결책은 어떤 것인지를 적어보려고 합니다.
문제의 핵심은 사실 벡터를 표시하는 함수로서는 꽤 치명적인 것인데, VECTOR 함수로 표시되는 벡터들의 길이와 방향이 실제 값들과 동떨어진 모습을 보이는 문제입니다. 처음에 질문하셨던 분께서 예제로 들어주신 벡터자료는 다음과 같습니다.
u= [2, 1, 1, 1, 2, 3] v= [0, 0, 0, 1, 2, 3] x= [0, 0, 2, 4, 5, 6] y= [0, 0.5, 3, 8,10, 6]
여기서 x, y는 벡터 화살표의 시작점의 좌표이고, u, v는 X 및 Y 방향의 성분값입니다. 총 6개의 벡터들로 구성된 자료인데, 예를 들어 첫번째 벡터의 경우 위치는 [0, 0]이고 X 및 Y 방향으로 각각 2와 0이라는 성분값을 갖습니다. 즉, [0, 0]의 위치에서 수평방향으로만 2만큼의 길이를 갖는 벡터가 됩니다. 이 벡터들을 다음과 같은 과정으로 VECTOR 함수를 이용하여 표출해보았습니다.
win1 = WINDOW(DIMENSIONS=[500, 500]) vec = VECTOR(u, v, x, y, XRANGE=[0, 10], YRANGE=[0, 15], DATA_LOCATION=0, HEAD_SIZE=0.3, $ COLOR='Magenta', /CURRENT) title1 = TEXT(0.5, 0.95, 'VECTOR function', ALIGNMENT=0.5, COLOR='Blue', /NORMAL)
원래 VECTOR 함수는 u, v 성분 및 x, y 좌표값들을 인자로 받아들이게 되어 있습니다. 여기서 X축의 범위는 0~10으로 그리고 Y축의 범위는 0~15로 설정하였습니다. 그런데 그 결과를 보면 다음 그림과 같습니다.
벡터별로 일일이 설명은 생략하겠지만, 좀만 들여다보면 벡터의 길이나 방향 모두 원래의 의도에서 상당히 벗어나있음을 확인할 수 있습니다. 물론 이 VECTOR 함수에서 사용 가능한 다른 여러 속성들을 조정해서 테스트를 해봐도 역시 원하는 결과가 나오질 않았습니다. 그래서 제가 이 벡터자료를 바탕으로 이번에는 ARROW 함수를 사용하여 따로 벡터들을 표출해보았습니다. 일단 그 과정은 다음과 같습니다.
win2 = WINDOW(DIMENSIONS=[500, 500]) pl = PLOT(y, XRANGE=[0, 10], YRANGE=[0, 15], /NODATA, /CURRENT) nn = N_ELEMENTS(y) arrs = OBJARR(nn) FOR i = 0, nn-1 DO BEGIN xps = [x[i], x[i]+u[i]] yps = [y[i], y[i]+v[i]] arrs[i] = ARROW(xps, yps, COLOR='Magenta', FILL_COLOR='Magenta', /DATA, /OVERPLOT) ENDFOR FOR i = 0, nn-1 DO arrs[i].LINE_THICK = 2 title2 = TEXT(0.5, 0.95, 'ARROW function', ALIGNMENT=0.5, COLOR='Blue', /NORMAL)
ARROW 함수는 VECTOR 함수와는 달리 벡터 하나의 시작점 및 끝점에 대한 X 및 Y 좌표값들을 인자로 받아들이게 되어 있습니다. 그래서 이 자료의 첫번째 벡터의 경우를 예로 들면, 시작점 및 끝점의 X 좌표값은 각각 0, 0+2가 되고 Y좌표값은 0, 0+0이 됩니다. 그래서 인자를 [0, 2], [0, 0]과 같이 주고 이와 같은 과정을 다른 벡터들에 대해서도 반복하도록 해줘야 합니다. 그리고 각각의 벡터를 독립적인 객체로 다뤄야 하기 때문에 OBJARR이라는 함수를 써서 벡터의 갯수만큼의 객체배열을 사용하였습니다. 약간 설명이 복잡하긴 했지만, 결과를 그림으로 보면 다음과 같습니다.
앞서 VECTOR 함수로 구현된 결과와 비교해보면, 아마 벡터들의 위치 및 방향, 길이 등이 원래 의도했던 것과 같이 표출되어 있다는 것이 바로 확연히 나타날 것입니다. 그래서 사실 이렇게 ARROW 함수를 사용하는 것이 VECTOR 함수를 사용하는 것보다는 편의성이 약간 떨어지긴 하지만, 결과가 제대로 나오는 것이 중요하므로 이와 같은 방법을 사용하시길 권장합니다. 하여간 VECTOR 함수의 이와 같은 문제는 가급적 빠른 시일내에 수정되기를 기대해봅니다.
'IDL > New Graphics' 카테고리의 다른 글
새로운 그래픽 함수들 목록 정리 (8.1 기준) [2] (0) | 2011.08.04 |
---|---|
새로운 그래픽 함수들 목록 정리 (8.1 기준) [1] (0) | 2011.08.04 |
새로운 그래픽의 IMAGE 기능 소개 [2] (0) | 2011.07.19 |
새로운 그래픽의 IMAGE 기능 소개 [1] (0) | 2011.07.12 |
새로운 그래픽의 Contour 기능 소개 [3] (2) | 2011.06.27 |