좌표계를 변환시키는 cv_coord함수

안녕하세요? IDL User 여러분, 오늘은 편리하게 쓸 수 있는 함수를 알아보고자 합니다. cv_coord 라는 이름의 함수인데요. 이 함수의 역할은 좌표계를 변환시키는 일입니다. 이 함수에서 변환할 수 있는 좌표계는 2차원의 직교좌표계와 극좌표계, 3차원의 직교좌표계, 구면좌표계, 원통좌표계 가 있습니다.

cv_coord는 함수 자체에 변수를 받는 부분이 없습니다. 따라서 함수를 이용하기 위해서는 필요한 키워드를 넣어주는 것이 중요합니다. cv_coord 함수를 직접 사용하면서, 키워드에 대해서 알아봅시다.

사용한 함수를 보면, 함수의 이용의 핵심이 되는 두가지의 키워드를 볼 수 있습니다. 하나는 from_rect이고, 하나는 /to_polar 입니다.

from이 붙은 키워드는 변환하는 좌표의 좌표계를 알려주는 역할을 합니다. 여기서는 from_rect이므로, 직교좌표계에서 변환을 하겠다고 선언하는 것이지요. 이 키워드는 변환하려고 하는 좌표계에 따라서 바꿔서 사용할 수 있습니다. 이에 해당하는 키워드들은 직교좌표에서 쓰는 from_rect, 극좌표에서 사용하는 from_polar, 구면좌표계에서 사용하는 from_sphere, 원통좌표계에서 사용하는 from_cylin이 있습니다.

to가 붙은 키워드는 변환될 좌표계의 이름입니다. 여기서는 to_polar이므로, 결과를 극좌표로 출력한다는 것을 알 수 있습니다.  이 키워드는 from키워드와 동일한 규칙으로 작성되어 있으며, to_rect는 직교좌표계, to_polar는 극좌표계 to_sphere는 구면좌표계, to_cylin은 원통좌표계로 변환을 한다는 키워드입니다.

이 때 각 좌표계에서 입력을 받거나 출력하는 데이터의 형태는 다음과 같습니다.

  1. 직교 좌표계 : [x,y] 혹은 [x,y,z]
  2. 극좌표계 : [angle, radius]
  3. 구면좌표계 : [longitude, latitude, radius]
  4. 원통좌표계 : [angle, radius, z]

극좌표계, 구면좌표계 원통좌표계의 경우, [radius, angle] 같은 형태로 주어지지 않는다는 것이 가장 중요한 내용입니다. 또한 위에서 표현되지는 않았지만, 각도도 기본은 radian을 이용합니다. 이 내용은 아래에 추가 키워드를 설명할 때 다시 다루도록 하겠습니다.

기본 함수를 보니 새로 궁금한 것이 생기게 됩니다. 바로 각 좌표값이 배열로 존재할 경우입니다. 이 경우에는 좌표를 배열로 준비해야 합니다. 배열은 좌표의 차원에 따라서 (2,n) 혹은 (3,n)의 배열로 만들어야 합니다. 단순히 x값의 배열과 y값의 배열을 붙일경우 (n,2) 형태의 배열이 되기 때문에 제대로 된 결과가 출력되지 않습니다. 이러한 점은 아래에 코드를 통해서 표현하였습니다.

rect_wrong이 (10,2)형식의 배열이었기 때문에 잘못된 결과가 나온 것을 볼 수 있습니다. 출력된 결과는 두개의 x좌표를 하나의 좌표로 결정하고, 두 개의 y좌표를 하나의 좌표로 결정해서 보냈다는 것을 알 수 있습니다. 이것을 제대로 출력하기 위해서는 배열을 (2,10)의 모양으로 바꿀 필요가 있습니다.

IDL에서는 이러한 작업을 위해서 transpose라는 함수를 가지고 있습니다. transpose를 이용해서 제대로 된 cv_coord의 결과를 출력하도록 하겠습니다.

이번에는 출력된 결과가 한 줄에 한 쌍씩 잘 맞게 출력된 것을 볼 수 있습니다. 이처럼 배열의 순서를 제대로 하지 않으면 문법적 오류가 아니더라도 문제가 생기게 되니 잘 살펴보시고 사용하셔야 합니다.

여기까지 익혔다면, 역시 마지막으로 추가 키워드를 살펴보는 것이 좋겠네요. 다행스럽게도 cv_coord함수는 위에서 말했던 키워드들을 제외하면 2가지의 키워드만을 가지고 있습니다. 그것이 바로 /degree와 /double입니다.

degree는 각도로 주어지는 좌표값을 radian이 아닌 degree로 하겠다고 선언하는 키워드입니다. 이것은 입력과 출력에 모두 적용되는 선언이기 때문에 입력도 degree 출력도 degree인 것을 조심해야 합니다. 그 특징을 제대로 파악하기 위해서 degree키워드를 통해서 직교좌표계에서 극좌표계로 변환한 다음 다시 직교좌표계로 돌아가는 코드를 보도록 하겠습니다.

직교좌표계의 (-3,2)점의 극좌표계값은 radius 값이 3.60555, angle 값이 146.310입니다. 여기에서 angle은 degree 단위로 출력이 된 것을 알 수 있습니다. 이 값을 그대로 직교좌표계로 옮기면서 다시 /degree를 키워드로 주니, 다시 처음에 주었던 (-3,2)의 직교 좌표계 값이 나오게 됩니다. 만약 /degree를 주지 않는다면 다음과 같은 결과를 출력하게 됩니다.

보시는 것처럼, 동일한 polar_deg를 이용해서 cv_coord를 했지만, 다른 값이 나오는 것을 알 수 있습니다.

double 키워드는 double 데이터 형을 갖게 하는 키워드입니다. 이 키워드를 이용하면, float형으로 출력되는 데이터가 더 자세한 결과를 가지게 됩니다. 이 키워드는 데이터 형의 차이만 가지므로, help를 통해서 그 차이를 구별할 수 있습니다.

print 프로시저 자체의 출력의 한계가 있어서 크게 드러나지는 않지만, float형태의 데이터의 정밀도보다 double형태의 데이터의 정밀도가 더 높은 것을 알 수 있습니다.

cv_coord 함수에 대해서 적다보니 꽤 긴 글이 되었습니다. 여기 있는 내용이 cv_coord 함수의 전부라고 할 수 있으니, 유용하게 사용하셨으면 좋겠습니다.