달력

02

« 2012/02 »

  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  •  
  •  
  •  
2008/11/26 13:22

좌표 시스템(3) Astronomy2008/11/26 13:22


천문계산에 필요한 기본적인 상수를 알아보았으니 이제 이런 계산에 사용될 모듈을 4개정도 만들어 볼까 합니다.
경도는 단위가 각도로 되어 있습니다. 0도에서 360도 사이에 위치한 각각의 도를 단순하게 표현하기 위해서 Frac와 Module라는 모듈을 만듭니다.
public double Frac(double x)
{
       return x - Math.Floor(x);
}
public double Modulo(double x, double y)
{
        return y * Frac(x / y);
}

1도 사이에는 arc가 존재하고 이 arc는 분과 초로 나누어질 수 있으므로 이것과 관련된 모듈도 만듭니다.
이것과 관련도 2개 입니다.

아래의 메서드에서 Ddd메서드는 각도를 구하는 메서드 이고, DMS라는 메서드는 각도 입력시 그것을 arc의 각과 분, 초로 변환해 주는 메서드 입니다.
예를 들어서 Ddd 메서드에 arc의 Degress로 15, arc의 분 30, arc의 초 00.0을 할당하면 각도 15.5가 출력됩니다.
역으로 각도 15.5를 DMS 메서드에 파라미터로 전달하면 arc의 DMS가 리턴됩니다.

public double Ddd(int D, int M, double S)
{
             double sign;

             if ((D < 0) || (M < 0) || (S < 0))
             {

                  sign = -1.0;

             }

             else

             {

                 sign = 1.0;

             }

             return sign * (Math.Abs((double)D) + Math.Abs((double)M) / 60.0 + Math.Abs(S) / 3600.0);

         }

 

         public void DMS(double Dd)

         {

             double x;

             int D;

             int M;

             double S;

 

             x = Math.Abs(Dd);

             D = (int)x;

             x = (x - D) * 60.0;

             M = (int)x;

             S = (x - M) * 60.0;

             if (Dd < 0.0)

             {

                 if (D != 0)

                 {

                     D = -1;

                 }

                 else if (M != 0)

                 {

                     M = -1;

                 }

                 else

                 {

                     S = -1.0;

                 }

             }

         }

     }

만들어진 4개의 메서드는 천문에서 단위를 변환하는데 자주 사용되며, 미리 만들어두면 관련 단위 변환에 매우 유용하게 사용될 수 있습니다.

아래는 C#으로 작성한 전체 코드 입니다.
1 using System;
2 using System.Collections.Generic;

3 using System.Linq;

4 using System.Text;

5 

6 namespace CoordinateSys

7 {

8     enum AngleFormat

9     {

10         Dd, DMM, DMMm, DMMSS, DMMSSs

11     }

12 

13     public class APC_Const

14     {

15         const double pi = 3.14159265358979324;

16         const double pi2 = 2.0 * pi;

17         const double Red = pi / 180.0;

18         const double Deg = 180.0 / pi;

19         const double Arcs = 3600.0 * 180.0 / pi;

20         const double AU = 149597870.0; //[km]

21         const double c_light = 173.14; //[AU/d]

22     }

23 

24     public class APC_Match

25     {

26         //0도~360도 사이에 존재하는 천체의 경도를 단조롭게 표현하는데 사용

27         public double Frac(double x)

28         {
29             return x - Math.Floor(x);
30         }
31         public double Modulo(double x, double y)
32         {
33             return y * Frac(x / y);
34         }
35 
36 
37         //Ddd는 시간의 범위를 제공(60분수
38         //arc의 Degrees(D), minutes(M), seconds(S)를 10진수 각도로
39         public double Ddd(int D, int M, double S)
40         {
41             double sign;

42             if ((D < 0) || (M < 0) || (S < 0))
43             {

44                 sign = -1.0;

45             }

46             else

47             {

48                 sign = 1.0;

49             }

50             return sign * (Math.Abs((double)D) + Math.Abs((double)M) / 60.0 + Math.Abs(S) / 3600.0);

51         }

52 

53         //각도를 알기 위해 degress, minutes, seconds를 찾는다.

54         //Dd : 각도에 대한 10진수 표기

55         //D,M,S : arc의 Degress, minutes, seconds

56         public void DMS(double Dd)

57         {

58             double x;

59             int D;

60             int M;

61             double S;

62 

63             x = Math.Abs(Dd);

64             D = (int)x;

65             x = (x - D) * 60.0;

66             M = (int)x;

67             S = (x - M) * 60.0;

68             if (Dd < 0.0)

69             {

70                 if (D != 0)

71                 {

72                     D = -1;

73                 }

74                 else if (M != 0)

75                 {

76                     M = -1;

77                 }

78                 else

79                 {

80                     S = -1.0;

81                 }

82             }

83         }

84     }

85 

86     class Angle

87     {

88         double m_angle;

89         AngleFormat m_Format;

90 

91         Angle(double alpha, AngleFormat Dd)

92         {

93 

94         }

95         void Set(AngleFormat Dd){}

96     }

97     class Program

98     {

99         static double b = 12.3456;

100         static void Main(string[] args)

101         {

102             //Angle ag = new Angle(x, );

103 

104             APC_Match apm = new APC_Match();

105             //Console.WriteLine(apm.Ddd(15, 30, 00));

106             apm.DMS(15.5);

107             //Console.ReadLine();

108         }

109     }

110 }

저작자 표시 비영리 변경 금지

'Astronomy' 카테고리의 다른 글

한국아마추어천문학회 홍보영상을 만들어 봤어요.  (0) 2009/03/06
국립과천과학관을 갔다왔어요~  (2) 2009/01/06
좌표 시스템(3)  (0) 2008/11/26
좌표 시스템(2)  (2) 2008/11/25
좌표시스템(1)  (12) 2008/11/11
퇴근할 때 목성을 보아요~  (2) 2008/07/10
Posted by -세티-