Files
MeadeGeneric/Meade.net.Telescope/AstroMaths/AstroMaths.cs
T
2020-09-03 13:11:47 +01:00

116 lines
3.5 KiB
C#

using System;
namespace ASCOM.Meade.net.AstroMaths
{
public class AstroMaths : IAstroMaths
{
//returns the decimal hour angle for given right ascension on a given datetime for a given logitude.
public double RightAscensionToHourAngle(DateTime utcDateTime, double longitude, double rightAscension)
{
//var ut = DateTimeToDecimalHours( utcDateTime);
var gst = utcDateTime.UTtoGst();
var lst = GsTtoLst( gst, longitude);
var raHours = rightAscension;
var h1 = lst - raHours;
var h = h1;
if (h < 0)
h = h + 24;
return h;
}
private double HourAngleToRightAscension(DateTime utcDateTime, double longitude, double hourAngle )
{
var gst = utcDateTime.UTtoGst();
var lst = GsTtoLst( gst, longitude);
var raHours = hourAngle;
var h1 = lst - raHours;
var h = h1;
if (h1 < 0)
{
h += 24;
}
return h;
}
public EquatorialCoordinates ConvertHozToEq( DateTime utcDateTime, double latitude, double longitude, HorizonCoordinates altAz)
{
var az = altAz.Azimuth.DegreesToRadians();
var alt = altAz.Altitude.DegreesToRadians();
var lat = latitude.DegreesToRadians();
var sinDec = Math.Sin(alt) * Math.Sin(lat) + Math.Cos(alt) * Math.Cos(lat) * Math.Cos(az);
var dec = Math.Asin(sinDec).RadiansToDegrees();
var y = -Math.Cos(alt) * Math.Cos(lat) * Math.Sin(az);
var x = Math.Sin(alt) - Math.Sin(lat) * sinDec;
var upperA = Math.Atan2(y,x);
var upperB = upperA.RadiansToDegrees();
var ha = upperB;
if (upperB < 0)
{
ha += 360;
}
ha = ha / 15;
EquatorialCoordinates equatorialCoordinates = new EquatorialCoordinates
{
RightAscension = HourAngleToRightAscension( utcDateTime, longitude, ha ),
Declination = dec
};
return equatorialCoordinates;
}
public HorizonCoordinates ConvertEqToHoz(double hourAngle, double latitude, EquatorialCoordinates raDec)
{
var h = hourAngle * 15;
var h1 = h.DegreesToRadians();
var d = raDec.Declination.DegreesToRadians();
var lat = latitude.DegreesToRadians();
var sinA = Math.Sin(d) * Math.Sin(lat) + Math.Cos(d) * Math.Cos(lat) * Math.Cos(h1);
var y = -Math.Cos(d) * Math.Cos(lat) * Math.Sin(h1);
var x = Math.Sin(d) - Math.Sin(lat) * sinA;
var upperA = Math.Atan2(y, x);
var upperB = upperA.RadiansToDegrees();
var horizonCoordinates = new HorizonCoordinates
{
Altitude = Math.Asin(sinA).RadiansToDegrees(),
Azimuth = upperB
};
if (upperB < 0)
{
horizonCoordinates.Azimuth = 360 + horizonCoordinates.Azimuth;
}
return horizonCoordinates;
}
public double GsTtoLst(double gst, double longitude)
{
var l = longitude/ 15;
var lst = gst + l;
while (lst < 0 )
{
lst += 24;
}
while (lst >= 24)
{
lst -= 24;
}
return lst;
}
}
}