Ejemplo n.º 1
0
        private ASCOM.Astrometry.AstroUtils.AstroUtils.BodyInfo BodyAltitude(EventType TypeOfEvent, double JD, double Hour, double Latitude, double Longitude)
        {
            Object3   CelObject = new Object3();
            OnSurface onSurface = new OnSurface();
            CatEntry3 catEntry3 = new CatEntry3();
            SkyPos    Output    = new SkyPos();
            Observer  Location  = new Observer();

            ASCOM.Astrometry.AstroUtils.AstroUtils.BodyInfo bodyInfo = new ASCOM.Astrometry.AstroUtils.AstroUtils.BodyInfo();
            double JdHigh = JD + Hour / 24.0;
            double DeltaT = DeltatCode.DeltaTCalc(JD);

            switch (TypeOfEvent)
            {
            case EventType.SunRiseSunset:
            case EventType.CivilTwilight:
            case EventType.NauticalTwilight:
            case EventType.AmateurAstronomicalTwilight:
            case EventType.AstronomicalTwilight:
                CelObject.Name   = "Sun";
                CelObject.Number = Body.Sun;
                break;

            case EventType.MoonRiseMoonSet:
                CelObject.Name   = "Moon";
                CelObject.Number = Body.Moon;
                break;

            case EventType.MercuryRiseSet:
                CelObject.Name   = "Mercury";
                CelObject.Number = Body.Mercury;
                break;

            case EventType.VenusRiseSet:
                CelObject.Name   = "Venus";
                CelObject.Number = Body.Venus;
                break;

            case EventType.MarsRiseSet:
                CelObject.Name   = "Mars";
                CelObject.Number = Body.Mars;
                break;

            case EventType.JupiterRiseSet:
                CelObject.Name   = "Jupiter";
                CelObject.Number = Body.Jupiter;
                break;

            case EventType.SaturnRiseSet:
                CelObject.Name   = "Saturn";
                CelObject.Number = Body.Saturn;
                break;

            case EventType.UranusRiseSet:
                CelObject.Name   = "Uranus";
                CelObject.Number = Body.Uranus;
                break;

            case EventType.NeptuneRiseSet:
                CelObject.Name   = "Neptune";
                CelObject.Number = Body.Neptune;
                break;

            case EventType.PlutoRiseSet:
                CelObject.Name   = "Pluto";
                CelObject.Number = Body.Pluto;
                break;

            default:
                throw new InvalidValueException("TypeOfEvent", TypeOfEvent.ToString(), "Unknown type of event");
            }
            CelObject.Star  = catEntry3;
            CelObject.Type  = ASCOM.Astrometry.ObjectType.MajorPlanetSunOrMoon;
            Location.OnSurf = onSurface;
            Location.Where  = ObserverLocation.EarthGeoCenter;
            int num1 = (int)Nov31.Place(JdHigh + DeltaT * 1.15740740740741E-05, CelObject, Location, DeltaT, CoordSys.EquinoxOfDate, Accuracy.Full, ref Output);

            bodyInfo.Distance = Output.Dis * 149597870.691;
            double Gst = 0;

            Nov31.SiderealTime(JdHigh, 0.0, DeltaT, GstType.GreenwichApparentSiderealTime, ASCOM.Astrometry.Method.EquinoxBased, Accuracy.Full, ref Gst);
            double num2 = 15.0 * (Range(Gst + Longitude * (1.0 / 15.0), 0.0, true, 24.0, false) - Output.RA);

            bodyInfo.Altitude = Math.Asin(Math.Sin(Latitude * (Math.PI / 180.0)) * Math.Sin(Output.Dec * (Math.PI / 180.0)) + Math.Cos(Latitude * (Math.PI / 180.0)) * Math.Cos(Output.Dec * (Math.PI / 180.0)) * Math.Cos(num2 * (Math.PI / 180.0))) * (180.0 / Math.PI);
            switch (TypeOfEvent)
            {
            case EventType.MoonRiseMoonSet:
                bodyInfo.Radius = 1737.0;
                break;

            case EventType.MercuryRiseSet:
                bodyInfo.Radius = 2439.7;
                break;

            case EventType.VenusRiseSet:
                bodyInfo.Radius = 2439.7;
                break;

            case EventType.MarsRiseSet:
                bodyInfo.Radius = 3396.2;
                break;

            case EventType.JupiterRiseSet:
                bodyInfo.Radius = 69911.0;
                break;

            case EventType.SaturnRiseSet:
                bodyInfo.Radius = 6051.8;
                break;

            case EventType.UranusRiseSet:
                bodyInfo.Radius = 24973.0;
                break;

            case EventType.NeptuneRiseSet:
                bodyInfo.Radius = 24767.0;
                break;

            case EventType.PlutoRiseSet:
                bodyInfo.Radius = 1153.0;
                break;

            default:
                bodyInfo.Radius = 696342.0;
                break;
            }
            return(bodyInfo);
        }
Ejemplo n.º 2
0
        public ArrayList EventTimes(EventType TypeofEvent, int Day, int Month, int Year, double SiteLatitude, double SiteLongitude, double SiteTimeZone)
        {
            OnSurface     Location    = new OnSurface();
            ArrayList     arrayList   = new ArrayList();
            List <double> doubleList1 = new List <double>();
            List <double> doubleList2 = new List <double>();
            bool          flag1       = false;
            bool          flag2       = false;

            try
            {
                DateTime.Parse(Conversions.ToString(Month) + "/" + Conversions.ToString(Day) + "/" + Conversions.ToString(Year), (IFormatProvider)CultureInfo.InvariantCulture);
            }
            catch (FormatException ex)
            {
                //ProjectData.SetProjectError((Exception) ex);
                throw new InvalidValueException("Day or Month", Day.ToString() + " " + Month.ToString() + " " + Year.ToString(), "Day must not exceed the number of days in the month");
            }
            catch (Exception ex)
            {
                //ProjectData.SetProjectError(ex);
                TL.LogMessageCrLf("EventTimes", ex.ToString());
                throw;
            }
            double JD = Nov31.JulianDate(checked ((short)Year), checked ((short)Month), checked ((short)Day), 0.0) - SiteTimeZone / 24.0;

            Location.Latitude  = SiteLatitude;
            Location.Longitude = SiteLongitude;
            double num1  = Nov31.Refract(Location, RefractionOption.StandardRefraction, 90.0);
            double Hour  = 1.0;
            bool   flag3 = false;

            do
            {
                ASCOM.Astrometry.AstroUtils.AstroUtils.BodyInfo bodyInfo1 = BodyAltitude(TypeofEvent, JD, Hour - 1.0, SiteLatitude, SiteLongitude);
                ASCOM.Astrometry.AstroUtils.AstroUtils.BodyInfo bodyInfo2 = BodyAltitude(TypeofEvent, JD, Hour, SiteLatitude, SiteLongitude);
                ASCOM.Astrometry.AstroUtils.AstroUtils.BodyInfo bodyInfo3 = BodyAltitude(TypeofEvent, JD, Hour + 1.0, SiteLatitude, SiteLongitude);
                double num2;
                double num3;
                double num4;
                switch (TypeofEvent)
                {
                case EventType.SunRiseSunset:
                    num2 = bodyInfo1.Altitude - -5.0 / 6.0;
                    num3 = bodyInfo2.Altitude - -5.0 / 6.0;
                    num4 = bodyInfo3.Altitude - -5.0 / 6.0;
                    break;

                case EventType.MoonRiseMoonSet:
                    num2 = bodyInfo1.Altitude - 365432.481734439 / bodyInfo1.Distance + bodyInfo1.Radius * (180.0 / Math.PI) / bodyInfo1.Distance + num1;
                    num3 = bodyInfo2.Altitude - 365432.481734439 / bodyInfo2.Distance + bodyInfo2.Radius * (180.0 / Math.PI) / bodyInfo2.Distance + num1;
                    num4 = bodyInfo3.Altitude - 365432.481734439 / bodyInfo3.Distance + bodyInfo3.Radius * (180.0 / Math.PI) / bodyInfo3.Distance + num1;
                    break;

                case EventType.CivilTwilight:
                    num2 = bodyInfo1.Altitude - -6.0;
                    num3 = bodyInfo2.Altitude - -6.0;
                    num4 = bodyInfo3.Altitude - -6.0;
                    break;

                case EventType.NauticalTwilight:
                    num2 = bodyInfo1.Altitude - -12.0;
                    num3 = bodyInfo2.Altitude - -12.0;
                    num4 = bodyInfo3.Altitude - -12.0;
                    break;

                case EventType.AmateurAstronomicalTwilight:
                    num2 = bodyInfo1.Altitude - -15.0;
                    num3 = bodyInfo2.Altitude - -15.0;
                    num4 = bodyInfo3.Altitude - -15.0;
                    break;

                case EventType.AstronomicalTwilight:
                    num2 = bodyInfo1.Altitude - -18.0;
                    num3 = bodyInfo2.Altitude - -18.0;
                    num4 = bodyInfo3.Altitude - -18.0;
                    break;

                default:
                    num2 = bodyInfo1.Altitude + num1 + 180.0 / Math.PI * bodyInfo2.Radius / bodyInfo2.Distance;
                    num3 = bodyInfo2.Altitude + num1 + 180.0 / Math.PI * bodyInfo2.Radius / bodyInfo2.Distance;
                    num4 = bodyInfo3.Altitude + num1 + 180.0 / Math.PI * bodyInfo2.Radius / bodyInfo2.Distance;
                    break;
                }
                if (Hour == 1.0)
                {
                    flag3 = num2 >= 0.0;
                }
                double num5  = num3;
                double num6  = 0.5 * (num4 - num2);
                double num7  = 0.5 * (num4 + num2) - num3;
                double num8  = -num6 / (2.0 * num7);
                double num9  = (num7 * num8 + num6) * num8 + num5;
                double d     = num6 * num6 - 4.0 * num7 * num5;
                double num10 = double.NaN;
                double num11 = double.NaN;
                int    num12 = 0;
                if (d > 0.0)
                {
                    double num13 = 0.5 * Math.Sqrt(d) / Math.Abs(num7);
                    num10 = num8 - num13;
                    num11 = num8 + num13;
                    if (Math.Abs(num10) <= 1.0)
                    {
                        checked { ++num12; }
                    }
                    if (Math.Abs(num11) <= 1.0)
                    {
                        checked { ++num12; }
                    }
                    if (num10 < -1.0)
                    {
                        num10 = num11;
                    }
                }
                switch (num12)
                {
                case 1:
                    if (num2 < 0.0)
                    {
                        flag1 = true;
                        doubleList1.Add(Hour + num10);
                        break;
                    }
                    flag2 = true;
                    doubleList2.Add(Hour + num10);
                    break;

                case 2:
                    if (num2 < 0.0)
                    {
                        doubleList1.Add(Hour + num10);
                        doubleList2.Add(Hour + num11);
                    }
                    else
                    {
                        doubleList1.Add(Hour + num11);
                        doubleList2.Add(Hour + num10);
                    }
                    flag1 = true;
                    flag2 = true;
                    break;
                }
                Hour += 2.0;
            }while (!(flag1 & flag2 & Math.Abs(SiteLatitude) < 60.0 | Hour == 25.0));
            arrayList.Add((object)flag3);
            arrayList.Add((object)doubleList1.Count);
            arrayList.Add((object)doubleList2.Count);
            List <double> .Enumerator enumerator1 = default(List <double> .Enumerator);
            try
            {
                enumerator1 = doubleList1.GetEnumerator();
                while (enumerator1.MoveNext())
                {
                    double current = enumerator1.Current;
                    arrayList.Add((object)current);
                }
            }
            finally
            {
                enumerator1.Dispose();
            }
            List <double> .Enumerator enumerator2 = default(List <double> .Enumerator);
            try
            {
                enumerator2 = doubleList2.GetEnumerator();
                while (enumerator2.MoveNext())
                {
                    double current = enumerator2.Current;
                    arrayList.Add((object)current);
                }
            }
            finally
            {
                enumerator2.Dispose();
            }
            return(arrayList);
        }