Пример #1
0
    public static CAAEllipticalPlanetaryDetails Calculate(double JD, EllipticalObject @object)
    {
        //What will the the return value
        var details = new CAAEllipticalPlanetaryDetails();

        var JD0 = JD;
        double L0 = 0;
        double B0 = 0;
        double R0 = 0;
        double cosB0 = 0;
        if (@object != EllipticalObject.SUN)
        {
          L0 = CAAEarth.EclipticLongitude(JD0);
          B0 = CAAEarth.EclipticLatitude(JD0);
          R0 = CAAEarth.RadiusVector(JD0);
          L0 = CAACoordinateTransformation.DegreesToRadians(L0);
          B0 = CAACoordinateTransformation.DegreesToRadians(B0);
          cosB0 = Math.Cos(B0);
        }

        //Calculate the initial values
        double L = 0;
        double B = 0;
        double R = 0;

        double Lrad;
        double Brad;
        double cosB;
        double cosL;
        double x;
        double y;
        double z;
        var bRecalc = true;
        var bFirstRecalc = true;
        double LPrevious = 0;
        double BPrevious = 0;
        double RPrevious = 0;
        while (bRecalc)
        {
          switch (@object)
          {
        case EllipticalObject.SUN:
        {
          L = CAASun.GeometricEclipticLongitude(JD0);
          B = CAASun.GeometricEclipticLatitude(JD0);
          R = CAAEarth.RadiusVector(JD0);
          break;
        }
        case EllipticalObject.MERCURY:
        {
          L = CAAMercury.EclipticLongitude(JD0);
          B = CAAMercury.EclipticLatitude(JD0);
          R = CAAMercury.RadiusVector(JD0);
          break;
        }
        case EllipticalObject.VENUS:
        {
          L = CAAVenus.EclipticLongitude(JD0);
          B = CAAVenus.EclipticLatitude(JD0);
          R = CAAVenus.RadiusVector(JD0);
          break;
        }
        case EllipticalObject.MARS:
        {
          L = CAAMars.EclipticLongitude(JD0);
          B = CAAMars.EclipticLatitude(JD0);
          R = CAAMars.RadiusVector(JD0);
          break;
        }
        case EllipticalObject.JUPITER:
        {
          L = CAAJupiter.EclipticLongitude(JD0);
          B = CAAJupiter.EclipticLatitude(JD0);
          R = CAAJupiter.RadiusVector(JD0);
          break;
        }
        case EllipticalObject.SATURN:
        {
          L = CAASaturn.EclipticLongitude(JD0);
          B = CAASaturn.EclipticLatitude(JD0);
          R = CAASaturn.RadiusVector(JD0);
          break;
        }
        case EllipticalObject.URANUS:
        {
          L = CAAUranus.EclipticLongitude(JD0);
          B = CAAUranus.EclipticLatitude(JD0);
          R = CAAUranus.RadiusVector(JD0);
          break;
        }
        case EllipticalObject.NEPTUNE:
        {
          L = CAANeptune.EclipticLongitude(JD0);
          B = CAANeptune.EclipticLatitude(JD0);
          R = CAANeptune.RadiusVector(JD0);
          break;
        }
        case EllipticalObject.PLUTO:
        {
          L = CAAPluto.EclipticLongitude(JD0);
          B = CAAPluto.EclipticLatitude(JD0);
          R = CAAPluto.RadiusVector(JD0);
          break;
        }
        default:
        {
          Debug.Assert(false);
          break;
        }
          }

          if (!bFirstRecalc)
          {
        bRecalc = ((Math.Abs(L - LPrevious) > 0.00001) || (Math.Abs(B - BPrevious) > 0.00001) || (Math.Abs(R - RPrevious) > 0.000001));
        LPrevious = L;
        BPrevious = B;
        RPrevious = R;
          }
          else
        bFirstRecalc = false;

          //Calculate the new value
          if (bRecalc)
          {
        double distance = 0;
        if (@object != EllipticalObject.SUN)
        {
          Lrad = CAACoordinateTransformation.DegreesToRadians(L);
          Brad = CAACoordinateTransformation.DegreesToRadians(B);
          cosB = Math.Cos(Brad);
          cosL = Math.Cos(Lrad);
          x = R * cosB * cosL - R0 * cosB0 * Math.Cos(L0);
          y = R * cosB * Math.Sin(Lrad) - R0 * cosB0 * Math.Sin(L0);
          z = R * Math.Sin(Brad) - R0 * Math.Sin(B0);
          distance = Math.Sqrt(x *x + y *y + z *z);
        }
        else
          distance = R; //Distance to the sun from the earth is in fact the radius vector

        //Prepare for the next loop around
        JD0 = JD - DistanceToLightTime(distance);
          }
        }

        Lrad = CAACoordinateTransformation.DegreesToRadians(L);
        Brad = CAACoordinateTransformation.DegreesToRadians(B);
        cosB = Math.Cos(Brad);
        cosL = Math.Cos(Lrad);
        x = R * cosB * cosL - R0 * cosB0 * Math.Cos(L0);
        y = R * cosB * Math.Sin(Lrad) - R0 * cosB0 * Math.Sin(L0);
        z = R * Math.Sin(Brad) - R0 * Math.Sin(B0);
        var x2 = x *x;
        var y2 = y *y;

        details.ApparentGeocentricLatitude = CAACoordinateTransformation.RadiansToDegrees(Math.Atan2(z, Math.Sqrt(x2 + y2)));
        details.ApparentGeocentricDistance = Math.Sqrt(x2 + y2 + z *z);
        details.ApparentGeocentricLongitude = CAACoordinateTransformation.MapTo0To360Range(CAACoordinateTransformation.RadiansToDegrees(Math.Atan2(y, x)));
        details.ApparentLightTime = DistanceToLightTime(details.ApparentGeocentricDistance);

        //Adjust for Aberration
        var Aberration = CAAAberration.EclipticAberration(details.ApparentGeocentricLongitude, details.ApparentGeocentricLatitude, JD);
        details.ApparentGeocentricLongitude += Aberration.X;
        details.ApparentGeocentricLatitude += Aberration.Y;

        //convert to the FK5 system
        var DeltaLong = CAAFK5.CorrectionInLongitude(details.ApparentGeocentricLongitude, details.ApparentGeocentricLatitude, JD);
        details.ApparentGeocentricLatitude += CAAFK5.CorrectionInLatitude(details.ApparentGeocentricLongitude, JD);
        details.ApparentGeocentricLongitude += DeltaLong;

        //Correct for nutation
        var NutationInLongitude = CAANutation.NutationInLongitude(JD);
        var Epsilon = CAANutation.TrueObliquityOfEcliptic(JD);
        details.ApparentGeocentricLongitude += CAACoordinateTransformation.DMSToDegrees(0, 0, NutationInLongitude);

        //Convert to RA and Dec
        var ApparentEqu = CAACoordinateTransformation.Ecliptic2Equatorial(details.ApparentGeocentricLongitude, details.ApparentGeocentricLatitude, Epsilon);
        details.ApparentGeocentricRA = ApparentEqu.X;
        details.ApparentGeocentricDeclination = ApparentEqu.Y;

        return details;
    }
Пример #2
0
    public static CAAEllipticalPlanetaryDetails Calculate(double JD, EllipticalObject @object)
    {
        //What will the the return value
        CAAEllipticalPlanetaryDetails details = new CAAEllipticalPlanetaryDetails();

        double JD0   = JD;
        double L0    = 0;
        double B0    = 0;
        double R0    = 0;
        double cosB0 = 0;

        if (@object != EllipticalObject.SUN)
        {
            L0    = CAAEarth.EclipticLongitude(JD0);
            B0    = CAAEarth.EclipticLatitude(JD0);
            R0    = CAAEarth.RadiusVector(JD0);
            L0    = CAACoordinateTransformation.DegreesToRadians(L0);
            B0    = CAACoordinateTransformation.DegreesToRadians(B0);
            cosB0 = Math.Cos(B0);
        }


        //Calculate the initial values
        double L = 0;
        double B = 0;
        double R = 0;

        double Lrad;
        double Brad;
        double cosB;
        double cosL;
        double x;
        double y;
        double z;
        bool   bRecalc      = true;
        bool   bFirstRecalc = true;
        double LPrevious    = 0;
        double BPrevious    = 0;
        double RPrevious    = 0;

        while (bRecalc)
        {
            switch (@object)
            {
            case EllipticalObject.SUN:
            {
                L = CAASun.GeometricEclipticLongitude(JD0);
                B = CAASun.GeometricEclipticLatitude(JD0);
                R = CAAEarth.RadiusVector(JD0);
                break;
            }

            case EllipticalObject.MERCURY:
            {
                L = CAAMercury.EclipticLongitude(JD0);
                B = CAAMercury.EclipticLatitude(JD0);
                R = CAAMercury.RadiusVector(JD0);
                break;
            }

            case EllipticalObject.VENUS:
            {
                L = CAAVenus.EclipticLongitude(JD0);
                B = CAAVenus.EclipticLatitude(JD0);
                R = CAAVenus.RadiusVector(JD0);
                break;
            }

            case EllipticalObject.MARS:
            {
                L = CAAMars.EclipticLongitude(JD0);
                B = CAAMars.EclipticLatitude(JD0);
                R = CAAMars.RadiusVector(JD0);
                break;
            }

            case EllipticalObject.JUPITER:
            {
                L = CAAJupiter.EclipticLongitude(JD0);
                B = CAAJupiter.EclipticLatitude(JD0);
                R = CAAJupiter.RadiusVector(JD0);
                break;
            }

            case EllipticalObject.SATURN:
            {
                L = CAASaturn.EclipticLongitude(JD0);
                B = CAASaturn.EclipticLatitude(JD0);
                R = CAASaturn.RadiusVector(JD0);
                break;
            }

            case EllipticalObject.URANUS:
            {
                L = CAAUranus.EclipticLongitude(JD0);
                B = CAAUranus.EclipticLatitude(JD0);
                R = CAAUranus.RadiusVector(JD0);
                break;
            }

            case EllipticalObject.NEPTUNE:
            {
                L = CAANeptune.EclipticLongitude(JD0);
                B = CAANeptune.EclipticLatitude(JD0);
                R = CAANeptune.RadiusVector(JD0);
                break;
            }

            case EllipticalObject.PLUTO:
            {
                L = CAAPluto.EclipticLongitude(JD0);
                B = CAAPluto.EclipticLatitude(JD0);
                R = CAAPluto.RadiusVector(JD0);
                break;
            }

            default:
            {
                Debug.Assert(false);
                break;
            }
            }

            if (!bFirstRecalc)
            {
                bRecalc   = ((Math.Abs(L - LPrevious) > 0.00001) || (Math.Abs(B - BPrevious) > 0.00001) || (Math.Abs(R - RPrevious) > 0.000001));
                LPrevious = L;
                BPrevious = B;
                RPrevious = R;
            }
            else
            {
                bFirstRecalc = false;
            }



            //Calculate the new value
            if (bRecalc)
            {
                double distance = 0;
                if (@object != EllipticalObject.SUN)
                {
                    Lrad     = CAACoordinateTransformation.DegreesToRadians(L);
                    Brad     = CAACoordinateTransformation.DegreesToRadians(B);
                    cosB     = Math.Cos(Brad);
                    cosL     = Math.Cos(Lrad);
                    x        = R * cosB * cosL - R0 * cosB0 * Math.Cos(L0);
                    y        = R * cosB * Math.Sin(Lrad) - R0 * cosB0 * Math.Sin(L0);
                    z        = R * Math.Sin(Brad) - R0 * Math.Sin(B0);
                    distance = Math.Sqrt(x * x + y * y + z * z);
                }
                else
                {
                    distance = R; //Distance to the sun from the earth is in fact the radius vector
                }
                //Prepare for the next loop around
                JD0 = JD - CAAElliptical.DistanceToLightTime(distance);
            }
        }

        Lrad = CAACoordinateTransformation.DegreesToRadians(L);
        Brad = CAACoordinateTransformation.DegreesToRadians(B);
        cosB = Math.Cos(Brad);
        cosL = Math.Cos(Lrad);
        x    = R * cosB * cosL - R0 * cosB0 * Math.Cos(L0);
        y    = R * cosB * Math.Sin(Lrad) - R0 * cosB0 * Math.Sin(L0);
        z    = R * Math.Sin(Brad) - R0 * Math.Sin(B0);
        double x2 = x * x;
        double y2 = y * y;

        details.ApparentGeocentricLatitude  = CAACoordinateTransformation.RadiansToDegrees(Math.Atan2(z, Math.Sqrt(x2 + y2)));
        details.ApparentGeocentricDistance  = Math.Sqrt(x2 + y2 + z * z);
        details.ApparentGeocentricLongitude = CAACoordinateTransformation.MapTo0To360Range(CAACoordinateTransformation.RadiansToDegrees(Math.Atan2(y, x)));
        details.ApparentLightTime           = CAAElliptical.DistanceToLightTime(details.ApparentGeocentricDistance);

        //Adjust for Aberration
        CAA2DCoordinate Aberration = CAAAberration.EclipticAberration(details.ApparentGeocentricLongitude, details.ApparentGeocentricLatitude, JD);

        details.ApparentGeocentricLongitude += Aberration.X;
        details.ApparentGeocentricLatitude  += Aberration.Y;

        //convert to the FK5 system
        double DeltaLong = CAAFK5.CorrectionInLongitude(details.ApparentGeocentricLongitude, details.ApparentGeocentricLatitude, JD);

        details.ApparentGeocentricLatitude  += CAAFK5.CorrectionInLatitude(details.ApparentGeocentricLongitude, JD);
        details.ApparentGeocentricLongitude += DeltaLong;

        //Correct for nutation
        double NutationInLongitude = CAANutation.NutationInLongitude(JD);
        double Epsilon             = CAANutation.TrueObliquityOfEcliptic(JD);

        details.ApparentGeocentricLongitude += CAACoordinateTransformation.DMSToDegrees(0, 0, NutationInLongitude);

        //Convert to RA and Dec
        CAA2DCoordinate ApparentEqu = CAACoordinateTransformation.Ecliptic2Equatorial(details.ApparentGeocentricLongitude, details.ApparentGeocentricLatitude, Epsilon);

        details.ApparentGeocentricRA          = ApparentEqu.X;
        details.ApparentGeocentricDeclination = ApparentEqu.Y;

        return(details);
    }