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); }
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); }