작 성 자 : 박종현
작 성 일 : 2010년 01월 12일
원 문 : http://www.sergemeunier.com
천문에 대한 계산을 수행할 때 중요한 부분(Vital part) 중의 하나인 서로 다른 좌표 시스템간의 변환에 대해 알아보겠습니다.
각각 다른 좌표 시스템은 어느 지역에서 어떻게 사용하느냐에 따라 장단점을 가질 수 있습니다. 천문학에서 사용하는 메인 좌표 시스템들은 적도, 수평, 황도, 은하 좌표 시스템입니다.
천문학에서 가장 중요한 좌표는 적도 좌표계 인데 이는 각각의 다른 장소에서 서로 다른 좌표를 변환할 때 이 적도좌표로의 변환을 기본으로 하기 때문입니다. 여기에서 적도와 황도 좌표 사이의 변환을 한번 핸들링 해보겠습니다.
적도 좌표 시스템은 지구상의 경위도 좌표(geographic coordinates)를 투영합니다. 이것이 무슨 뜻이냐면 지구 적도위의 천구의 적도와 지구의 북극 위인 천구의 북극과 함께 지구상의 경도와 위도가 가상의 천구에 투영된다는 것 입니다.
즉 하나의 구를 지구처럼 경도와 위도로 분리한 것입니다.
경도(Longitude)는 적경(right ascension)으로 잘 알려져 있고 시간으로 측정하는데, 춘분점(Vernal Equinox, 3월 21일)에 태양이 어떤 포인트에 있는데 양자리의 첫 포인트(First Point of Aries)를 0 포인트로 해서 시작됩니다. 이 값은 세차운동 때문에 변경됩니다. 세차운동은 여기서 다루지는 않겠습니다.
위도(Latitude)는 적위(δ로 표시)로 잘 알려져 있습니다. 천구의 적도로부터 떨어져 있는 물체를 각을 제어 측정하는데 지구의 위도처럼 북극점에서 90도로 시작됩니다.
수평좌표(horizontal coordinates)는 알타지머스(alt-azimuth) 좌표로 잘 알려져 있습니다. 여기 하늘에서의 좌표는 각으로 표현 되는데 고도와 방위로 구별 됩니다. 90도 각도를 가지는 수직선과 0~360도의 범위내에서 북극과 객체를 직접적으로 연결한 방위로 표현됩니다.
우리는 2개의 좌표 시스템간 변환을 할 수 있어야 합니다. 그러기 위해선 적경에서 시간에 해당하는 각을 찾을 필요가 있습니다. 적경은 천구에서 별의 위치를 기초로 하는데 반해 시간에 해당되는 각은 지구의 경도와 적경의 값을 기초로 변환되어야 합니다.
이 지역 항성시간(Local Sidereal Time)을 계산하는데 UT(Universal Time)와 관측자 위치의 경도 그리고 한 시간에 해당하는 각을 얻은 후 적경을 빼면 됩니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConvertCoordinates
{
public class ConvertCoordinates
{
// 특정시간의 시간각과 위도를 적경으로 변환
public static double ConvRAToHA(double fRA, DateTime dUT, double fLong)
{
double fLST;
double fHA;
fLST = UraniaTime.ConvTimeToDec(UraniaTime.CalcLSTFromUT(dUT, fLong));
fHA = fLST - fRA;
fHA = Trig.PutIn24Hour(fHA);
return fHA;
}
public static double ConHAToRA(double fHA, DateTime dUT, double fLong)
{
// 특정시간의 적경과 적위를 시간각으로 변환
double fLST;
double fRA;
fLST = UraniaTime.ConvTimeToDec(UraniaTime.CalcLSTFromUT(dUT, fLong));
fRA = fLST - fHA;
fRA = Trig.PutIn24Hour(fRA);
return fRA;
}
}
}
변환에 삼각법이 필요하지만 지나치게 복잡하지는 않습니다.
우리는 수평좌표를 찾기 위해 적위, 위도, 시간각(이전 함수를 사용하여 계산되어진)을 알아야할 필요가 있습니다.
수평좌표에서 적도 좌표를 찾는 것은 이전 절차의 반대로 계산하면 됩니다. 일단 우리는 적위와 시간각을 가지고, 이전 섹션을 통해 적경에서 시간각으로 변환을 할 수 있습니다.
public static void ConvEquToHor(double fLatitude, double fHA, double fDecl, ref double fAlt, ref double fAzim)
{
double fSinAlt;
double fCosAzim;
fHA = Trig.DegToRad(fHA * 15);
fDecl = Trig.DegToRad(fDecl);
fLatitude = Trig.DegToRad(fLatitude);
fSinAlt = (Math.Sin(fDecl) * Math.Sin(fLatitude)) + (Math.Cos(fDecl) * Math.Cos(fLatitude) * Math.Cos(fHA));
fAlt = Math.Asin(fSinAlt);
fCosAzim = ((Math.Sin(fDecl) - (Math.Sin(fLatitude) * Math.Sin(fAlt))) / (Math.Cos(fLatitude) * Math.Cos(fAlt)));
fAzim = Trig.RadToDeg(Math.Acos(fCosAzim));
if (Math.Sin(fHA) > 0)
{
fAzim = 360 - fAzim;
}
fAlt = Trig.RadToDeg(fAlt);
}
public static void ConvHorToEqu(double fLatitude, double fAlt, double fAzim, ref double fHA, ref double fDecl)
{
double fSinDecl;
double fCosH;
fAlt = Trig.DegToRad(fAlt);
fAzim = Trig.DegToRad(fAzim);
fLatitude = Trig.DegToRad(fLatitude);
fSinDecl = (Math.Sin(fAlt) * Math.Sin(fLatitude)) + (Math.Cos(fAlt) * Math.Cos(fLatitude) * Math.Cos(fAzim));
fDecl = Math.Asin(fSinDecl);
fCosH = ((Math.Sin(fAlt) - (Math.Sin(fLatitude) * Math.Sin(fDecl))) / (Math.Cos(fLatitude) * Math.Cos(fDecl)));
fHA = Trig.RadToDeg(Math.Acos(fCosH));
if (Math.Sin(fAzim) > 0)
{
fHA = 360 - fHA;
}
fDecl = Trig.RadToDeg(fDecl);
fHA = fHA / 15.0;
}
[용어정리]
alt-azimuth : 별의 고도(Altitude), 별의 방위(Azimuth)
geographic coordinates : 경위도 좌표
Longitude : 경도
Latitude : 위도
horizontal coordinates : 수평좌표
right ascension : 적경
Vernal Equinox : 춘분점
Local Sidereal Time : 지역항성시
Universal Time : UT