コード例 #1
0
    public static CAAParabolicObjectDetails Calculate(double JD, CAAParabolicObjectElements elements)
    {
        double Epsilon = CAANutation.MeanObliquityOfEcliptic(elements.JDEquinox);

        double JD0 = JD;

        //What will be the return value
        CAAParabolicObjectDetails details = new CAAParabolicObjectDetails();

        Epsilon = CT.D2R(Epsilon);
        double omega = CT.D2R(elements.omega);
        double w = CT.D2R(elements.w);
        double i = CT.D2R(elements.i);

        double sinEpsilon = Math.Sin(Epsilon);
        double cosEpsilon = Math.Cos(Epsilon);
        double sinOmega = Math.Sin(omega);
        double cosOmega = Math.Cos(omega);
        double cosi = Math.Cos(i);
        double sini = Math.Sin(i);

        double F = cosOmega;
        double G = sinOmega * cosEpsilon;
        double H = sinOmega * sinEpsilon;
        double P = -sinOmega * cosi;
        double Q = cosOmega *cosi *cosEpsilon - sini *sinEpsilon;
        double R = cosOmega *cosi *sinEpsilon + sini *cosEpsilon;
        double a = Math.Sqrt(F *F + P *P);
        double b = Math.Sqrt(G *G + Q *Q);
        double c = Math.Sqrt(H *H + R *R);
        double A = Math.Atan2(F, P);
        double B = Math.Atan2(G, Q);
        double C = Math.Atan2(H, R);

        C3D SunCoord = CAASun.EquatorialRectangularCoordinatesAnyEquinox(JD, elements.JDEquinox);

        for (int j =0; j<2; j++)
        {
          double W = 0.03649116245/(elements.q * Math.Sqrt(elements.q)) * (JD0 - elements.T);
          double s = CalculateBarkers(W);
          double v = 2 *Math.Atan(s);
          double r = elements.q * (1 + s *s);
          double x = r * a * Math.Sin(A + w + v);
          double y = r * b * Math.Sin(B + w + v);
          double z = r * c * Math.Sin(C + w + v);

          if (j == 0)
          {
        details.HeliocentricRectangularEquatorial.X = x;
        details.HeliocentricRectangularEquatorial.Y = y;
        details.HeliocentricRectangularEquatorial.Z = z;

        //Calculate the heliocentric ecliptic coordinates also
        double u = omega + v;
        double cosu = Math.Cos(u);
        double sinu = Math.Sin(u);

        details.HeliocentricRectangularEcliptical.X = r * (cosOmega *cosu - sinOmega *sinu *cosi);
        details.HeliocentricRectangularEcliptical.Y = r * (sinOmega *cosu + cosOmega *sinu *cosi);
        details.HeliocentricRectangularEcliptical.Z = r *sini *sinu;

        details.HeliocentricEclipticLongitude = Math.Atan2(y, x);
        details.HeliocentricEclipticLongitude = CT.M24(CT.R2D(details.HeliocentricEclipticLongitude) / 15);
        details.HeliocentricEclipticLatitude = Math.Asin(z / r);
        details.HeliocentricEclipticLatitude = CT.R2D(details.HeliocentricEclipticLatitude);
          }

          double psi = SunCoord.X + x;
          double nu = SunCoord.Y + y;
          double sigma = SunCoord.Z + z;

          double Alpha = Math.Atan2(nu, psi);
          Alpha = CT.R2D(Alpha);
          double Delta = Math.Atan2(sigma, Math.Sqrt(psi *psi + nu *nu));
          Delta = CT.R2D(Delta);
          double Distance = Math.Sqrt(psi *psi + nu *nu + sigma *sigma);

          if (j == 0)
          {
        details.TrueGeocentricRA = CT.M24(Alpha / 15);
        details.TrueGeocentricDeclination = Delta;
        details.TrueGeocentricDistance = Distance;
        details.TrueGeocentricLightTime = ELL.DistanceToLightTime(Distance);
          }
          else
          {
        details.AstrometricGeocenticRA = CT.M24(Alpha / 15);
        details.AstrometricGeocentricDeclination = Delta;
        details.AstrometricGeocentricDistance = Distance;
        details.AstrometricGeocentricLightTime = ELL.DistanceToLightTime(Distance);

        double RES = Math.Sqrt(SunCoord.X *SunCoord.X + SunCoord.Y *SunCoord.Y + SunCoord.Z *SunCoord.Z);

        details.Elongation = CT.R2D(Math.Acos((RES *RES + Distance *Distance - r *r) / (2 * RES * Distance)));
        details.PhaseAngle = CT.R2D(Math.Acos((r *r + Distance *Distance - RES *RES) / (2 * r * Distance)));
          }

          if (j == 0) //Prepare for the next loop around
        JD0 = JD - details.TrueGeocentricLightTime;
        }

        return details;
    }
コード例 #2
0
    public static CAAParabolicObjectDetails Calculate(double JD, CAAParabolicObjectElements elements)
    {
        double Epsilon = CAANutation.MeanObliquityOfEcliptic(elements.JDEquinox);

        double JD0 = JD;

        //What will be the return value
        CAAParabolicObjectDetails details = new CAAParabolicObjectDetails();

        Epsilon = CT.D2R(Epsilon);
        double omega = CT.D2R(elements.omega);
        double w     = CT.D2R(elements.w);
        double i     = CT.D2R(elements.i);

        double sinEpsilon = Math.Sin(Epsilon);
        double cosEpsilon = Math.Cos(Epsilon);
        double sinOmega   = Math.Sin(omega);
        double cosOmega   = Math.Cos(omega);
        double cosi       = Math.Cos(i);
        double sini       = Math.Sin(i);

        double F = cosOmega;
        double G = sinOmega * cosEpsilon;
        double H = sinOmega * sinEpsilon;
        double P = -sinOmega * cosi;
        double Q = cosOmega * cosi * cosEpsilon - sini * sinEpsilon;
        double R = cosOmega * cosi * sinEpsilon + sini * cosEpsilon;
        double a = Math.Sqrt(F * F + P * P);
        double b = Math.Sqrt(G * G + Q * Q);
        double c = Math.Sqrt(H * H + R * R);
        double A = Math.Atan2(F, P);
        double B = Math.Atan2(G, Q);
        double C = Math.Atan2(H, R);

        C3D SunCoord = CAASun.EquatorialRectangularCoordinatesAnyEquinox(JD, elements.JDEquinox);

        for (int j = 0; j < 2; j++)
        {
            double W = 0.03649116245 / (elements.q * Math.Sqrt(elements.q)) * (JD0 - elements.T);
            double s = CalculateBarkers(W);
            double v = 2 * Math.Atan(s);
            double r = elements.q * (1 + s * s);
            double x = r * a * Math.Sin(A + w + v);
            double y = r * b * Math.Sin(B + w + v);
            double z = r * c * Math.Sin(C + w + v);

            if (j == 0)
            {
                details.HeliocentricRectangularEquatorial.X = x;
                details.HeliocentricRectangularEquatorial.Y = y;
                details.HeliocentricRectangularEquatorial.Z = z;

                //Calculate the heliocentric ecliptic coordinates also
                double u    = omega + v;
                double cosu = Math.Cos(u);
                double sinu = Math.Sin(u);

                details.HeliocentricRectangularEcliptical.X = r * (cosOmega * cosu - sinOmega * sinu * cosi);
                details.HeliocentricRectangularEcliptical.Y = r * (sinOmega * cosu + cosOmega * sinu * cosi);
                details.HeliocentricRectangularEcliptical.Z = r * sini * sinu;

                details.HeliocentricEclipticLongitude = Math.Atan2(y, x);
                details.HeliocentricEclipticLongitude = CT.M24(CT.R2D(details.HeliocentricEclipticLongitude) / 15);
                details.HeliocentricEclipticLatitude  = Math.Asin(z / r);
                details.HeliocentricEclipticLatitude  = CT.R2D(details.HeliocentricEclipticLatitude);
            }

            double psi   = SunCoord.X + x;
            double nu    = SunCoord.Y + y;
            double sigma = SunCoord.Z + z;

            double Alpha = Math.Atan2(nu, psi);
            Alpha = CT.R2D(Alpha);
            double Delta = Math.Atan2(sigma, Math.Sqrt(psi * psi + nu * nu));
            Delta = CT.R2D(Delta);
            double Distance = Math.Sqrt(psi * psi + nu * nu + sigma * sigma);

            if (j == 0)
            {
                details.TrueGeocentricRA          = CT.M24(Alpha / 15);
                details.TrueGeocentricDeclination = Delta;
                details.TrueGeocentricDistance    = Distance;
                details.TrueGeocentricLightTime   = ELL.DistanceToLightTime(Distance);
            }
            else
            {
                details.AstrometricGeocenticRA           = CT.M24(Alpha / 15);
                details.AstrometricGeocentricDeclination = Delta;
                details.AstrometricGeocentricDistance    = Distance;
                details.AstrometricGeocentricLightTime   = ELL.DistanceToLightTime(Distance);

                double RES = Math.Sqrt(SunCoord.X * SunCoord.X + SunCoord.Y * SunCoord.Y + SunCoord.Z * SunCoord.Z);

                details.Elongation = CT.R2D(Math.Acos((RES * RES + Distance * Distance - r * r) / (2 * RES * Distance)));
                details.PhaseAngle = CT.R2D(Math.Acos((r * r + Distance * Distance - RES * RES) / (2 * r * Distance)));
            }

            if (j == 0) //Prepare for the next loop around
            {
                JD0 = JD - details.TrueGeocentricLightTime;
            }
        }

        return(details);
    }
コード例 #3
0
    public static CAAParabolicObjectDetails Calculate(double JD, CAAParabolicObjectElements elements)
    {
        var Epsilon = CAANutation.MeanObliquityOfEcliptic(elements.JDEquinox);

        var JD0 = JD;

        //What will be the return value
        var details = new CAAParabolicObjectDetails();

        Epsilon = CAACoordinateTransformation.DegreesToRadians(Epsilon);
        var omega = CAACoordinateTransformation.DegreesToRadians(elements.omega);
        var w = CAACoordinateTransformation.DegreesToRadians(elements.w);
        var i = CAACoordinateTransformation.DegreesToRadians(elements.i);

        var sinEpsilon = Math.Sin(Epsilon);
        var cosEpsilon = Math.Cos(Epsilon);
        var sinOmega = Math.Sin(omega);
        var cosOmega = Math.Cos(omega);
        var cosi = Math.Cos(i);
        var sini = Math.Sin(i);

        var F = cosOmega;
        var G = sinOmega * cosEpsilon;
        var H = sinOmega * sinEpsilon;
        var P = -sinOmega * cosi;
        var Q = cosOmega *cosi *cosEpsilon - sini *sinEpsilon;
        var R = cosOmega *cosi *sinEpsilon + sini *cosEpsilon;
        var a = Math.Sqrt(F *F + P *P);
        var b = Math.Sqrt(G *G + Q *Q);
        var c = Math.Sqrt(H *H + R *R);
        var A = Math.Atan2(F, P);
        var B = Math.Atan2(G, Q);
        var C = Math.Atan2(H, R);

        var SunCoord = CAASun.EquatorialRectangularCoordinatesAnyEquinox(JD, elements.JDEquinox);

        for (var j =0; j<2; j++)
        {
          var W = 0.03649116245/(elements.q * Math.Sqrt(elements.q)) * (JD0 - elements.T);
          var s = CalculateBarkers(W);
          var v = 2 *Math.Atan(s);
          var r = elements.q * (1 + s *s);
          var x = r * a * Math.Sin(A + w + v);
          var y = r * b * Math.Sin(B + w + v);
          var z = r * c * Math.Sin(C + w + v);

          if (j == 0)
          {
        details.HeliocentricRectangularEquatorial.X = x;
        details.HeliocentricRectangularEquatorial.Y = y;
        details.HeliocentricRectangularEquatorial.Z = z;

        //Calculate the heliocentric ecliptic coordinates also
        var u = omega + v;
        var cosu = Math.Cos(u);
        var sinu = Math.Sin(u);

        details.HeliocentricRectangularEcliptical.X = r * (cosOmega *cosu - sinOmega *sinu *cosi);
        details.HeliocentricRectangularEcliptical.Y = r * (sinOmega *cosu + cosOmega *sinu *cosi);
        details.HeliocentricRectangularEcliptical.Z = r *sini *sinu;

        details.HeliocentricEclipticLongitude = Math.Atan2(y, x);
        details.HeliocentricEclipticLongitude = CAACoordinateTransformation.MapTo0To24Range(CAACoordinateTransformation.RadiansToDegrees(details.HeliocentricEclipticLongitude) / 15);
        details.HeliocentricEclipticLatitude = Math.Asin(z / r);
        details.HeliocentricEclipticLatitude = CAACoordinateTransformation.RadiansToDegrees(details.HeliocentricEclipticLatitude);
          }

          var psi = SunCoord.X + x;
          var nu = SunCoord.Y + y;
          var sigma = SunCoord.Z + z;

          var Alpha = Math.Atan2(nu, psi);
          Alpha = CAACoordinateTransformation.RadiansToDegrees(Alpha);
          var Delta = Math.Atan2(sigma, Math.Sqrt(psi *psi + nu *nu));
          Delta = CAACoordinateTransformation.RadiansToDegrees(Delta);
          var Distance = Math.Sqrt(psi *psi + nu *nu + sigma *sigma);

          if (j == 0)
          {
        details.TrueGeocentricRA = CAACoordinateTransformation.MapTo0To24Range(Alpha / 15);
        details.TrueGeocentricDeclination = Delta;
        details.TrueGeocentricDistance = Distance;
        details.TrueGeocentricLightTime = CAAElliptical.DistanceToLightTime(Distance);
          }
          else
          {
        details.AstrometricGeocenticRA = CAACoordinateTransformation.MapTo0To24Range(Alpha / 15);
        details.AstrometricGeocentricDeclination = Delta;
        details.AstrometricGeocentricDistance = Distance;
        details.AstrometricGeocentricLightTime = CAAElliptical.DistanceToLightTime(Distance);

        var RES = Math.Sqrt(SunCoord.X *SunCoord.X + SunCoord.Y *SunCoord.Y + SunCoord.Z *SunCoord.Z);

        details.Elongation = CAACoordinateTransformation.RadiansToDegrees(Math.Acos((RES *RES + Distance *Distance - r *r) / (2 * RES * Distance)));
        details.PhaseAngle = CAACoordinateTransformation.RadiansToDegrees(Math.Acos((r *r + Distance *Distance - RES *RES) / (2 * r * Distance)));
          }

          if (j == 0) //Prepare for the next loop around
        JD0 = JD - details.TrueGeocentricLightTime;
        }

        return details;
    }