조회 수 11053 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

이번 글에서는 음력을 양력으로 변환하는 함수와 음양력 변환에 쓰는 보조함수에 대하여 설명하겠습니다. 양력을 음력으로 바꾸는 함수는 다소 긴 설명이 필요하므로 마지막 편에서 다루도록 하겠습니다. 이 글에서 다룰 함수는 다음 3개 입니다. 


Sol2Lun: 양력 날짜에서 음력 날짜를 구하는 함수
Lun2Sol: 음력 날짜에서 양력 날짜를 구하는 함수
InvLuniSolarCal: 음력 날짜를 율리우스 적일로 바꾸는 함수


1. 음양력 변환 함수를 위한 보조함수

음양력 변환함수를 편리하게 쓰기 위한 함수입니다. 여기에는 2개의 함수를 사용합니다. 이 모듈에서 음력을 양력으로, 양력을 음력으로 변환할 때에는 율리우스 적일로 결과를 출력합니다. 율리우스적일은 실생활에서 쓰기에 불편하므로, 이를 상용력으로 출력하도록 바꾸어주는 함수입니다. 양력은 1582년 10월 4일 이전은 율리우스력, 1582년 10월 15일부터는 그레고리력입니다. 


(1)  Sol2Lun(Y, M, D)

양력을 음력으로 바꾸어 출력하는 함수입니다. Y는 양력 연도, M은 양력 월, D는 양력일입니다. 결과는 YYYY-MM-DD 형태의 음력으로 축력하며, 윤달일 경우 "(윤)" 표시가 붙습니다. 

함수 내용 중에  If Y > 1910 Then timezone = 9 Else timezone = 8 부분은 시간권을 지정해주는 부분입니다. 1910년 이전은 중국력에 날짜를 맞추는 경우가 많았기 때문에 중국의 시간권인 +8시간으로 지정해주었고, 그 이후는 현재까지 쓰고있는 시간권인 +9시간으로 설정합니다. 


Public Function Sol2Lun(ByVal Y As Integer, ByVal M As Integer, ByVal D As Integer) As String

  Dim ly As Integer, lm As Byte, LD As Byte, ll As Boolean, jd As Double

  

  jd = JULIANDAY(CDbl(Y), CDbl(M), CDbl(D))

  If Y > 1910 Then timezone = 9 Else timezone = 8 '시간권 설정

  Call LuniSolarCal(jd, ly, lm, LD, ll)

  Sol2Lun = Trim$(Str(ly)) & "-" & Trim$(Str(lm)) & "-" & Trim$(Str(LD)) & IIf(ll, "(윤)", "")

End Function


(2)  Lun2Sol(Y, M, D, Leap)

이 함수는 음력을 양력으로 바꾸어주는 역할을 한다는 점을 빼면 Sol2Lun와 거의 같습니다. Y, M, D는 음력 연, 월, 일이고 Leap는 윤달 여부입니다. 윤달일 때 참값을 갖게 됩니다.


Public Function Lun2Sol(ByVal Y As Integer, ByVal M As Integer, ByVal D As Integer, ByVal Leap As Boolean) As String

  Dim jd As Double, x As Boolean, A As Double, B As Double, c As Double

  

  If Y > 1910 Then timezone = 9 Else timezone = 8 '시간권 설정

  x = InvLuniSolarCal(Y, M, D, Leap, jd)

  If x Then

    InvJD jd, A, B, c

    Lun2Sol = Trim$(Str(CInt(A))) & "-" & Trim$(Str(CInt(B))) & "-" & Trim$(Str(CInt(c)))

  Else

    Lun2Sol = ""

  End If

End Function



2. 음력을 양력으로 바꾸어주는 함수

음력을 양력으로 환산하는 작업은 꽤 까다롭습니다. 그래서 여기에서는 음력날짜를 그대로 양력날짜로 가정하고, 반복 연산을 통해 정확한 양력 날짜를 찾아내는 방식으로 변환을 합니다. 


(1) InvLuniSolarCal(LunarYear, LunarMon, LunarDay, IsLeap, JD)

InvLuniSolarCal 함수는 입력값으로 음력 연도(LunarYear), 음력 월(LunarMon), 음력 일(LunarDay)을 받아서, 긍 해당하는 율리우스적일(JD)를 출력합니다. 함수 자체의 반환값은 참과 거짓인데 입력받은 음력날짜에 해당하는 날이 있으면 참, 없으면 거짓을 출력합니다. 예를들어 음력 2012년 12월 13일(윤)을 입력하면 이 날은 실제로 존재하지 않으므로 거짓을 출력합니다.  

InvLuniSolarCal 함수는 직접 음력을 양력으로 환산하는 함수는 아닙니다. 최초에 근사값을 하나 정한 다음, 양력을 음력으로 바꿔주는 함수인 LuniSolarCal 함수를 이용해서 점점 실제값에 가까운 값은 찾아가는 방식으로 계산을 합니다. 

이 함수는 다음과 같은 몇가지 특성에 착안하여 설계하였습니다. 


1) 음력날짜는 같은 월와 일 이름을 가지는 양력 날짜에 비하여 보통 20~30일 정도 늦게 나타난다. 

2) 윤달은 같은 월와 일 이름을 가지는 양력 날짜에 비하여 보통 40~50일 정도 늦게 나타난다.

3) 음력 날짜에 1과 2의 조건을 넣어 양력의 근사값을 만들면 근사값에서 2~3개월 이내의 범위에서 입력한 음력에 대응하는 정확한 양력일을 찾을 수 있다.


이 3가지 특성을 바탕으로 최초의 근사값을 찾은 다음, 점차 참값에 접근하는 방식으로 작동합니다. 자세한 설명은 소스코드에 주석 형태로 달겠습니다.


Private Function InvLuniSolarCal(ByVal LunarYear As Integer, ByVal LunarMon As Byte, ByVal LunarDay As Byte, ByVal IsLeap As Boolean, jd As Double) As Boolean

  Dim iJD As Double, iLY As Integer, iLM As Byte, iLD As Byte, iLM2 As Single, iLeap As Boolean, i As Integer, D1 As Double, lm2 As Single, IsValid As Boolean

  Dim i2 As Integer

  

  IsValid = False  '일단 입력된 날짜를 존재하지 않는 음력 날짜로 가정(참값을 찾기 전이므로)

  

  '입력한 음력에 대응하는 첫 근사값 구하기 

  iJD = JULIANDAY(CDbl(LunarYear), CDbl(LunarMon), CDbl(LunarDay)) '먼저 음력날짜를 양력날짜와 같다고 가정하고 그대로 율리우스 적일을 구함(초기근사). 

  iJD = iJD + 25: lm2 = LunarMon '윤달이 아닐 경우 1의 값에 25일을 더함.

  If IsLeap Then iJD = iJD + 25: lm2 = lm2 + 0.5 '윤달이면 여기에 다시 25일을 더함(양력 날짜보다 50일이 늦다고 가정). lm2에는 윤달이 평달보다 늦음을 표시하기 위해 0.5를 더함. 

  

  If LunarYear < 1582 Then iJD = iJD + Int(0.0078 * (1582 - LunarYear)) '율리우스력의 오차를 조절하기 위한 보정항을 계산하여 근사값에 더함.


  i = 0  

  Do  '근사값으로 구한 양력일이 실제로 입력한 음력일이 맞는지 확인.

    LuniSolarCal iJD, iLY, iLM, iLD, iLeap  '근사값의 음력일 계산

    

    If iLY > LunarYear Then '연도가 같은지 비교. 다르면 30일씩 더하거나 빼면서 다시 계산

      iJD = iJD - 30

    ElseIf iLY < LunarYear Then 

      iJD = iJD + 30

    ElseIf iLY = LunarYear Then  

      i2 = 0  

      Do

        LuniSolarCal iJD, iLY, iLM, iLD, iLeap

        iLM2 = iLM + IIf(iLeap, 0.5, 0)  '윤달 여부를 표시

        

        If iLM2 > lm2 Or iLY > LunarYear Then  '월이 같은지 비교. 다르면 10일씩 더하거나 빼면서 다시 계산

          iJD = iJD - 10

        ElseIf iLM2 < lm2 Or iLY < LunarYear Then  

          iJD = iJD + 10

        ElseIf iLM2 = lm2 Then 

          D1 = iJD - iLD '연과 월이 모두 같으면, D1에 해당 음력 달 0일의 위치를 저장

          IsValid = True '입력한 음력날이 있으므로 참값 출력

        End If

        i2 = i2 + 1

      Loop Until iLM2 = lm2 Or i2 > 15 '음력월 탐색은 연도가 같다면 150일 안쪽 범위에서만 탐색

    End If

    i = i + 1

  Loop Until iLY = LunarYear Or i > 10 '음력 연도 탐색은 300일 범위 이내에서만 수행.

  

  jd = D1 + LunarDay '음력월 0일의 날짜에 입력한 날짜를 더하여 해당일의 율리우스 적일을 출력

  InvLuniSolarCal = IsValid

End Function



이상으로 단 하나의 함수를 제외하고 나머지 함수를 모두 설명했습니다. 다음 번 글에서 양력을 음력으로 바꾸는 방법에 관해 설명하겠습니다. 이 연재의 마지막 글이 되겠군요.

?

  1. 주요 시간체계 1

    현재 사용 중인 주요한 시간체계를 간단히 정리했습니다. 1. 세계시(UT, Universal Time) 경도 0도에서의 평균태양시로 과거에 쓰던 GMT(그리니치평균시)를 대체합니다. UT는 지구의 회전과 관련이 있는 시간체계입니다. 1) UT0 : 관측지에서 측정한 평균태양...
    Date2013.01.25 Category천문 계산 By창환 Views7229
    Read More
  2. No Image

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

    음양력 변환 모듈에 대한 마지막 글입니다. 이번에는 양력을 음력으로 변환하는 방법에 대해 설명하겠습니다. 정확히는 율리우스적일로된 날짜를 음력으로 바꾸는 방법입니다. 음력을 계산하는 함수는 단 하나입니다. LuniSolarCal: 율리우스 적일을 음력으로 ...
    Date2013.01.18 Category천문 계산 By창환 Views5242
    Read More
  3. No Image

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

    이번 글에서는 음력을 양력으로 변환하는 함수와 음양력 변환에 쓰는 보조함수에 대하여 설명하겠습니다. 양력을 음력으로 바꾸는 함수는 다소 긴 설명이 필요하므로 마지막 편에서 다루도록 하겠습니다. 이 글에서 다룰 함수는 다음 3개 입니다. Sol2Lun: 양...
    Date2013.01.17 Category천문 계산 By창환 Views11053
    Read More
  4. No Image

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

    이번 편에서는 해의 절입시각 계산, 달의 정삭시각 계산에 사용하는 함수에 대해 알아보겠습니다. 입기시각은 중기 또는 절기에 이르는 순간의 시점, 정삭시각은 달이 삭에 이르는 순간의 시점입니다. 계산정확도가 1분 이내라면 대부분 정확하게 음양력을 계...
    Date2013.01.16 Category천문 계산 By창환 Views6784
    Read More
  5. No Image

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

    3번째 글을 쓴지 벌써 2년이 넘게 지났습니다. 오랫동안 손을 놓고 있었지만, 올해 겨울이 지나기 전에 이 시리즈를 완결토록 하겠습니다. 4번째 글에서는 태양의 위치 계산에 관한 부분과 장동 계산에 대한 부분을 알아보겠습니다. 여기에는 모두 3개의 함수...
    Date2013.01.15 Category천문 계산 By창환 Views8321
    Read More
  6. No Image

    음력-양력 상호 변환 함수 모듈(1.03)

    음력-양력 상호 변환 함수 모듈 *배포 버전: 1.03 *제작자: 김창환(blueedu@hanmail.net) *홈페이지: http://blueedu.dothome.co.kr *제작일: 2013. 1. 13. *저작권: 이 프로그램의 저작권은 제작자에게 있습니다. *수정 사항 -1.01: 음양력 변환 코드의 오류...
    Date2013.01.13 Category천문 계산 By창환 Views6858
    Read More
  7. No Image

    음력-양력 상호 변환 함수 모듈(1.02)

    음력-양력 상호 변환 함수 모듈 *배포 버전: 1.02 *제작자: 김창환(blueedu@hanmail.net) *홈페이지: http://blueedu.dothome.co.kr *제작일: 2011. 9. 2. *저작권: 이 프로그램의 저작권은 제작자에게 있습니다. *수정 사항 -1.01: 음양력 변환 코드의 오류를...
    Date2011.09.02 Category천문 계산 By창환 Views6437
    Read More
  8. No Image

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

    이번에는 지난 번에 이야기한 대로 시간 계산에 쓰이는 함수를 알아보겠습니다. 그러나 그 전에 이 모듈에 쓰이는 상수에 관해 설명할 필요가 있는 것 같습니다. 원래 지난 번 글에서 다루어야 했지만 깜빡했네요. 1. 상수이 모듈은 모두 8개의 상수를 사용합...
    Date2010.09.14 Category천문 계산 By창환 Views8599
    Read More
  9. No Image

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

    아주 오래 쉬었습니다. 지난 번의 글에서 함수의 역할만 대강 설명을 했는데, 이번 글부터는 조금 더 자세히 설명토록 하겠습니다. 음양력 변환 함수에 대해 설명하기에 앞서, 이 함수가 작동하기 위해 필요한 부속 함수부터 설명하겠습니다. 이 글에서는 먼저...
    Date2010.09.06 Category천문 계산 By창환 Views8610
    Read More
  10. No Image

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

    예전에 '음력-양력 상호 변환 함수 모듈'이라는 자료를 이곳에 올려 놓았습니다. 이 자료에는 음양력 변환을 할 수 있는 VB용 소스코드가 포함되어 있는데, 이 소스코드에는 주석이 거의 없어서 어떻게 음양력을 계산하는지는 알기가 어렵습니다. 앞으로 몇 편...
    Date2010.02.07 Category천문 계산 By창환 Views12624
    Read More
  11. No Image

    관측자중심좌표계에 관하여

    관측자중심좌표는 지구 표면 위의 관측자를 중심으로 나타낸 좌표계입니다. 이 좌표계는 관측자에게 실제로 관측되는 좌표를 알려줍니다. 관측자중심좌표를 구할 때에는 지구중심좌표에 아래 사항을 반영해주면 됩니다. 1) 항성-일주 광행차(diurnal aberratio...
    Date2010.01.29 Category천문 계산 By창환 Views9940
    Read More
  12. No Image

    지구중심좌표계에 관해서

    지구중심좌표계는 천체의 위치를 나타내는데 쓰는 좌표계 가운데 하나로, 지구의 중심을 기준으로 위치를 표시하는 좌표계입니다. 여기에서 지구의 중심은 지구 타원체의 중심입니다. 지구중심좌표계로 나타낸 위치에는 관측지에 따른 위치의 차이가 포함되어 ...
    Date2010.01.28 Category천문 계산 By창환 Views8971
    Read More
  13. 직교좌표와 구면좌표

    천문학에서는 보통 천체의 위치를 나타낸 때 구면좌표를 씁니다. 적경과 적위, 황경과 황위 또는 방위각과 고도 등과 같이 기준이 되는 점에 대한 각도를 써서 천체의 위치를 나타냅니다. 그런데 천문 계산을 할 때에는 구면좌표 대신 직교좌표를 쓰는 것이 더...
    Date2010.01.15 Category천문 계산 By창환 Views15882
    Read More
  14. 항성시와 세계시의 길이 비율

    평균 항성시와 평균 세계시(UT1)의 길이 비율은 세계시로 나타낸 하루의 길이를 항성시로 나타낸 하루의 길이로 나눈 비율입니다. 이 값은 지구가 얼마나 빠르게 자전하고 있는지를 나타내고 있으며, 이 값이 클수록 자전 속도가 느립니다. 기호로는 r'로 적습...
    Date2009.11.21 Category천문 계산 By창환 Views9185
    Read More
  15. 적도좌표↔지평좌표

    지평좌표계는 지상에서 관측한 천체의 방향을 고도(Altitude)와 방위각(Azimuth)으로 나타내는 좌표체계입니다. 고도는 지평선으로부터 얼마나 높이 떠올랐는지를 나타낸 각도이고 방위각은 천체의 방향을 북쪽을 기준으로 하여 표시한 각도입니다(간혹 남쪽을...
    Date2009.10.25 Category천문 계산 By창환 Views18816
    Read More
Board Pagination Prev 1 2 3 4 Next
/ 4
Powered by XE