조회 수 8607 댓글 4
?

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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

아주 오래 쉬었습니다.

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

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

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

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 •
?
  • ?
    Rub 2014.03.18 21:00

    Rev(ByVal x As Double) 함수에서 리턴값의 범위는(0~360)이 나와야 되는거 같은데

    인수가 음수일경우 리턴값이 음수로 나옵니다.

    이것을 고치니까 제대로 잘 되는것 같습니다.

    감사합니다.

  • profile
    창환 2014.03.18 23:18

    확인해보고 고쳐야겠어요.

  • ?
    Rub 2014.03.25 23:22

    Rev함수에서

    x가 -30이라면


    VB에서는  Int(x/360)은 당연히 -1이 나오므로 정상작동 합니다.

    제가 C#으로 변환시에 단순히 형변환 하였더니 0으로 작동하게 되더군요.


    번거롭게 해드려 죄송합니다.

    그리고 다시한번 감사드립니다.

  • profile
    창환 2014.03.29 22:06

    개발자 입장에선 피드백만큼 고마운 것도 없습니다. 제게도 도움이 되었습니다.


  1. 주요 시간체계 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    지구중심좌표계에 관해서

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

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

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

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