조회 수 8610 댓글 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. 우리의 옛 별자리, '기부(器府)'는 어디에 있을까?

    천상열차분야지도를 보면 진수 아래쪽에 '기부(器府)'라는 바둑판을 닮은 별자리가 있습니다. 천상열차분야지도와 천문류초의 별그림에는 29개의 별이 그려져 있지만, 다른 천문관련 문헌에는 32개의 별로 이루어져 있다는 별자리입니다. 악기를 다루는 부서로...
    Date2014.07.20 Category고천문학 By창환 Views2227
    Read More
  2. [소개] 안드로이드 최고의 천문 앱, Mobile Observatory

    안드로이드 기반의 천문 앱 가운데 가장 훌륭한 앱이 무엇이냐고 물어본다면, 'Mobile Observatory'와 'SkySafari'라는 두 앱을 꼽을 수 있을 겁니다. 적어도 글쓴이의 취향엔 이 둘이 가장 좋았습니다. 두 앱은 모두 유료이지만, 그만한 값어치를 합니다. 이...
    Date2014.07.05 Category천문 일반 By창환 Views457464
    Read More
  3. 태양필터를 만들었어요.

    미루고 미루다 태양필터를 만들었습니다. Apex 127 망원경에 쓸 필터인데요, 전체 구경을 다 활용할 수 있는 크기로 만들었습니다. 재료는 Baader AstroSolar 필름, 빨간색 골판지, 검정색 하드보드지입니다. (Baader AstroSolar 필름은 비닐로 만들어져 있어...
    Date2014.07.04 Category천문 일반 By창환 Views648
    Read More
  4. [소개] Lunafaqt sun and moon info

    이번에 소개할 "Lunafaqt sun and moon info"라는 앱은 달의 월령 달력을 보여주는 앱입니다. 해에 관한 정보도 알려주긴 하지만, 뜨고 지는 시각 정도만이라 거의 달에 관한 정보를 주는 프로그램으로 보면 됩니다. 달의 위상과 뜨고 지는 시각, 거리 정도를 ...
    Date2014.05.11 Category천문 일반 By창환 Views3554
    Read More
  5. [소개] 안드로이드에서 쓰는 성도 앱, Astro Tools

    앞으로 몇 회에 걸쳐 안드로이드 계열의 태블릿 PC에서 유용하게 쓸 수 있는 천문 프로그램을 소개토록 하겠습니다. 여기에서 소개하는 앱들은 전화기에서도 문제없이 쓸 수는 있지만, 활용성 측면에서 태블릿 PC에 더 적당합니다. 처음으로 소개할 앱은 Astro...
    Date2014.04.06 Category천문 일반 By창환 Views1649
    Read More
  6. Astro-Dream 3배, 5배 바로우렌즈에 대한 간단한 느낌

    Astro-Dream사는 대전에 자리잡고 있는 국내의 몇 안되는 천문관측기기 생산업체 가운데 하나입니다. 지금은 Rainbow-Astro라는 이름으로 바꾸로, 고급형 적도의를 주로 만들고 있는데요, 이 회사에서 3배, 5배 바로우렌즈를 판매하고 있습니다. 이 제품은 직...
    Date2014.01.18 Category천문장비 By창환 Views3133
    Read More
  7. 목성 지도 만들기

    망원경으로 촬영한 목성 사진을 이용해서 만든 목성 지도입니다. 이 예시는 2013년 12월 22일 촬영한 2장의 사진으로 만든 것인데요, 원본 사진의 품질이 그다지 좋지 못해서 인상적인 결과를 얻지는 못 했습니다. 목성 지도는 WinJUPOS라는 프로그램을 쓰면 ...
    Date2014.01.14 Category관측기 By창환 Views981
    Read More
  8. Bresser(Jinghua) EQ3 적도의 손질하기

    Bresser EQ3 적도의(구형)는 중국 징후아 광학 그룹에서 만든 소형 적도의입니다. 탑재중량은 3~4kg 정도인 보급형 적도의(제품 광고에는 사양이 어떻게 적혀있는지 모르겠지만, 실 탑재중량은 4kg 정도가 최대로 보입니다)로, 작은 망원경에는 쓸만하고 가격...
    Date2014.01.13 Category천문장비 By창환 Views3480
    Read More
  9. 행성촬영에 좋은 두 가지 프로그램

    행성이나 이중성, 달처럼 먼 곳에 있는 피사체를 고해상도로 확대해서 촬영해야 하는 경우에는 한 장으로 찍는 것 보다는 여러 장을 촬영하거나 동영상으로 촬영한 다음 한 장으로 합치는 것이 화질에서 훨씬 유리합니다. 대기의 흔들림을 잡아주고, 한 장만 ...
    Date2013.12.23 Category천문 일반 By창환 Views2341
    Read More
  10. GSO 8x50 파인더 사용기

    GS Optical에서 만든 구경 50mm, 8배 파인더입니다. 다른 파인더에 비해 가격이 저렴하지만 만듦새는 좋은 편입니다. 50mm 파인더 망원경과 지지대를 합해서 10만원 이내에 구입할 수 있습니다. (파인더 망원경, 렌즈 앞뒤 덮개, 파인더 브라켓, 파인더베이스...
    Date2013.12.07 Category천문장비 By창환 Views2344
    Read More
Board Pagination Prev 1 ... 3 4 5 6 7 8 9 10 11 12 ... 20 Next
/ 20
Powered by XE