protected static CAAPhysicalMoonDetails CalculateHelper(double JD, ref double Lambda, ref double Beta, ref double epsilon, ref CAA2DCoordinate Equatorial) { //What will be the return value CAAPhysicalMoonDetails details = new CAAPhysicalMoonDetails(); //Calculate the initial quantities Lambda = CAAMoon.EclipticLongitude(JD); Beta = CAAMoon.EclipticLatitude(JD); //Calculate the optical libration double omega = 0; double DeltaU = 0; double sigma = 0; double I = 0; double rho = 0; CalculateOpticalLibration(JD, Lambda, Beta, ref details.ldash, ref details.bdash, ref details.ldash2, ref details.bdash2, ref epsilon, ref omega, ref DeltaU, ref sigma, ref I, ref rho); double epsilonrad = CAACoordinateTransformation.DegreesToRadians(epsilon); //Calculate the total libration details.l = details.ldash + details.ldash2; details.b = details.bdash + details.bdash2; double b = CAACoordinateTransformation.DegreesToRadians(details.b); //Calculate the position angle double V = omega + DeltaU + CAACoordinateTransformation.DegreesToRadians(sigma) / Math.Sin(I); double I_rho = I + CAACoordinateTransformation.DegreesToRadians(rho); double X = Math.Sin(I_rho) * Math.Sin(V); double Y = Math.Sin(I_rho) * Math.Cos(V) * Math.Cos(epsilonrad) - Math.Cos(I_rho) * Math.Sin(epsilonrad); double w = Math.Atan2(X, Y); Equatorial = CAACoordinateTransformation.Ecliptic2Equatorial(Lambda, Beta, epsilon); double Alpha = CAACoordinateTransformation.HoursToRadians(Equatorial.X); details.P = CAACoordinateTransformation.RadiansToDegrees(Math.Asin(Math.Sqrt(X * X + Y * Y) * Math.Cos(Alpha - w) / (Math.Cos(b)))); return(details); }
public static CAAPhysicalMoonDetails CalculateTopocentric(double JD, double Longitude, double Latitude) { //First convert to radians Longitude = CAACoordinateTransformation.DegreesToRadians(Longitude); Latitude = CAACoordinateTransformation.DegreesToRadians(Latitude); double Lambda = 0; double Beta = 0; double epsilon = 0; CAA2DCoordinate Equatorial = new CAA2DCoordinate(); CAAPhysicalMoonDetails details = CalculateHelper(JD, ref Lambda, ref Beta, ref epsilon, ref Equatorial); double R = CAAMoon.RadiusVector(JD); double pi = CAAMoon.RadiusVectorToHorizontalParallax(R); double Alpha = CAACoordinateTransformation.HoursToRadians(Equatorial.X); double Delta = CAACoordinateTransformation.DegreesToRadians(Equatorial.Y); double AST = CAASidereal.ApparentGreenwichSiderealTime(JD); double H = CAACoordinateTransformation.HoursToRadians(AST) - Longitude - Alpha; double Q = Math.Atan2(Math.Cos(Latitude) * Math.Sin(H), Math.Cos(Delta) * Math.Sin(Latitude) - Math.Sin(Delta) * Math.Cos(Latitude) * Math.Cos(H)); double Z = Math.Acos(Math.Sin(Delta) * Math.Sin(Latitude) + Math.Cos(Delta) * Math.Cos(Latitude) * Math.Cos(H)); double pidash = pi * (Math.Sin(Z) + 0.0084 * Math.Sin(2 * Z)); double Prad = CAACoordinateTransformation.DegreesToRadians(details.P); double DeltaL = -pidash *Math.Sin(Q - Prad) / Math.Cos(CAACoordinateTransformation.DegreesToRadians(details.b)); details.l += DeltaL; double DeltaB = pidash * Math.Cos(Q - Prad); details.b += DeltaB; details.P += DeltaL * Math.Sin(CAACoordinateTransformation.DegreesToRadians(details.b)) - pidash * Math.Sin(Q) * Math.Tan(Delta); return(details); }
protected static CAAPhysicalMoonDetails CalculateHelper(double JD, ref double Lambda, ref double Beta, ref double epsilon, ref CAA2DCoordinate Equatorial) { //What will be the return value CAAPhysicalMoonDetails details = new CAAPhysicalMoonDetails(); //Calculate the initial quantities Lambda = CAAMoon.EclipticLongitude(JD); Beta = CAAMoon.EclipticLatitude(JD); //Calculate the optical libration double omega=0; double DeltaU=0; double sigma=0; double I=0; double rho=0; CalculateOpticalLibration(JD, Lambda, Beta, ref details.ldash, ref details.bdash, ref details.ldash2, ref details.bdash2, ref epsilon, ref omega, ref DeltaU, ref sigma, ref I, ref rho); double epsilonrad = CAACoordinateTransformation.DegreesToRadians(epsilon); //Calculate the total libration details.l = details.ldash + details.ldash2; details.b = details.bdash + details.bdash2; double b = CAACoordinateTransformation.DegreesToRadians(details.b); //Calculate the position angle double V = omega + DeltaU + CAACoordinateTransformation.DegreesToRadians(sigma)/Math.Sin(I); double I_rho = I + CAACoordinateTransformation.DegreesToRadians(rho); double X = Math.Sin(I_rho)*Math.Sin(V); double Y = Math.Sin(I_rho)*Math.Cos(V)*Math.Cos(epsilonrad) - Math.Cos(I_rho)*Math.Sin(epsilonrad); double w = Math.Atan2(X, Y); Equatorial = CAACoordinateTransformation.Ecliptic2Equatorial(Lambda, Beta, epsilon); double Alpha = CAACoordinateTransformation.HoursToRadians(Equatorial.X); details.P = CAACoordinateTransformation.RadiansToDegrees(Math.Asin(Math.Sqrt(X *X + Y *Y)*Math.Cos(Alpha - w)/(Math.Cos(b)))); return details; }