예제 #1
0
        public static CrdsRectangular[] Positions(double jd, CrdsHeliocentrical earth, CrdsHeliocentrical uranus)
        {
            CrdsRectangular[] moons = new CrdsRectangular[MOONS_COUNT];

            // Rectangular topocentrical coordinates of Uranus
            CrdsRectangular rectUranus = uranus.ToRectangular(earth);

            // Ecliptical coordinates of Uranus
            CrdsEcliptical eclUranus = rectUranus.ToEcliptical();

            // Distance from Earth to Uranus, in AU
            double distanceUranus = eclUranus.Distance;

            // light-time effect
            double tau = PlanetPositions.LightTimeEffect(distanceUranus);

            double t = jd - 2444239.5 - tau;

            double[] elem = new double[6 * MOONS_COUNT];
            double[] an   = new double[MOONS_COUNT];
            double[] ae   = new double[MOONS_COUNT];
            double[] ai   = new double[MOONS_COUNT];

            // Calculate GUST86 elements:

            for (int i = 0; i < 5; i++)
            {
                an[i] = IEEERemainder(fqn[i] * t + phn[i], 2 * PI);
                ae[i] = IEEERemainder(fqe[i] * t + phe[i], 2 * PI);
                ai[i] = IEEERemainder(fqi[i] * t + phi[i], 2 * PI);
            }

            elem[0 * 6 + 0] = 4.44352267
                              - Cos(an[0] - an[1] * 3.0 + an[2] * 2.0) * 3.492e-5
                              + Cos(an[0] * 2.0 - an[1] * 6.0 + an[2] * 4.0) * 8.47e-6
                              + Cos(an[0] * 3.0 - an[1] * 9.0 + an[2] * 6.0) * 1.31e-6
                              - Cos(an[0] - an[1]) * 5.228e-5
                              - Cos(an[0] * 2.0 - an[1] * 2.0) * 1.3665e-4;
            elem[0 * 6 + 1] =
                Sin(an[0] - an[1] * 3.0 + an[2] * 2.0) * .02547217
                - Sin(an[0] * 2.0 - an[1] * 6.0 + an[2] * 4.0) * .00308831
                - Sin(an[0] * 3.0 - an[1] * 9.0 + an[2] * 6.0) * 3.181e-4
                - Sin(an[0] * 4.0 - an[1] * 12 + an[2] * 8.0) * 3.749e-5
                - Sin(an[0] - an[1]) * 5.785e-5
                - Sin(an[0] * 2.0 - an[1] * 2.0) * 6.232e-5
                - Sin(an[0] * 3.0 - an[1] * 3.0) * 2.795e-5
                + t * 4.44519055 - .23805158;
            elem[0 * 6 + 2] = Cos(ae[0]) * .00131238
                              + Cos(ae[1]) * 7.181e-5
                              + Cos(ae[2]) * 6.977e-5
                              + Cos(ae[3]) * 6.75e-6
                              + Cos(ae[4]) * 6.27e-6
                              + Cos(an[0]) * 1.941e-4
                              - Cos(-an[0] + an[1] * 2.0) * 1.2331e-4
                              + Cos(an[0] * -2.0 + an[1] * 3.0) * 3.952e-5;
            elem[0 * 6 + 3] = Sin(ae[0]) * .00131238
                              + Sin(ae[1]) * 7.181e-5
                              + Sin(ae[2]) * 6.977e-5
                              + Sin(ae[3]) * 6.75e-6
                              + Sin(ae[4]) * 6.27e-6
                              + Sin(an[0]) * 1.941e-4
                              - Sin(-an[0] + an[1] * 2.0) * 1.2331e-4
                              + Sin(an[0] * -2.0 + an[1] * 3.0) * 3.952e-5;
            elem[0 * 6 + 4] = Cos(ai[0]) * .03787171
                              + Cos(ai[1]) * 2.701e-5
                              + Cos(ai[2]) * 3.076e-5
                              + Cos(ai[3]) * 1.218e-5
                              + Cos(ai[4]) * 5.37e-6;
            elem[0 * 6 + 4] = Sin(ai[0]) * .03787171
                              + Sin(ai[1]) * 2.701e-5
                              + Sin(ai[2]) * 3.076e-5
                              + Sin(ai[3]) * 1.218e-5
                              + Sin(ai[4]) * 5.37e-6;

            elem[1 * 6 + 0] = 2.49254257
                              + Cos(an[0] - an[1] * 3.0 + an[2] * 2.0) * 2.55e-6
                              - Cos(an[1] - an[2]) * 4.216e-5
                              - Cos(an[1] * 2.0 - an[2] * 2.0) * 1.0256e-4;
            elem[1 * 6 + 1] =
                -Sin(an[0] - an[1] * 3.0 + an[2] * 2.0) * .0018605
                + Sin(an[0] * 2.0 - an[1] * 6.0 + an[2] * 4.0) * 2.1999e-4
                + Sin(an[0] * 3.0 - an[1] * 9.0 + an[2] * 6.0) * 2.31e-5
                + Sin(an[0] * 4.0 - an[1] * 12 + an[2] * 8.0) * 4.3e-6
                - Sin(an[1] - an[2]) * 9.011e-5
                - Sin(an[1] * 2.0 - an[2] * 2.0) * 9.107e-5
                - Sin(an[1] * 3.0 - an[2] * 3.0) * 4.275e-5
                - Sin(an[1] * 2.0 - an[3] * 2.0) * 1.649e-5
                + t * 2.49295252 + 3.09804641;
            elem[1 * 6 + 2] = Cos(ae[0]) * -3.35e-6
                              + Cos(ae[1]) * .00118763
                              + Cos(ae[2]) * 8.6159e-4
                              + Cos(ae[3]) * 7.15e-5
                              + Cos(ae[4]) * 5.559e-5
                              - Cos(-an[1] + an[2] * 2.0) * 8.46e-5
                              + Cos(an[1] * -2.0 + an[2] * 3.0) * 9.181e-5
                              + Cos(-an[1] + an[3] * 2.0) * 2.003e-5
                              + Cos(an[1]) * 8.977e-5;
            elem[1 * 6 + 3] = Sin(ae[0]) * -3.35e-6
                              + Sin(ae[1]) * .00118763
                              + Sin(ae[2]) * 8.6159e-4
                              + Sin(ae[3]) * 7.15e-5
                              + Sin(ae[4]) * 5.559e-5
                              - Sin(-an[1] + an[2] * 2.0) * 8.46e-5
                              + Sin(an[1] * -2.0 + an[2] * 3.0) * 9.181e-5
                              + Sin(-an[1] + an[3] * 2.0) * 2.003e-5
                              + Sin(an[1]) * 8.977e-5;
            elem[1 * 6 + 4] = Cos(ai[0]) * -1.2175e-4
                              + Cos(ai[1]) * 3.5825e-4
                              + Cos(ai[2]) * 2.9008e-4
                              + Cos(ai[3]) * 9.778e-5
                              + Cos(ai[4]) * 3.397e-5;
            elem[1 * 6 + 5] = Sin(ai[0]) * -1.2175e-4
                              + Sin(ai[1]) * 3.5825e-4
                              + Sin(ai[2]) * 2.9008e-4
                              + Sin(ai[3]) * 9.778e-5
                              + Sin(ai[4]) * 3.397e-5;
            elem[2 * 6 + 0] = 1.5159549
                              + Cos(an[2] - an[3] * 2.0 + ae[2]) * 9.74e-6
                              - Cos(an[1] - an[2]) * 1.06e-4
                              + Cos(an[1] * 2.0 - an[2] * 2.0) * 5.416e-5
                              - Cos(an[2] - an[3]) * 2.359e-5
                              - Cos(an[2] * 2.0 - an[3] * 2.0) * 7.07e-5
                              - Cos(an[2] * 3.0 - an[3] * 3.0) * 3.628e-5;
            elem[2 * 6 + 1] =
                Sin(an[0] - an[1] * 3.0 + an[2] * 2.0) * 6.6057e-4
                - Sin(an[0] * 2.0 - an[1] * 6.0 + an[2] * 4.0) * 7.651e-5
                - Sin(an[0] * 3.0 - an[1] * 9.0 + an[2] * 6.0) * 8.96e-6
                - Sin(an[0] * 4.0 - an[1] * 12.0 + an[2] * 8.0) * 2.53e-6
                - Sin(an[2] - an[3] * 4.0 + an[4] * 3.0) * 5.291e-5
                - Sin(an[2] - an[3] * 2.0 + ae[4]) * 7.34e-6
                - Sin(an[2] - an[3] * 2.0 + ae[3]) * 1.83e-6
                + Sin(an[2] - an[3] * 2.0 + ae[2]) * 1.4791e-4
                + Sin(an[2] - an[3] * 2.0 + ae[1]) * -7.77e-6
                + Sin(an[1] - an[2]) * 9.776e-5
                + Sin(an[1] * 2.0 - an[2] * 2.0) * 7.313e-5
                + Sin(an[1] * 3.0 - an[2] * 3.0) * 3.471e-5
                + Sin(an[1] * 4.0 - an[2] * 4.0) * 1.889e-5
                - Sin(an[2] - an[3]) * 6.789e-5
                - Sin(an[2] * 2.0 - an[3] * 2.0) * 8.286e-5
                + Sin(an[2] * 3.0 - an[3] * 3.0) * -3.381e-5
                - Sin(an[2] * 4.0 - an[3] * 4.0) * 1.579e-5
                - Sin(an[2] - an[4]) * 1.021e-5
                - Sin(an[2] * 2.0 - an[4] * 2.0) * 1.708e-5
                + t * 1.51614811 + 2.28540169;
            elem[2 * 6 + 2] = Cos(ae[0]) * -2.1e-7
                              - Cos(ae[1]) * 2.2795e-4
                              + Cos(ae[2]) * .00390469
                              + Cos(ae[3]) * 3.0917e-4
                              + Cos(ae[4]) * 2.2192e-4
                              + Cos(an[1]) * 2.934e-5
                              + Cos(an[2]) * 2.62e-5
                              + Cos(-an[1] + an[2] * 2.0) * 5.119e-5
                              - Cos(an[1] * -2.0 + an[2] * 3.0) * 1.0386e-4
                              - Cos(an[1] * -3.0 + an[2] * 4.0) * 2.716e-5
                              + Cos(an[3]) * -1.622e-5
                              + Cos(-an[2] + an[3] * 2.0) * 5.4923e-4
                              + Cos(an[2] * -2.0 + an[3] * 3.0) * 3.47e-5
                              + Cos(an[2] * -3.0 + an[3] * 4.0) * 1.281e-5
                              + Cos(-an[2] + an[4] * 2.0) * 2.181e-5
                              + Cos(an[2]) * 4.625e-5;
            elem[2 * 6 + 3] = Sin(ae[0]) * -2.1e-7
                              - Sin(ae[1]) * 2.2795e-4
                              + Sin(ae[2]) * .00390469
                              + Sin(ae[3]) * 3.0917e-4
                              + Sin(ae[4]) * 2.2192e-4
                              + Sin(an[1]) * 2.934e-5
                              + Sin(an[2]) * 2.62e-5
                              + Sin(-an[1] + an[2] * 2.0) * 5.119e-5
                              - Sin(an[1] * -2.0 + an[2] * 3.0) * 1.0386e-4
                              - Sin(an[1] * -3.0 + an[2] * 4.0) * 2.716e-5
                              + Sin(an[3]) * -1.622e-5
                              + Sin(-an[2] + an[3] * 2.0) * 5.4923e-4
                              + Sin(an[2] * -2.0 + an[3] * 3.0) * 3.47e-5
                              + Sin(an[2] * -3.0 + an[3] * 4.0) * 1.281e-5
                              + Sin(-an[2] + an[4] * 2.0) * 2.181e-5
                              + Sin(an[2]) * 4.625e-5;
            elem[2 * 6 + 4] = Cos(ai[0]) * -1.086e-5
                              - Cos(ai[1]) * 8.151e-5
                              + Cos(ai[2]) * .00111336
                              + Cos(ai[3]) * 3.5014e-4
                              + Cos(ai[4]) * 1.065e-4;
            elem[2 * 6 + 5] = Sin(ai[0]) * -1.086e-5
                              - Sin(ai[1]) * 8.151e-5
                              + Sin(ai[2]) * .00111336
                              + Sin(ai[3]) * 3.5014e-4
                              + Sin(ai[4]) * 1.065e-4;
            elem[3 * 6 + 0] = .72166316
                              - Cos(an[2] - an[3] * 2.0 + ae[2]) * 2.64e-6
                              - Cos(an[3] * 2.0 - an[4] * 3.0 + ae[4]) * 2.16e-6
                              + Cos(an[3] * 2.0 - an[4] * 3.0 + ae[3]) * 6.45e-6
                              - Cos(an[3] * 2.0 - an[4] * 3.0 + ae[2]) * 1.11e-6
                              + Cos(an[1] - an[3]) * -6.223e-5
                              - Cos(an[2] - an[3]) * 5.613e-5
                              - Cos(an[3] - an[4]) * 3.994e-5
                              - Cos(an[3] * 2.0 - an[4] * 2.0) * 9.185e-5
                              - Cos(an[3] * 3.0 - an[4] * 3.0) * 5.831e-5
                              - Cos(an[3] * 4.0 - an[4] * 4.0) * 3.86e-5
                              - Cos(an[3] * 5.0 - an[4] * 5.0) * 2.618e-5
                              - Cos(an[3] * 6.0 - an[4] * 6.0) * 1.806e-5;
            elem[3 * 6 + 1] =
                Sin(an[2] - an[3] * 4.0 + an[4] * 3.0) * 2.061e-5
                - Sin(an[2] - an[3] * 2.0 + ae[4]) * 2.07e-6
                - Sin(an[2] - an[3] * 2.0 + ae[3]) * 2.88e-6
                - Sin(an[2] - an[3] * 2.0 + ae[2]) * 4.079e-5
                + Sin(an[2] - an[3] * 2.0 + ae[1]) * 2.11e-6
                - Sin(an[3] * 2.0 - an[4] * 3.0 + ae[4]) * 5.183e-5
                + Sin(an[3] * 2.0 - an[4] * 3.0 + ae[3]) * 1.5987e-4
                + Sin(an[3] * 2.0 - an[4] * 3.0 + ae[2]) * -3.505e-5
                - Sin(an[3] * 3.0 - an[4] * 4.0 + ae[4]) * 1.56e-6
                + Sin(an[1] - an[3]) * 4.054e-5
                + Sin(an[2] - an[3]) * 4.617e-5
                - Sin(an[3] - an[4]) * 3.1776e-4
                - Sin(an[3] * 2.0 - an[4] * 2.0) * 3.0559e-4
                - Sin(an[3] * 3.0 - an[4] * 3.0) * 1.4836e-4
                - Sin(an[3] * 4.0 - an[4] * 4.0) * 8.292e-5
                + Sin(an[3] * 5.0 - an[4] * 5.0) * -4.998e-5
                - Sin(an[3] * 6.0 - an[4] * 6.0) * 3.156e-5
                - Sin(an[3] * 7.0 - an[4] * 7.0) * 2.056e-5
                - Sin(an[3] * 8.0 - an[4] * 8.0) * 1.369e-5
                + t * .72171851 + .85635879;
            elem[3 * 6 + 2] = Cos(ae[0]) * -2e-8
                              - Cos(ae[1]) * 1.29e-6
                              - Cos(ae[2]) * 3.2451e-4
                              + Cos(ae[3]) * 9.3281e-4
                              + Cos(ae[4]) * .00112089
                              + Cos(an[1]) * 3.386e-5
                              + Cos(an[3]) * 1.746e-5
                              + Cos(-an[1] + an[3] * 2.0) * 1.658e-5
                              + Cos(an[2]) * 2.889e-5
                              - Cos(-an[2] + an[3] * 2.0) * 3.586e-5
                              + Cos(an[3]) * -1.786e-5
                              - Cos(an[4]) * 3.21e-5
                              - Cos(-an[3] + an[4] * 2.0) * 1.7783e-4
                              + Cos(an[3] * -2.0 + an[4] * 3.0) * 7.9343e-4
                              + Cos(an[3] * -3.0 + an[4] * 4.0) * 9.948e-5
                              + Cos(an[3] * -4.0 + an[4] * 5.0) * 4.483e-5
                              + Cos(an[3] * -5.0 + an[4] * 6.0) * 2.513e-5
                              + Cos(an[3] * -6.0 + an[4] * 7.0) * 1.543e-5;
            elem[3 * 6 + 3] = Sin(ae[0]) * -2e-8
                              - Sin(ae[1]) * 1.29e-6
                              - Sin(ae[2]) * 3.2451e-4
                              + Sin(ae[3]) * 9.3281e-4
                              + Sin(ae[4]) * .00112089
                              + Sin(an[1]) * 3.386e-5
                              + Sin(an[3]) * 1.746e-5
                              + Sin(-an[1] + an[3] * 2.0) * 1.658e-5
                              + Sin(an[2]) * 2.889e-5
                              - Sin(-an[2] + an[3] * 2.0) * 3.586e-5
                              + Sin(an[3]) * -1.786e-5
                              - Sin(an[4]) * 3.21e-5
                              - Sin(-an[3] + an[4] * 2.0) * 1.7783e-4
                              + Sin(an[3] * -2.0 + an[4] * 3.0) * 7.9343e-4
                              + Sin(an[3] * -3.0 + an[4] * 4.0) * 9.948e-5
                              + Sin(an[3] * -4.0 + an[4] * 5.0) * 4.483e-5
                              + Sin(an[3] * -5.0 + an[4] * 6.0) * 2.513e-5
                              + Sin(an[3] * -6.0 + an[4] * 7.0) * 1.543e-5;
            elem[3 * 6 + 4] = Cos(ai[0]) * -1.43e-6
                              - Cos(ai[1]) * 1.06e-6
                              - Cos(ai[2]) * 1.4013e-4
                              + Cos(ai[3]) * 6.8572e-4
                              + Cos(ai[4]) * 3.7832e-4;
            elem[3 * 6 + 5] = Sin(ai[0]) * -1.43e-6
                              - Sin(ai[1]) * 1.06e-6
                              - Sin(ai[2]) * 1.4013e-4
                              + Sin(ai[3]) * 6.8572e-4
                              + Sin(ai[4]) * 3.7832e-4;
            elem[4 * 6 + 0] = .46658054
                              + Cos(an[3] * 2.0 - an[4] * 3.0 + ae[4]) * 2.08e-6
                              - Cos(an[3] * 2.0 - an[4] * 3.0 + ae[3]) * 6.22e-6
                              + Cos(an[3] * 2.0 - an[4] * 3.0 + ae[2]) * 1.07e-6
                              - Cos(an[1] - an[4]) * 4.31e-5
                              + Cos(an[2] - an[4]) * -3.894e-5
                              - Cos(an[3] - an[4]) * 8.011e-5
                              + Cos(an[3] * 2.0 - an[4] * 2.0) * 5.906e-5
                              + Cos(an[3] * 3.0 - an[4] * 3.0) * 3.749e-5
                              + Cos(an[3] * 4.0 - an[4] * 4.0) * 2.482e-5
                              + Cos(an[3] * 5.0 - an[4] * 5.0) * 1.684e-5;
            elem[4 * 6 + 1] =
                -Sin(an[2] - an[3] * 4.0 + an[4] * 3.0) * 7.82e-6
                + Sin(an[3] * 2.0 - an[4] * 3.0 + ae[4]) * 5.129e-5
                - Sin(an[3] * 2.0 - an[4] * 3.0 + ae[3]) * 1.5824e-4
                + Sin(an[3] * 2.0 - an[4] * 3.0 + ae[2]) * 3.451e-5
                + Sin(an[1] - an[4]) * 4.751e-5
                + Sin(an[2] - an[4]) * 3.896e-5
                + Sin(an[3] - an[4]) * 3.5973e-4
                + Sin(an[3] * 2.0 - an[4] * 2.0) * 2.8278e-4
                + Sin(an[3] * 3.0 - an[4] * 3.0) * 1.386e-4
                + Sin(an[3] * 4.0 - an[4] * 4.0) * 7.803e-5
                + Sin(an[3] * 5.0 - an[4] * 5.0) * 4.729e-5
                + Sin(an[3] * 6.0 - an[4] * 6.0) * 3e-5
                + Sin(an[3] * 7.0 - an[4] * 7.0) * 1.962e-5
                + Sin(an[3] * 8.0 - an[4] * 8.0) * 1.311e-5
                + t * .46669212 - .9155918;
            elem[4 * 6 + 2] = Cos(ae[1]) * -3.5e-7
                              + Cos(ae[2]) * 7.453e-5
                              - Cos(ae[3]) * 7.5868e-4
                              + Cos(ae[4]) * .00139734
                              + Cos(an[1]) * 3.9e-5
                              + Cos(-an[1] + an[4] * 2.0) * 1.766e-5
                              + Cos(an[2]) * 3.242e-5
                              + Cos(an[3]) * 7.975e-5
                              + Cos(an[4]) * 7.566e-5
                              + Cos(-an[3] + an[4] * 2.0) * 1.3404e-4
                              - Cos(an[3] * -2.0 + an[4] * 3.0) * 9.8726e-4
                              - Cos(an[3] * -3.0 + an[4] * 4.0) * 1.2609e-4
                              - Cos(an[3] * -4.0 + an[4] * 5.0) * 5.742e-5
                              - Cos(an[3] * -5.0 + an[4] * 6.0) * 3.241e-5
                              - Cos(an[3] * -6.0 + an[4] * 7.0) * 1.999e-5
                              - Cos(an[3] * -7.0 + an[4] * 8.0) * 1.294e-5;
            elem[4 * 6 + 3] = Sin(ae[1]) * -3.5e-7
                              + Sin(ae[2]) * 7.453e-5
                              - Sin(ae[3]) * 7.5868e-4
                              + Sin(ae[4]) * .00139734
                              + Sin(an[1]) * 3.9e-5
                              + Sin(-an[1] + an[4] * 2.0) * 1.766e-5
                              + Sin(an[2]) * 3.242e-5
                              + Sin(an[3]) * 7.975e-5
                              + Sin(an[4]) * 7.566e-5
                              + Sin(-an[3] + an[4] * 2.0) * 1.3404e-4
                              - Sin(an[3] * -2.0 + an[4] * 3.0) * 9.8726e-4
                              - Sin(an[3] * -3.0 + an[4] * 4.0) * 1.2609e-4
                              - Sin(an[3] * -4.0 + an[4] * 5.0) * 5.742e-5
                              - Sin(an[3] * -5.0 + an[4] * 6.0) * 3.241e-5
                              - Sin(an[3] * -6.0 + an[4] * 7.0) * 1.999e-5
                              - Sin(an[3] * -7.0 + an[4] * 8.0) * 1.294e-5;
            elem[4 * 6 + 4] = Cos(ai[0]) * -4.4e-7
                              - Cos(ai[1]) * 3.1e-7
                              + Cos(ai[2]) * 3.689e-5
                              - Cos(ai[3]) * 5.9633e-4
                              + Cos(ai[4]) * 4.5169e-4;
            elem[4 * 6 + 5] = Sin(ai[0]) * -4.4e-7
                              - Sin(ai[1]) * 3.1e-7
                              + Sin(ai[2]) * 3.689e-5
                              - Sin(ai[3]) * 5.9633e-4
                              + Sin(ai[4]) * 4.5169e-4;

            // Get rectangular (Uranus-reffered) coordinates of moons
            CrdsRectangular[] gust86Rect = new CrdsRectangular[MOONS_COUNT];

            for (int body = 0; body < MOONS_COUNT; body++)
            {
                double[] elem_body = new double[6];
                for (int i = 0; i < 6; i++)
                {
                    elem_body[i] = elem[body * 6 + i];
                }

                double[] x = new double[3];
                EllipticToRectangularN(gust86_rmu[body], elem_body, ref x);

                gust86Rect[body]   = new CrdsRectangular();
                gust86Rect[body].X = GUST86toVsop87[0] * x[0] + GUST86toVsop87[1] * x[1] + GUST86toVsop87[2] * x[2];
                gust86Rect[body].Y = GUST86toVsop87[3] * x[0] + GUST86toVsop87[4] * x[1] + GUST86toVsop87[5] * x[2];
                gust86Rect[body].Z = GUST86toVsop87[6] * x[0] + GUST86toVsop87[7] * x[1] + GUST86toVsop87[8] * x[2];
            }

            for (int i = 0; i < MOONS_COUNT; i++)
            {
                moons[i] = new CrdsRectangular(
                    rectUranus.X + gust86Rect[i].X,
                    rectUranus.Y + gust86Rect[i].Y,
                    rectUranus.Z + gust86Rect[i].Z
                    );
            }

            return(moons);
        }
예제 #2
0
        /// <summary>
        /// Calculates appearance of Saturn rings
        /// </summary>
        /// <param name="jd">Julian date to calculate for</param>
        /// <param name="saturn">Heliocentric coordinates of Saturn.</param>
        /// <param name="earth">Heliocentric coordinates of Earth.</param>
        /// <param name="epsilon">True obliquity of ecliptic.</param>
        /// <returns>
        /// Appearance data for Saturn rings.
        /// </returns>
        /// <remarks>
        /// Method is taken from AA(II), chapter 45.
        /// </remarks>
        public static RingsAppearance SaturnRings(double jd, CrdsHeliocentrical saturn, CrdsHeliocentrical earth, double epsilon)
        {
            RingsAppearance rings = new RingsAppearance();
            double          T     = (jd - 2451545.0) / 36525.0;
            double          T2    = T * T;

            double i     = 28.075216 - 0.012998 * T + 0.000004 * T2;
            double Omega = 169.508470 + 1.394681 * T + 0.000412 * T2;

            double lambda0 = Omega - 90;
            double beta0   = 90 - i;

            i     = Angle.ToRadians(i);
            Omega = Angle.ToRadians(Omega);

            CrdsEcliptical ecl = saturn.ToRectangular(earth).ToEcliptical();

            double beta   = Angle.ToRadians(ecl.Beta);
            double lambda = Angle.ToRadians(ecl.Lambda);

            rings.B = Angle.ToDegrees(Math.Asin(Math.Sin(i) * Math.Cos(beta) * Math.Sin(lambda - Omega) - Math.Cos(i) * Math.Sin(beta)));
            rings.a = 375.35 / ecl.Distance;
            rings.b = rings.a * Math.Sin(Math.Abs(Angle.ToRadians(rings.B)));

            double N  = 113.6655 + 0.8771 * T;
            double l_ = Angle.ToRadians(saturn.L - 0.01759 / saturn.R);
            double b_ = Angle.ToRadians(saturn.B - 0.000764 * Math.Cos(Angle.ToRadians(saturn.L - N)) / saturn.R);

            double U1 = Angle.ToDegrees(Math.Atan((Math.Sin(i) * Math.Sin(b_) + Math.Cos(i) * Math.Cos(b_) * Math.Sin(l_ - Omega)) / (Math.Cos(b_) * Math.Cos(l_ - Omega))));
            double U2 = Angle.ToDegrees(Math.Atan((Math.Sin(i) * Math.Sin(beta) + Math.Cos(i) * Math.Cos(beta) * Math.Sin(lambda - Omega)) / (Math.Cos(beta) * Math.Cos(lambda - Omega))));

            rings.DeltaU = Math.Abs(U1 - U2);

            CrdsEcliptical eclPole = new CrdsEcliptical();

            eclPole.Set(lambda0, beta0);

            CrdsEquatorial eq     = ecl.ToEquatorial(epsilon);
            CrdsEquatorial eqPole = eclPole.ToEquatorial(epsilon);

            double alpha  = Angle.ToRadians(eq.Alpha);
            double delta  = Angle.ToRadians(eq.Delta);
            double alpha0 = Angle.ToRadians(eqPole.Alpha);
            double delta0 = Angle.ToRadians(eqPole.Delta);

            double y = Math.Cos(delta0) * Math.Sin(alpha0 - alpha);
            double x = Math.Sin(delta0) * Math.Cos(delta) - Math.Cos(delta0) * Math.Sin(delta) * Math.Cos(alpha0 - alpha);

            rings.P = Angle.ToDegrees(Math.Atan2(y, x));

            return(rings);
        }
예제 #3
0
        public static CrdsRectangular[] Positions(double jd, CrdsHeliocentrical earth, CrdsHeliocentrical saturn)
        {
            // p.324

            var e0 = saturn.ToRectangular(earth).ToEcliptical();

            // Convert coordinates to B1950 epoch = 2433282.4235;
            e0 = ConvertCoordinatesToEquinox(jd, Date.EPOCH_B1950, e0);

            double t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11;

            t1  = jd - 2411093.0;
            t2  = t1 / 365.25;
            t3  = (jd - 2433282.423) / 365.25 + 1950.0;
            t4  = jd - 2411368.0;
            t5  = t4 / 365.25;
            t6  = jd - 2415020.0;
            t7  = t6 / 36525.0;
            t8  = t6 / 365.25;
            t9  = (jd - 2442000.5) / 365.25;
            t10 = jd - 2409786.0;
            t11 = t10 / 36525.0;

            double[] W = new double[9];

            W[0] = 5.095 * (t3 - 1866.39);
            W[1] = 74.4 + 32.39 * t2;
            W[2] = 134.3 + 92.62 * t2;
            W[3] = 32.0 - 0.5118 * t5;
            W[4] = 276.59 + 0.5118 * t5;
            W[5] = 267.2635 + 1222.1136 * t7;
            W[6] = 175.4762 + 1221.5515 * t7;
            W[7] = 2.4891 + 0.002435 * t7;
            W[8] = 113.35 - 0.2597 * t7;

            double s1 = Sin(ToRadians(28.0817));
            double c1 = Cos(ToRadians(28.0817));
            double s2 = Sin(ToRadians(168.8112));
            double c2 = Cos(ToRadians(168.8112));
            double e1 = 0.05589 - 0.000346 * t7;

            double[] lambda = new double[9];
            double[] r      = new double[9];
            double[] gamma  = new double[9];
            double[] OMEGA  = new double[9];

            // MIMAS (I)
            {
                double L = 127.64 + 381.994497 * t1 - 43.57 * Sin(ToRadians(W[0])) - 0.720 * Sin(ToRadians(3 * W[0])) - 0.02144 * Sin(ToRadians(5 * W[0]));
                double p = 106.1 + 365.549 * t2;
                double M = L - p;
                double C = 2.18287 * Sin(ToRadians(M)) + 0.025988 * Sin(ToRadians(2 * M)) + 0.00043 * Sin(ToRadians(3 * M));
                lambda[1] = L + C;
                r[1]      = 3.06879 / (1 + 0.01905 * Cos(ToRadians(M + C)));
                gamma[1]  = 1.563;
                OMEGA[1]  = 54.5 - 365.072 * t2;
            }

            // ENCELADUS (II)
            {
                double L = 200.317 + 262.7319002 * t1 + 0.25667 * Sin(ToRadians(W[1])) + 0.20883 * Sin(ToRadians(W[2]));
                double p = 309.107 + 123.44121 * t2;
                double M = L - p;
                double C = 0.55577 * Sin(ToRadians(M)) + 0.00168 * Sin(ToRadians(2 * M));
                lambda[2] = L + C;
                r[2]      = 3.94118 / (1 + 0.00485 * Cos(ToRadians(M + C)));
                gamma[2]  = 0.0262;
                OMEGA[2]  = 348.0 - 151.95 * t2;
            }

            // TETHYS (III)
            {
                lambda[3] = 285.306 + 190.69791226 * t1 + 2.063 * Sin(ToRadians(W[0])) + 0.03409 * Sin(ToRadians(3 * W[0])) + 0.001015 * Sin(ToRadians(5 * W[0]));
                r[3]      = 4.880998;
                gamma[3]  = 1.0976;
                OMEGA[3]  = 111.33 - 72.2441 * t2;
            }

            // DIONE (IV)
            {
                double L = 254.712 + 131.53493193 * t1 - 0.0215 * Sin(ToRadians(W[1])) - 0.01733 * Sin(ToRadians(W[2]));
                double p = 174.8 + 30.820 * t2;
                double M = L - p;
                double C = 0.24717 * Sin(ToRadians(M)) + 0.00033 * Sin(ToRadians(2 * M));
                lambda[4] = L + C;
                r[4]      = 6.24871 / (1 + 0.002157 * Cos(ToRadians(M + C)));
                gamma[4]  = 0.0139;
                OMEGA[4]  = 232.0 - 30.27 * t2;
            }

            // RHEA (V)
            {
                double p_      = 342.7 + 10.057 * t2;
                double a1      = 0.000265 * Sin(ToRadians(p_)) + 0.001 * Sin(ToRadians(W[4]));
                double a2      = 0.000265 * Cos(ToRadians(p_)) + 0.001 * Cos(ToRadians(W[4]));
                double e       = Sqrt(a1 * a1 + a2 * a2);
                double p       = ToDegrees(Atan2(a1, a2));
                double N       = 345.0 - 10.057 * t2;
                double lambda_ = 359.244 + 79.69004720 * t1 + 0.086754 * Sin(ToRadians(N));
                double i       = 28.0362 + 0.346898 * Cos(ToRadians(N)) + 0.01930 * Cos(ToRadians(W[3]));
                double Omega   = 168.8034 + 0.736936 * Sin(ToRadians(N)) + 0.041 * Sin(ToRadians(W[3]));
                double a       = 8.725924;
                Subroutine(e, lambda_, p, Omega, i, a, out lambda[5], out gamma[5], out OMEGA[5], out r[5]);
            }

            // TITAN (VI)
            {
                double L      = 261.1582 + 22.57697855 * t4 + 0.074025 * Sin(ToRadians(W[3]));
                double i_     = 27.45141 + 0.295999 * Cos(ToRadians(W[3]));
                double OMEGA_ = 168.66925 + 0.628808 * Sin(ToRadians(W[3]));
                double a1     = Sin(ToRadians(W[7])) * Sin(ToRadians(OMEGA_ - W[8]));
                double a2     = Cos(ToRadians(W[7])) * Sin(ToRadians(i_)) - Sin(ToRadians(W[7])) * Cos(ToRadians(i_)) * Cos(ToRadians(OMEGA_ - W[8]));
                double g0     = 102.8623;
                double psi    = ToDegrees(Atan2(a1, a2));
                double s      = Sqrt(a1 * a1 + a2 * a2);
                double g      = W[4] - OMEGA_ - psi;
                double w_     = 0;
                for (int j = 0; j < 3; j++)
                {
                    w_ = W[4] + 0.37515 * (Sin((ToRadians(2 * g))) - Sin(ToRadians(2 * g0)));
                    g  = w_ - OMEGA_ - psi;
                }
                double e_      = 0.029092 + 0.00019048 * (Cos(ToRadians(2 * g)) - Cos(ToRadians(2 * g0)));
                double q       = 2 * (W[5] - w_);
                double b1      = Sin(ToRadians(i_)) * Sin(ToRadians(OMEGA_ - W[8]));
                double b2      = Cos(ToRadians(W[7])) * Sin(ToRadians(i_)) * Cos(ToRadians(OMEGA_ - W[8])) - Sin(ToRadians(W[7])) * Cos(ToRadians(i_));
                double theta   = ToDegrees(Atan2(b1, b2)) + W[8];
                double e       = e_ + 0.002778797 * e_ * Cos(ToRadians(q));
                double p       = w_ + 0.159215 * Sin(ToRadians(q));
                double u       = 2 * W[5] - 2 * theta + psi;
                double h       = 0.9375 * e_ * e_ * Sin(ToRadians(q)) + 0.1875 * s * s * Sin(2 * ToRadians(W[5] - theta));
                double lambda_ = L - 0.254744 * (e1 * Sin(ToRadians(W[6])) + 0.75 * e1 * e1 * Sin(ToRadians(2 * W[6])) + h);
                double i       = i_ + 0.031843 * s * Cos(ToRadians(u));
                double Omega   = OMEGA_ + (0.031843 * s * Sin(ToRadians(u))) / Sin(ToRadians(i_));
                double a       = 20.216193;
                Subroutine(e, lambda_, p, Omega, i, a, out lambda[6], out gamma[6], out OMEGA[6], out r[6]);
            }

            // HYPERION (VII)
            {
                double eta    = 92.39 + 0.5621071 * t6;
                double zeta   = 148.19 - 19.18 * t8;
                double theta  = 184.8 - 35.41 * t9;
                double theta_ = theta - 7.5;
                double a_s    = 176.0 + 12.22 * t8;
                double b_s    = 8.0 + 24.44 * t8;
                double c_s    = b_s + 5.0;
                double w_     = 69.898 - 18.67088 * t8;
                double phi    = 2 * (w_ - W[5]);
                double chi    = 94.9 - 2.292 * t8;
                double a      = 24.50601 - 0.08686 * Cos(ToRadians(eta)) - 0.00166 * Cos(ToRadians(zeta + eta)) + 0.00175 * Cos(ToRadians(zeta - eta));
                double e      = 0.103458 - 0.004099 * Cos(ToRadians(eta)) - 0.000167 * Cos(ToRadians(zeta + eta))
                                + 0.000235 * Cos(ToRadians(zeta - eta)) + 0.02303 * Cos(ToRadians(zeta)) - 0.00212 * Cos(ToRadians(2 * zeta))
                                + 0.000151 * Cos(ToRadians(3 * zeta)) + 0.00013 * Cos(ToRadians(phi));
                double p = w_ + 0.15648 * Sin(ToRadians(chi)) - 0.4457 * Sin(ToRadians(eta)) - 0.2657 * Sin(ToRadians(zeta + eta))
                           - 0.3573 * Sin(ToRadians(zeta - eta)) - 12.872 * Sin(ToRadians(zeta)) + 1.668 * Sin(ToRadians(2 * zeta))
                           - 0.2419 * Sin(ToRadians(3 * zeta)) - 0.07 * Sin(ToRadians(phi));
                double lambda_ = 177.047 + 16.91993829 * t6 + 0.15648 * Sin(ToRadians(chi)) + 9.142 * Sin(ToRadians(eta))
                                 + 0.007 * Sin(ToRadians(2 * eta)) - 0.014 * Sin(ToRadians(3 * eta)) + 0.2275 * Sin(ToRadians(zeta + eta))
                                 + 0.2112 * Sin(ToRadians(zeta - eta)) - 0.26 * Sin(ToRadians(zeta)) - 0.0098 * Sin(ToRadians(2 * zeta))
                                 - 0.013 * Sin(ToRadians(a_s)) + 0.017 * Sin(ToRadians(b_s)) - 0.0303 * Sin(ToRadians(phi));
                double i     = 27.3347 + 0.643486 * Cos(ToRadians(chi)) + 0.315 * Cos(ToRadians(W[3])) + 0.018 * Cos(ToRadians(theta)) - 0.018 * Cos(ToRadians(c_s));
                double Omega = 168.6812 + 1.40136 * Cos(ToRadians(chi)) + 0.68599 * Sin(ToRadians(W[3]))
                               - 0.0392 * Sin(ToRadians(c_s)) + 0.0366 * Sin(ToRadians(theta_));
                Subroutine(e, lambda_, p, Omega, i, a, out lambda[7], out gamma[7], out OMEGA[7], out r[7]);
            }

            // IAPETUS (VIII)
            {
                double L      = 261.1582 + 22.57697855 * t4;
                double w__    = 91.796 + 0.562 * t7;
                double psi    = 4.367 - 0.195 * t7;
                double theta  = 146.819 - 3.198 * t7;
                double phi    = 60.470 + 1.521 * t7;
                double PHI    = 205.055 - 2.091 * t7;
                double e_     = 0.028298 + 0.001156 * t11;
                double w_0    = 352.91 + 11.71 * t11;
                double mu     = 76.3852 + 4.53795125 * t10;
                double i_     = 18.4602 - 0.9518 * t11 - 0.072 * t11 * t11 + 0.0054 * t11 * t11 * t11;
                double OMEGA_ = 143.198 - 3.919 * t11 + 0.116 * t11 * t11 + 0.008 * t11 * t11 * t11;
                double l      = mu - w_0;
                double g      = w_0 - OMEGA_ - psi;
                double g1     = w_0 - OMEGA_ - phi;
                double ls     = W[5] - w__;
                double gs     = w__ - theta;
                double lt     = L - W[4];
                double gt     = W[4] - PHI;
                double u1     = 2 * (l + g - ls - gs);
                double u2     = l + g1 - lt - gt;
                double u3     = l + 2 * (g - ls - gs);
                double u4     = lt + gt - g1;
                double u5     = 2 * (ls + gs);
                double a      = 58.935028 + 0.004638 * Cos(ToRadians(u1)) + 0.058222 * Cos(ToRadians(u2));
                double e      = e_ - 0.0014097 * Cos(ToRadians(g1 - gt)) + 0.0003733 * Cos(ToRadians(u5 - 2 * g))
                                + 0.0001180 * Cos(ToRadians(u3)) + 0.0002408 * Cos(ToRadians(l))
                                + 0.0003849 * Cos(ToRadians(l + u2)) + 0.0006190 * Cos(ToRadians(u4));
                double w = 0.08077 * Sin(ToRadians(g1 - gt)) + 0.02139 * Sin(ToRadians(u5 - 2 * g)) - 0.00676 * Sin(ToRadians(u3))
                           + 0.01380 * Sin(ToRadians(l)) + 0.01632 * Sin(ToRadians(l + u2)) + 0.03547 * Sin(ToRadians(u4));
                double p       = w_0 + w / e_;
                double lambda_ = mu - 0.04299 * Sin(ToRadians(u2)) - 0.00789 * Sin(ToRadians(u1)) - 0.06312 * Sin(ToRadians(ls))
                                 - 0.00295 * Sin(ToRadians(2 * ls)) - 0.02231 * Sin(ToRadians(u5)) + 0.00650 * Sin(ToRadians(u5 + psi));
                double i = i_ + 0.04204 * Cos(ToRadians(u5 + psi)) + 0.00235 * Cos(ToRadians(l + g1 + lt + gt + phi))
                           + 0.00360 * Cos(ToRadians(u2 + phi));
                double w_ = 0.04204 * Sin(ToRadians(u5 + psi)) + 0.00235 * Sin(ToRadians(l + g1 + lt + gt + phi))
                            + 0.00358 * Sin(ToRadians(u2 + phi));
                double Omega = OMEGA_ + w_ / Sin(ToRadians(u2 + phi));
                Subroutine(e, lambda_, p, Omega, i, a, out lambda[8], out gamma[8], out OMEGA[8], out r[8]);
            }

            double[] X = new double[10];
            double[] Y = new double[10];
            double[] Z = new double[10];

            for (int j = 1; j <= 8; j++)
            {
                double u = lambda[j] - OMEGA[j];
                double w = OMEGA[j] - 168.8112;
                X[j] = r[j] * (Cos(ToRadians(u)) * Cos(ToRadians(w)) - Sin(ToRadians(u)) * Cos(ToRadians(gamma[j])) * Sin(ToRadians(w)));
                Y[j] = r[j] * (Sin(ToRadians(u)) * Cos(ToRadians(w)) * Cos(ToRadians(gamma[j])) + Cos(ToRadians(u)) * Sin(ToRadians(w)));
                Z[j] = r[j] * Sin(ToRadians(u)) * Sin(ToRadians(gamma[j]));
            }
            X[9] = 0; Y[9] = 0; Z[9] = 1;

            double[] A4 = new double[10];
            double[] B4 = new double[10];
            double[] C4 = new double[10];

            for (int j = 1; j <= 9; j++)
            {
                // Rotation towards the plane of the ecliptic
                double A1 = X[j];
                double B1 = c1 * Y[j] - s1 * Z[j];
                double C1 = s1 * Y[j] + c1 * Z[j];
                // Rotation towards the vernal equinox
                double A2 = c2 * A1 - s2 * B1;
                double B2 = s2 * A1 + c2 * B1;
                double C2 = C1;

                double A3 = A2 * Sin(ToRadians(e0.Lambda)) - B2 * Cos(ToRadians(e0.Lambda));
                double B3 = A2 * Cos(ToRadians(e0.Lambda)) + B2 * Sin(ToRadians(e0.Lambda));
                double C3 = C2;

                A4[j] = A3;
                B4[j] = B3 * Cos(ToRadians(e0.Beta)) + C3 * Sin(ToRadians(e0.Beta));
                C4[j] = C3 * Cos(ToRadians(e0.Beta)) - B3 * Sin(ToRadians(e0.Beta));
            }

            double D = Atan2(A4[9], C4[9]);

            CrdsRectangular[] moons = new CrdsRectangular[8];

            double[] K = { 20947, 23715, 26382, 29876, 35313, 53800, 59222, 91820 };

            for (int j = 0; j < 8; j++)
            {
                moons[j]   = new CrdsRectangular();
                moons[j].X = A4[j + 1] * Cos(D) - C4[j + 1] * Sin(D);
                moons[j].Y = A4[j + 1] * Sin(D) + C4[j + 1] * Cos(D);
                moons[j].Z = B4[j + 1];

                // Light-time effect:
                moons[j].X += Abs(moons[j].Z) / K[j] * Sqrt(1 - Pow((moons[j].X / r[j + 1]), 2));

                // Perspective effect:
                moons[j].X *= (e0.Distance / (e0.Distance + moons[j].Z / 2475.0));
            }

            return(moons);
        }