public static CAA2DCoordinate Equatorial2Topocentric(double Alpha, double Delta, double Distance, double Longitude, double Latitude, double Height, double JD) { double RhoSinThetaPrime = CAAGlobe.RhoSinThetaPrime(Latitude, Height); double RhoCosThetaPrime = CAAGlobe.RhoCosThetaPrime(Latitude, Height); //Calculate the Sidereal time double theta = CAASidereal.ApparentGreenwichSiderealTime(JD); //Convert to radians Delta = CAACoordinateTransformation.DegreesToRadians(Delta); double cosDelta = Math.Cos(Delta); //Calculate the Parallax double pi = Math.Asin(GlobalMembersStdafx.g_AAParallax_C1 / Distance); double sinpi = Math.Sin(pi); //Calculate the hour angle double H = CAACoordinateTransformation.HoursToRadians(theta - Longitude / 15 - Alpha); double cosH = Math.Cos(H); double sinH = Math.Sin(H); //Calculate the adjustment in right ascension double DeltaAlpha = Math.Atan2(-RhoCosThetaPrime * sinpi * sinH, cosDelta - RhoCosThetaPrime * sinpi * cosH); CAA2DCoordinate Topocentric = new CAA2DCoordinate(); Topocentric.X = CAACoordinateTransformation.MapTo0To24Range(Alpha + CAACoordinateTransformation.RadiansToHours(DeltaAlpha)); Topocentric.Y = CAACoordinateTransformation.RadiansToDegrees(Math.Atan2((Math.Sin(Delta) - RhoSinThetaPrime * sinpi) * Math.Cos(DeltaAlpha), cosDelta - RhoCosThetaPrime * sinpi * cosH)); return(Topocentric); }
//Conversion functions public static CAA2DCoordinate Equatorial2TopocentricDelta(double Alpha, double Delta, double Distance, double Longitude, double Latitude, double Height, double JD) { double RhoSinThetaPrime = CAAGlobe.RhoSinThetaPrime(Latitude, Height); double RhoCosThetaPrime = CAAGlobe.RhoCosThetaPrime(Latitude, Height); //Calculate the Sidereal time double theta = CAASidereal.ApparentGreenwichSiderealTime(JD); //Convert to radians Delta = CAACoordinateTransformation.DegreesToRadians(Delta); double cosDelta = Math.Cos(Delta); //Calculate the Parallax double pi = Math.Asin(GlobalMembersStdafx.g_AAParallax_C1 / Distance); //Calculate the hour angle double H = CAACoordinateTransformation.HoursToRadians(theta - Longitude / 15 - Alpha); double cosH = Math.Cos(H); double sinH = Math.Sin(H); CAA2DCoordinate DeltaTopocentric = new CAA2DCoordinate(); DeltaTopocentric.X = CAACoordinateTransformation.RadiansToHours(-pi * RhoCosThetaPrime * sinH / cosDelta); DeltaTopocentric.Y = CAACoordinateTransformation.RadiansToDegrees(-pi * (RhoSinThetaPrime * cosDelta - RhoCosThetaPrime * cosH * Math.Sin(Delta))); return(DeltaTopocentric); }
public static COR Equatorial2Topocentric(double Alpha, double Delta, double Distance, double Longitude, double Latitude, double Height, double JD) { double RhoSinThetaPrime = CAAGlobe.RhoSinThetaPrime(Latitude, Height); double RhoCosThetaPrime = CAAGlobe.RhoCosThetaPrime(Latitude, Height); //Calculate the Sidereal time double theta = CAASidereal.ApparentGreenwichSiderealTime(JD); //Convert to radians Delta = CT.D2R(Delta); double cosDelta = Math.Cos(Delta); //Calculate the Parallax double pi = Math.Asin(GFX.g_AAParallax_C1 / Distance); double sinpi = Math.Sin(pi); //Calculate the hour angle double H = CT.H2R(theta - Longitude / 15 - Alpha); double cosH = Math.Cos(H); double sinH = Math.Sin(H); //Calculate the adjustment in right ascension double DeltaAlpha = Math.Atan2(-RhoCosThetaPrime * sinpi * sinH, cosDelta - RhoCosThetaPrime * sinpi * cosH); COR Topocentric = new COR(); Topocentric.X = CT.M24(Alpha + CT.R2H(DeltaAlpha)); Topocentric.Y = CT.R2D(Math.Atan2((Math.Sin(Delta) - RhoSinThetaPrime * sinpi) * Math.Cos(DeltaAlpha), cosDelta - RhoCosThetaPrime * sinpi * cosH)); return(Topocentric); }
//Conversion functions public static COR Equatorial2TopocentricDelta(double Alpha, double Delta, double Distance, double Longitude, double Latitude, double Height, double JD) { double RhoSinThetaPrime = CAAGlobe.RhoSinThetaPrime(Latitude, Height); double RhoCosThetaPrime = CAAGlobe.RhoCosThetaPrime(Latitude, Height); //Calculate the Sidereal time double theta = CAASidereal.ApparentGreenwichSiderealTime(JD); //Convert to radians Delta = CT.D2R(Delta); double cosDelta = Math.Cos(Delta); //Calculate the Parallax double pi = Math.Asin(GFX.g_AAParallax_C1 / Distance); //Calculate the hour angle double H = CT.H2R(theta - Longitude / 15 - Alpha); double cosH = Math.Cos(H); double sinH = Math.Sin(H); COR DeltaTopocentric = new COR(); DeltaTopocentric.X = CT.R2H(-pi * RhoCosThetaPrime * sinH / cosDelta); DeltaTopocentric.Y = CT.R2D(-pi * (RhoSinThetaPrime * cosDelta - RhoCosThetaPrime * cosH * Math.Sin(Delta))); return(DeltaTopocentric); }
public static double TopocentricMoonSemidiameter(double DistanceDelta, double Delta, double H, double Latitude, double Height) { //Convert to radians H = CAACoordinateTransformation.HoursToRadians(H); Delta = CAACoordinateTransformation.DegreesToRadians(Delta); double pi = Math.Asin(6378.14 / DistanceDelta); double A = Math.Cos(Delta) * Math.Sin(H); double B = Math.Cos(Delta) * Math.Cos(H) - CAAGlobe.RhoCosThetaPrime(Latitude, Height) * Math.Sin(pi); double C = Math.Sin(Delta) - CAAGlobe.RhoSinThetaPrime(Latitude, Height) * Math.Sin(pi); double q = Math.Sqrt(A * A + B * B + C * C); double s = CAACoordinateTransformation.DegreesToRadians(GeocentricMoonSemidiameter(DistanceDelta) / 3600); return(CAACoordinateTransformation.RadiansToDegrees(Math.Asin(Math.Sin(s) / q)) * 3600); }
public static double TopocentricMoonSemidiameter(double DistanceDelta, double Delta, double H, double Latitude, double Height) { //Convert to radians H = CT.H2R(H); Delta = CT.D2R(Delta); double pi = Math.Asin(6378.14 / DistanceDelta); double A = Math.Cos(Delta) * Math.Sin(H); double B = Math.Cos(Delta) * Math.Cos(H) - CAAGlobe.RhoCosThetaPrime(Latitude, Height) * Math.Sin(pi); double C = Math.Sin(Delta) - CAAGlobe.RhoSinThetaPrime(Latitude, Height) * Math.Sin(pi); double q = Math.Sqrt(A * A + B * B + C * C); double s = CT.D2R(GeocentricMoonSemidiameter(DistanceDelta) / 3600); return(CT.R2D(Math.Asin(Math.Sin(s) / q)) * 3600); }
public static CAATopocentricEclipticDetails Ecliptic2Topocentric(double Lambda, double Beta, double Semidiameter, double Distance, double Epsilon, double Longitude, double Latitude, double Height, double JD) { double S = CAAGlobe.RhoSinThetaPrime(Latitude, Height); double C = CAAGlobe.RhoCosThetaPrime(Latitude, Height); //Convert to radians Lambda = CAACoordinateTransformation.DegreesToRadians(Lambda); Beta = CAACoordinateTransformation.DegreesToRadians(Beta); Epsilon = CAACoordinateTransformation.DegreesToRadians(Epsilon); Longitude = CAACoordinateTransformation.DegreesToRadians(Longitude); Latitude = CAACoordinateTransformation.DegreesToRadians(Latitude); Semidiameter = CAACoordinateTransformation.DegreesToRadians(Semidiameter); double sine = Math.Sin(Epsilon); double cose = Math.Cos(Epsilon); double cosBeta = Math.Cos(Beta); double sinBeta = Math.Sin(Beta); //Calculate the Sidereal time double theta = CAASidereal.ApparentGreenwichSiderealTime(JD); theta = CAACoordinateTransformation.HoursToRadians(theta); double sintheta = Math.Sin(theta); //Calculate the Parallax double pi = Math.Asin(GlobalMembersStdafx.g_AAParallax_C1 / Distance); double sinpi = Math.Sin(pi); double N = Math.Cos(Lambda) * cosBeta - C * sinpi * Math.Cos(theta); CAATopocentricEclipticDetails Topocentric = new CAATopocentricEclipticDetails(); Topocentric.Lambda = Math.Atan2(Math.Sin(Lambda) * cosBeta - sinpi * (S * sine + C * cose * sintheta), N); double cosTopocentricLambda = Math.Cos(Topocentric.Lambda); Topocentric.Beta = Math.Atan(cosTopocentricLambda * (sinBeta - sinpi * (S * cose - C * sine * sintheta)) / N); Topocentric.Semidiameter = Math.Asin(cosTopocentricLambda * Math.Cos(Topocentric.Beta) * Math.Sin(Semidiameter) / N); //Convert back to degrees Topocentric.Semidiameter = CAACoordinateTransformation.RadiansToDegrees(Topocentric.Semidiameter); Topocentric.Lambda = CAACoordinateTransformation.MapTo0To360Range(CAACoordinateTransformation.RadiansToDegrees(Topocentric.Lambda)); Topocentric.Beta = CAACoordinateTransformation.RadiansToDegrees(Topocentric.Beta); return(Topocentric); }