천문 계산

음력-양력 상호 변환 함수 모듈에 관한 간단한 설명 2

by 창환 posted Sep 06, 2010
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

아주 오래 쉬었습니다.

지난 번의 글에서 함수의 역할만 대강 설명을 했는데, 이번 글부터는 조금 더 자세히 설명토록 하겠습니다.

음양력 변환  함수에 대해 설명하기에 앞서, 이 함수가 작동하기 위해 필요한 부속 함수부터 설명하겠습니다.

이 글에서는 먼저 수학함수와 좌표계산에 쓰이는 함수에 대해서만 알아보고, 시간 관련 함수는 다음 글에서 설명하겠습니다.

1. 수학 함수

먼저 계산에 필요한 수학 함수부터 살펴보겠습니다. 이 범주에는 Sind(), Cosd(), Tand(), Arccosd(), Rev() 함수가 있습니다. 


(1) Sind(x), Cosd(x), Tand(x), Arccosd(x)

이 함수들은 삼각함수입니다. 프로그램 언어 자체에 삼각함수가 포함되어 있지만, 내장함수는 호도법을 이용합니다. 여기에서는 편리하게 쓰기 위해 호도법 대신 360분법을 쓰는 삼각함수를 만들었습니다.


Sind: 도(degree) 단위의 sin 계산
Cosd: 도(degree) 단위의 cos 계산
Tand: 도(degree) 단위의 tan 계산
Arccosd: 도(degree) 단위의 역 cos 계산


함수 자체에 특이한 부분은 없습니다. 각도 입출력 부분에 1 rad와 1° 사이의 비율(DegtoRad)을 곱하거나 나누어 준 것이 전부입니다.


Private Function Sind(ByVal x As Double) As Double  '사인함수
    Sind = Sin(x * DegtoRad)
End Function

Private Function Cosd(ByVal x As Double) As Double '코사인 함수
    Cosd = Cos(x * DegtoRad)
End Function

Private Function Tand(ByVal x As Double) As Double '탄젠트 함수
    Tand = Tan(x * DegtoRad)
End Function


코사인 함수의 역함수인 Arccosd() 함수는 앞의 세 기본함수보다는 약간 더 복잡합니다. 계산 과정에서 0이 아닌 수를 0으로 나누는 경우가 생길 수 있는데, 이렇게 되면 프로그램은 오류를 일으키며 멈추게 됩니다. 이를 막기 위해 if 문을 써서 몇  가지 경우로 나누어 계산하도록 하였습니다.


Private Function Arccosd(ByVal x As Double) As Double '코사인의 역함수
    If x <= -1 Then  '코사인 값이 -1보다 작으면 180도
      Arccosd = 180
    ElseIf x < 1 And x > -1 Then '코사인 값이 -1과 1 사이이면 계산
      Arccosd = 90 - RadtoDeg * Atn(x / Sqr(1 - x * x))
    Else '코사인 값이 1보다 크면 0도
      Arccosd = 0 
    End If
End Function



(2) Rev()

Rev() 함수는 계산한 값이 0도에서 360도 사이의 범위에 들어오도록 조절해 주는 함수입니다. 이 함수는 각도 계산에서 지나치게 큰 값이 들어가 정밀도가 떨어지는 현상을 막기 위해서(배정도부동소수형 변수는 정수 부분과 소수 부분을 합해서 16자리의 수를 기억할 수 있습니다. 따라서 정수 부분의 자릿수가 커지면 소수점 부분의 자료를 저장할 공간이 줄어들게 되어 계산의 정밀도가 떨어질 수 있습니다.) 또는 계산 결과를 보여줄 때 읽기 편한 값으로 출력하기 위해 사용합니다(예를 들어 -76도 대신 284도로 출력).


Private Function Rev(ByVal x As Double) As Double
    Rev = x - Int(x / 360) * 360
End Function


계산 방법은 단순합니다. 입력 받은 값 x를 360으로 나누어 몫을 구합니다. 그리고 이 몫에 다시 360을 곱해 원래 입력받은 값에서 빼 줍니다. 이렇게 하면 원래의 값은 0~360도 사이의 범위로 들어가게 됩니다. 이 함수는 조금만 편집해 주면 좀 더 유연하게 활용할 수 있습니다.


Private Function Rev(ByVal x As Double, Byval y as Double) As Double
    Rev = x - Int(x / y) * y
End Function


이렇게 고쳐주면 입력 받은 값을 0~y 사이의 값으로 조절해 줍니다.


2. 좌표 계산

이 범주에는 AngDistLon() 함수가 포함됩니다. 이 함수는 두 천체의 경도 방향의 각거리가 얼마인지 계산해 줍니다.


Private Function AngDistLon(ByVal RA1 As Double, ByVal RA2 As Double) As Double
  If RA1 = RA2 Then '두 천체의 경도가 같으면 경도 방향의 각거리는 0도
    AngDistLon = 0
  Else '두 천체의 경도가 다르면 계산.
    AngDistLon = Arccosd(Cosd(RA1 - RA2))
  End If
End Function


역시 계산 방법은 단순합니다. 두 천체의 경도를 입렵 받아 경도값이 같으면 0을 출력하고 아니면 직접 계산해서 출력합니다. 경도의 차이의 코사인 값을 계산한 다음 역함수로 다시 각도를 산출하는 방식을 쓰고 있는데, 이는 출력 값을 0~180도 범위로 만들어 주기 위해서 입니다. 이 함수는 태양의 절입 시각 계산에 쓰입니다.


TAG •