IDL/Programming

벡터(Vector)의 각도에 대한 정의 및 관련 이슈

이상우_IDL 2021. 12. 3. 16:14
728x90

오늘은 벡터(Vector)의 각도를 정의하는 몇가지 방식들에 관해서 얘길 해보고자 합니다. 특히 기상 분야에서 바람의 방향을 각도로 나타내는데 있어서 어떤 정의를 사용하느냐에 따라 그 값이 달라지는 경우가 가장 대표적인 사례인데요. 즉 벡터의 방향각을 정의하는 방식에 있어서는 원론적인 방식 외에도 기상학적 관점에서 사용되는 방식들도 있는데 이러한 방식들 사이에는 분명한 차이가 있습니다. 따라서 오늘은 이러한 이슈에 관해서 알아보고 IDL 코딩에 있어서는 어떤 방법으로 처리해야 할 것인가에 대해서도 함께 간략히 살펴보기로 하겠습니다. 일단 그림 하나를 먼저 보겠습니다.

 

 

이 그림은 우리가 벡터를 정의하는 원론적인 방식을 나타냅니다. 이러한 벡터의 방향은 U 성분과 V 성분으로 나눠지게 됩니다. 우리가 흔히 접하게 되는 벡터 데이터라면 아무래도 풍속과 풍향과 같이 유체의 흐름을 나타내는 데이터가 대표적일텐데요. 이러한 데이터들을 보면 통상적으로 각 벡터의 U 성분 및 V 성분에 해당되는 값들을 함께 포함하는 경우가 많습니다. 하여간 위의 그림을 다시 보면 벡터의 방향각이 60도라고 되어 있습니다. 이것은 기하학적으로는 X축 방향 또는 방위로는 동쪽 방향을 기준으로 반시계 방향으로 측정되는 각도입니다. 따라서 반경 r과 각도 theta가 주어진 상태에서 u와 v 성분 값들을 계산할 수 있습니다. 우리가 흔히 극좌표(Polar Coordinate)라고 하는 체계에서는 데이터 포인트의 위치가 (r, theta)로 주어지고 이를 u, v 값으로 환산하면 그 값들은 XY 좌표계(Cartesian 또는 Rectangular)의 좌표가 됩니다. 이러한 상호 관계를 코딩에 의하여 환산하는 과정을 예로 들면 다음과 같습니다.

 

r = 3.0
theta = 60.0
u = r*COS(theta*!DTOR)
v = r*SIN(theta*!DTOR)

 

이와 같은 방식을 Polar 방식이라고 하며 여기서는 X축 또는 동쪽 방향을 기준으로 반시계 방향으로 각도를 측정합니다. 그런데 벡터의 각도를 산정하는 방식에 있어서는 다른 경우들도 존재합니다. 그 중 하나가 Wind Azimuth 방식인데 여기서는 Y축 또는 정북 방향을 기준으로 시계 방향으로 각도를 측정합니다. 따라서 동일한 방향의 벡터라 하더라도 측정 방식에 따라서 각도의 값 자체가 달라지게 됩니다. 앞선 예제 그림에서는 극좌표 체계 기준인 Polar 방식의 방향각이 60도였던 벡터가 있었는데, 동일한 벡터에 대한 Wind Azimuth 방식의 방향각은 30도가 됩니다. 즉 다음 그림과 같습니다.

 

 

일단 여기서 유의해야 할 점은 정북 방향을 기준으로 각도를 재는데 있어서 벡터가 향하는 방향을 대상으로 각도를 측정한다는 것입니다. 즉 바람의 경우로 본다면 바람이 향하는 방향이 그 대상이 됩니다. 어떻게 보면 당연한 얘기인 것 같기도 하지만 굳이 이렇게 짚고 넘어가야 하는 이유는 나중에 언급할 또 다른 방식과의 비교를 위해서입니다. 그리고 이 값을 실제로 계산하는 과정은 다음과 같습니다.

 

theta_wind = ATAN(u, v)*!RADEG

 

이와 같이 ATAN 함수 및 !RADEG 값을 사용합니다. !RADEG 값을 사용한 이유는 결과를 도(Degree) 단위로 얻기 위함입니다. 만약에 결과를 라디안(Radian) 단위로 얻고자 할 경우에는 위의 식에서 !RADEG를 곱하는 부분을 빼면 됩니다. 어쨌든 위와 같은 계산법을 사용하면 Wind Azimuth 방식의 각도를 얻을 수 있습니다.

 

그리고 벡터의 각도를 산정하는 또 다른 방식이 있는데 바로 Meteorological 방식입니다. 즉 기상학적 방식이라고 하는데 여기서는 각도를 측정하는 기준 및 방향은 Wind Azimuth 방식과 동일합니다. 다만 결정적 차이점은 벡터가 향하는 방향의 반대 방향을 대상으로 각도를 측정한다는 것입니다. 즉 바람의 경우로 본다면 바람이 향하는 방향이 아니라 바람이 불어오는 방향이 됩니다. 즉 바람이 어느 쪽에서 불어오느냐를 기준으로 삼기 때문에 바람이 향하는 방향과는 완전히 반대가 됩니다. 도식적으로 보면 다음 그림과 같습니다.

 

 

결국 Meteorological 방식과 Wind Azimuth 방식은 각도를 측정하는 기준 및 방향은 동일하지만 측정의 대상이 되는 방향이 서로 반대인 셈입니다. Meteorological 방식의 각도를 계산하는 과정은 다음과 같습니다.

 

theta_met = ATAN(-u, -v)*!RADEG

 

앞서 Wind Azimuth 방식의 각도를 계산하는 식과 비교해보면 투입되는 u, v가 서로 반대 방향임을 확인할 수 있습니다. 그리고 위의 그림에서는 각도가 210이라고 되어 있는데 계산값 자체는 -180~+180의 범위로 한정되기 때문에 실제로는 -150으로 산출됩니다. 어차피 여기서는 210이나 -150이나 서로 동일한 각도입니다.

 

일단 여기서 정리를 한번 해본다면, 벡터의 방향에 대한 데이터가 U, V 성분으로 주어지면 이 성분들에 의하여 벡터의 방향이 정해지는데 그 방향을 각도로 환산할 경우에 어떤 방식을 기준으로 하느냐에 따라서 각도의 값이 달라지게 된다는 것을 유의해야 합니다. 그런데 우리가 실제로 얻게 되는 벡터 데이터가 U, V 성분값을 포함하지 않고 각도 값만 포함한 경우도 있습니다. 물론 이 각도가 일반적인 Polar 방식 기반의 각도라면 U, V 성분을 계산하는 것은 쉽습니다. 즉 반경 및 각도 값이 r, theta로 주어질 경우의 계산 과정은 이미 맨 처음에 보았던 식과 동일할 것입니다.

 

u = r*COS(theta*!DTOR)
v = r*SIN(theta*!DTOR)

 

그런데 어떤 경우에는 데이터로 포함된 각도의 값 자체가 이미 Wind Azimuth 또는 Meteorological 방식인 경우도 간혹 있습니다. 이런 경우가 좀 골치가 아픕니다. 왜냐하면 IDL과 같은 프로그래밍 언어들에 내장된 각도 관련 연산 기능들은 모두 Polar 방식을 기준으로 하기 때문에, Polar가 아닌 다른 방식의 각도 값들만 데이터로 주어진 경우에는 이 값들을 이후의 수학적 계산 또는 가시화 과정에서 바로 투입해서 사용하기는 힘들기 때문입니다. 따라서 이러한 각도 값들로부터 U, V 성분을 계산하고 또 필요에 따라서는 Polar 방식의 각도로 환산하는 것까지도 필요할 것입니다. 만약 Wind Azimuth 방식의 각도 값이 theta_wind라는 변수로 주어질 경우 이를 U, V 성분 및 Polar 방식의 각도로 환산하려면 다음과 같이 계산하면 됩니다.

 

theta_wind = 30
u = r*SIN(theta_wind*!DTOR)
v = r*COS(theta_wind*!DTOR)
theta = ATAN(v, u)*!RADEG

 

여기서 theta의 값을 출력해보면 Wind Azimuth 방식의 각도 30도가 Polar 방식의 각도 60으로 계산되었음을 확인할 수 있습니다. 그리고 만약 Meteorological 방식의 각도 값이 theta_met이라는 변수로 주어질 경우 이를 U, V 성분 및 Polar 방식의 각도로 환산하려면 다음과 같이 계산하면 됩니다.

 

theta_met = 210
u = -r*SIN(theta_met*!DTOR)
v = -r*COS(theta_met*!DTOR)
theta = ATAN(v, u)*!RADEG

 

여기서 theta의 값을 출력해보면 Meteorological 방식의 각도 210도가 Polar 방식의 각도 60으로 계산되었음을 확인할 수 있습니다. 물론 210도 대신 -150도로 투입해도 결과는 같습니다.

 

오늘 소개한 내용은 아마 방향성을 갖는 벡터 데이터를 다뤄야 하는 경우에는 의외로 골치아프게 다가오는 그래서 특히 더 유의해서 고려해야 할 이슈이기 때문에, 이러한 데이터를 처리해야 하는 유저들께서는 염두에 두실 것을 권장해봅니다.

LIST