public static CAALunarEclipseDetails CalculateLunar(double k)
    {
#if _DEBUG
        double intp          = 0;
        bool   bSolarEclipse = (GlobalMembersStdafx.modf(k, ref intp) == 0);
        Debug.Assert(!bSolarEclipse);
#endif

        double Mdash = 0;
        CAASolarEclipseDetails solarDetails = Calculate(k, ref Mdash);

        //What will be the return value
        CAALunarEclipseDetails details = new CAALunarEclipseDetails();
        details.bEclipse             = solarDetails.bEclipse;
        details.F                    = solarDetails.F;
        details.gamma                = solarDetails.gamma;
        details.TimeOfMaximumEclipse = solarDetails.TimeOfMaximumEclipse;
        details.u                    = solarDetails.u;

        if (details.bEclipse)
        {
            details.PenumbralRadii = 1.2848 + details.u;
            details.UmbralRadii    = 0.7403 - details.u;
            double fgamma = Math.Abs(details.gamma);
            details.PenumbralMagnitude = (1.5573 + details.u - fgamma) / 0.5450;
            details.UmbralMagnitude    = (1.0128 - details.u - fgamma) / 0.5450;

            double p = 1.0128 - details.u;
            double t = 0.4678 - details.u;
            double n = 0.5458 + 0.0400 * Math.Cos(Mdash);

            double gamma2 = details.gamma * details.gamma;
            double p2     = p * p;
            if (p2 >= gamma2)
            {
                details.PartialPhaseSemiDuration = 60 / n * Math.Sqrt(p2 - gamma2);
            }

            double t2 = t * t;
            if (t2 >= gamma2)
            {
                details.TotalPhaseSemiDuration = 60 / n * Math.Sqrt(t2 - gamma2);
            }

            double h  = 1.5573 + details.u;
            double h2 = h * h;
            if (h2 >= gamma2)
            {
                details.PartialPhasePenumbraSemiDuration = 60 / n * Math.Sqrt(h2 - gamma2);
            }
        }

        return(details);
    }
Ejemplo n.º 2
0
    public static CAALunarEclipseDetails CalculateLunar(double k)
    {
        #if _DEBUG
        double intp = 0;
        bool bSolarEclipse = (GlobalMembersStdafx.modf(k, ref intp) == 0);
        Debug.Assert(!bSolarEclipse);
        #endif

          double Mdash = 0;
        CAASolarEclipseDetails solarDetails = Calculate(k, ref Mdash);

        //What will be the return value
        CAALunarEclipseDetails details = new CAALunarEclipseDetails();
        details.bEclipse = solarDetails.bEclipse;
        details.F = solarDetails.F;
        details.gamma = solarDetails.gamma;
        details.TimeOfMaximumEclipse = solarDetails.TimeOfMaximumEclipse;
        details.u = solarDetails.u;

        if (details.bEclipse)
        {
          details.PenumbralRadii = 1.2848 + details.u;
          details.UmbralRadii = 0.7403 - details.u;
          double fgamma = Math.Abs(details.gamma);
          details.PenumbralMagnitude = (1.5573 + details.u - fgamma) / 0.5450;
          details.UmbralMagnitude = (1.0128 - details.u - fgamma) / 0.5450;

          double p = 1.0128 - details.u;
          double t = 0.4678 - details.u;
          double n = 0.5458 + 0.0400 *Math.Cos(Mdash);

          double gamma2 = details.gamma *details.gamma;
          double p2 = p *p;
          if (p2 >= gamma2)
        details.PartialPhaseSemiDuration = 60/n *Math.Sqrt(p2 - gamma2);

          double t2 = t *t;
          if (t2 >= gamma2)
        details.TotalPhaseSemiDuration = 60/n *Math.Sqrt(t2 - gamma2);

          double h = 1.5573 + details.u;
          double h2 = h *h;
          if (h2 >= gamma2)
        details.PartialPhasePenumbraSemiDuration = 60/n *Math.Sqrt(h2 - gamma2);
        }

        return details;
    }