아주 오래 쉬었습니다.
지난 번의 글에서 함수의 역할만 대강 설명을 했는데, 이번 글부터는 조금 더 자세히 설명토록 하겠습니다.
음양력 변환 함수에 대해 설명하기에 앞서, 이 함수가 작동하기 위해 필요한 부속 함수부터 설명하겠습니다.
이 글에서는 먼저 수학함수와 좌표계산에 쓰이는 함수에 대해서만 알아보고, 시간 관련 함수는 다음 글에서 설명하겠습니다.
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도 범위로 만들어 주기 위해서 입니다. 이 함수는 태양의 절입 시각 계산에 쓰입니다.