コード例 #1
0
        private double ComputeAltitude(DateTime timeLocal, double RAHours, double DecDegrees, double latitudeDegrees, double longitudeDegrees)
        // Returns maximum altitude for object at RA/Dec between times dusk and dawn
        {
            Celestial.LatLon location = new Celestial.LatLon(Transform.DegreesToRadians(latitudeDegrees), Transform.DegreesToRadians(longitudeDegrees));
            Celestial.RADec  position = new Celestial.RADec(Transform.HoursToRadians(RAHours), Transform.DegreesToRadians(DecDegrees));
            double           maxAlt   = Transform.RadiansToDegrees(position.Altitude((position.HourAngle(timeLocal.ToUniversalTime(), location)), location));

            return(maxAlt);
        }
コード例 #2
0
        private double ComputeMaxAltitude(DateTime duskLocal, DateTime dawnLocal, double RAHours, double DecDegrees, double latitudeDegrees, double longitudeDegrees)
        // Returns maximum altitude for object at RA/Dec between times dusk and dawn
        {
            Celestial.LatLon location = new Celestial.LatLon(Transform.DegreesToRadians(latitudeDegrees), Transform.DegreesToRadians(longitudeDegrees));
            Celestial.RADec  position = new Celestial.RADec(Transform.HoursToRadians(RAHours), Transform.DegreesToRadians(DecDegrees));
            double           maxAlt   = Transform.RadiansToDegrees(AstroMath.DailyPosition.MaxAltitude(duskLocal.ToUniversalTime(), dawnLocal.ToUniversalTime(), position, location));

            return(maxAlt);
        }
コード例 #3
0
        public FormTargetTrack(DailyPosition dp, DailyPosition mp, string targetNameS)
        {
            InitializeComponent();
            targetName = targetNameS;

            tgtDateUTC   = dp.UTCdate;
            moonDateUTC  = mp.iRise;
            tgtUpH       = dp.Rising.ToLocalTime().Hour + (dp.Rising.ToLocalTime().Minute / 60.0);
            tgtDownH     = dp.Setting.ToLocalTime().Hour + (dp.Setting.ToLocalTime().Minute / 60.0);
            tgtDecD      = 90.0 - Transform.RadiansToDegrees(dp.Position.Dec);
            tgtPosition  = dp.Position;
            MoonPosition = mp.Position;
            obsLocation  = dp.Location;
            //Set lat
            obsLatD = Transform.RadiansToDegrees(dp.Location.Lat);

            //Moon look up stuff
            Celestial.RADec moonRADec = DailyPosition.MoonRaDec(Celestial.DateToJ2kC(dp.UTCdate));
            moonDecD = 90 - Transform.RadiansToDegrees(mp.Position.Dec);
            //Get the rise/set times from TSX
            sky6StarChart         tsxs = new sky6StarChart();
            sky6ObjectInformation tsxo = new sky6ObjectInformation();

            //Set the date/time to the local date for the target
            tsxs.SetDocumentProperty(Sk6DocumentProperty.sk6DocProp_JulianDateNow, Celestial.DateToJulian(tgtDateUTC));

            //Get some target stuff that's hard to calculate
            tsxs.Find(targetName);
            //wait a second
            System.Threading.Thread.Sleep(500);
            tsxo.Property(Sk6ObjectInformationProperty.sk6ObjInfoProp_TRANSIT_TIME);
            tgtTransitH = tsxo.ObjInfoPropOut;

            //Test stuff
            //double testmoontransitH = MoonPosition.TransitTime(tgtDateUTC, obsLocation);

            //Get some moon stuff now
            tsxs.SetDocumentProperty(Sk6DocumentProperty.sk6DocProp_JulianDateNow, Celestial.DateToJulian(moonDateUTC));
            tsxs.Find("Moon");
            //wait a second
            System.Threading.Thread.Sleep(500);
            tsxo.Property(Sk6ObjectInformationProperty.sk6ObjInfoProp_RISE_TIME);
            moonRiseH = tsxo.ObjInfoPropOut;
            tsxo.Property(Sk6ObjectInformationProperty.sk6ObjInfoProp_SET_TIME);
            moonSetH = tsxo.ObjInfoPropOut;
            //put the target back in
            tsxs.Find(targetName);

            tsxs = null;
            tsxo = null;
            return;
        }
コード例 #4
0
 public static DailyPosition[] MoonCycle(DailyPosition[] tgtspots, Celestial.LatLon obsLocation)
 {
     //Calculate an array of dailypositions of intervals when the moon is above the horizon
     DailyPosition[] moonedspots = new DailyPosition[tgtspots.Length];
     for (int dayidx = 0; dayidx < tgtspots.Length; dayidx++)
     {
         moonedspots[dayidx] = new DailyPosition(tgtspots[dayidx].Rising,
                                                 tgtspots[dayidx].Setting,
                                                 DailyPosition.MoonRaDec(Celestial.DateToJ2kC(tgtspots[dayidx].Rising)),
                                                 obsLocation,
                                                 0);
     }
     return(moonedspots);
 }
コード例 #5
0
        //public methods for managing the daily position functions
        //SunCycle generates a year of sunrise and sunset events
        //TargetCycle generates a year of target rise and set events (within sunrise-sunset)
        //MoonCycle generates a year of moon rise and set events (within target rise-set)
        //MoonPhase adds phase to target events
        //Moonclear adds moonless percentage to target events

        public static DailyPosition[] SunCycle(int dYear, Celestial.LatLon obsLocation)
        {
            //Calculates a year//s worth of sunrises and sunsets
            const double twilight = -18; //(degrees)

            DailyPosition[] sunspots = new DailyPosition[367];
            Celestial.RADec sunpos;

            DateTime ndate = new DateTime(dYear, 1, 1, 0, 0, 0); //create datetime object for jan 1, dYear
            DateTime udate = ndate.ToUniversalTime();            //convert to UTC
            DateTime sdate = udate.AddDays(-1);                  //back up one day to make sure Jan 1 is covered

            for (int dayidx = 0; dayidx < sunspots.Length; dayidx++)
            {
                DateTime tdate = sdate.AddDays(dayidx);
                sunpos           = DailyPosition.SunRADec(Celestial.DateToJ2kC(tdate));
                sunspots[dayidx] = new DailyPosition(tdate,
                                                     tdate.AddDays(1),
                                                     sunpos,
                                                     obsLocation,
                                                     twilight);
            }
            return(sunspots);
        }
コード例 #6
0
 public static DailyPosition[] TargetCycle(Celestial.RADec tgtRADec, DailyPosition[] sunspots, Celestial.LatLon obsLocation, double minalt)
 {
     //Calculate an array of dailypositions for dark periods of the given target (as an RA/Dec object)
     DailyPosition[] tgtspots = new DailyPosition[sunspots.Length];
     for (int dayidx = 0; dayidx < sunspots.Length - 1; dayidx++)
     {
         tgtspots[dayidx] = new DailyPosition(sunspots[dayidx].Setting,
                                              sunspots[dayidx + 1].Rising,
                                              tgtRADec,
                                              obsLocation,
                                              minalt);
     }
     tgtspots[tgtspots.Length - 1] = new DailyPosition();
     tgtspots[sunspots.Length - 1] = tgtspots[sunspots.Length - 2];
     return(tgtspots);
 }
コード例 #7
0
        private void GraphAltitude(DateTime gStart, DateTime gEnd, Celestial.RADec gRaDec, Celestial.LatLon gloc, string gName, Color gcolor)
        {
            //Graph the altitude change on 10 min intervals between gstart and gend for the position gRaDec for th observer at location gloc
            const int gPoints = 60;  //number of points to graph

            double   gInterval = (gEnd - gStart).TotalHours / gPoints;
            DateTime gTime     = gStart;

            while (gTime <= gEnd)
            {
                double haR      = gRaDec.HourAngle(gTime, gloc);
                double haH      = Transform.RadiansToHours(haR);
                double altR     = gRaDec.Altitude(haR, gloc);
                double altitude = Transform.RadiansToDegrees(altR);
                //
                double gst = Celestial.DateUTCToGST(gTime);
                double lst = Celestial.GSTToLST(gst, gloc.Lon);
                //

                if (altitude > 0)
                {
                    DateTime localTime = gTime.ToLocalTime();
                    AltitudeChart.Series[gName].Points.AddXY(localTime, altitude);
                }
                //If (TargetControl.IsMoonUp(ImageForecastForm.tgtdata, ImageForecastForm.moondata, gTime))) Then
                //    AltitudeChart.Series("AltitudePath").Points.
                gTime = gTime.AddHours(gInterval);
            }
            return;
        }
コード例 #8
0
        //Calendar generation methods

        private void GenerateCalendar()
        {
            sky6StarChart         tdoc = new sky6StarChart();
            sky6Utils             tute = new sky6Utils();
            sky6ObjectInformation tobj = new sky6ObjectInformation();

            double traH;      //target RA in hours
            double tdecD;     //target Dec in degrees
            double tlatD;     //Observer Latitude in degrees
            double tlongD;    //Observer Longitude in degrees

            try
            {
                tdoc.Find(TargetNameBox.Text);
            }
            catch (Exception ex)
            {
                //! found
                System.Windows.Forms.MessageBox.Show("Target not Found: " + TargetNameBox.Text + " " + ex.Message);
                TargetNameBox.Text = "";
                return;
            }
            //Reset the target name to whatever TSX found
            tobj.Index = 0;
            //tobj.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_NAME1);
            //TargetNameBox.Text = tobj.ObjInfoPropOut;
            enteringTargetState = false;
            //TargetNameBox.Text = TargetNameBox.Text.Replace(" ", "");

            int vj = tobj.Count;

            tobj.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_RA_2000);
            traH = tobj.ObjInfoPropOut;
            tobj.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_DEC_2000);
            tdecD = tobj.ObjInfoPropOut;
            tdoc.DocumentProperty(TheSky64Lib.Sk6DocumentProperty.sk6DocProp_Latitude);
            tlatD = tdoc.DocPropOut;
            tdoc.DocumentProperty(TheSky64Lib.Sk6DocumentProperty.sk6DocProp_Longitude);
            tlongD = tdoc.DocPropOut;
            tdoc.DocumentProperty(TheSky64Lib.Sk6DocumentProperty.sk6DocProp_Time_Zone);

            Celestial.RADec  tgtRADec    = new Celestial.RADec(Transform.HoursToRadians(traH), Transform.DegreesToRadians(tdecD));
            Celestial.LatLon obsLocation = new Celestial.LatLon(Transform.DegreesToRadians(tlatD), Transform.DegreesToRadians(-tlongD));

            sundata = TargetControl.SunCycle((int)CurrentYearPick.Value, obsLocation);
            tgtdata = TargetControl.TargetCycle(tgtRADec, sundata, obsLocation, (double)MinAltitudeBox.Value);
            tgtdata = TargetControl.MoonPhase(tgtdata);

            moondata = TargetControl.MoonCycle(tgtdata, obsLocation);
            //Update the target positions with the moonfree properties
            tgtdata = TargetControl.MoonClear(tgtdata, moondata);

            WriteTitle(TargetNameBox.Text, CurrentYearPick.Value.ToString());
            SpawnCalendar(tgtdata);
            if ((CurrentYearPick.Value % 4) != 0)
            {
                ClearLeapDay();
            }
            WriteMoonTip(moondata);
            Show();
            System.Windows.Forms.Application.DoEvents();
            return;
        }
コード例 #9
0
ファイル: AMDailyPosition.cs プロジェクト: rrskybox/AstroMath
        public DailyPosition(DateTime utcdateStart, DateTime utcdateEnd, Celestial.RADec tradec, Celestial.LatLon tlatlon, double tminAlt)
        {
            //utcdate as utc date (datetime)
            //tradec as position of tar{ get { (RADec)
            //tlatlon as location of observer (LatLon)
            //minAlt as minimum horizon (degrees):  negative is below horizon, positive is above horizon

            bool AboveToStart;
            bool rise;
            bool sett;

            t_state = VisibilityState.UpSome;

            t_moonfree  = 0;
            t_moonphase = 0;
            double thour;
            double utriseH = 0;
            double utsetH = 0;
            double yminus, yzero, yplus;

            Planar.QuadRoot solve;

            double   sinMinAltD = Transform.SinD(tminAlt); //Rise at h = 0 arcminutes
            DateTime udate      = utcdateStart;

            rise         = false;
            sett         = false;
            AboveToStart = false;
            thour        = 1;
            double altitude = tradec.Altitude(tradec.HourAngle(udate.AddHours(thour - 1), tlatlon), tlatlon);

            yminus = Math.Sin(tradec.Altitude(tradec.HourAngle(udate.AddHours(thour - 1), tlatlon), tlatlon)) - sinMinAltD;
            if (yminus > 0)
            {
                AboveToStart = true;
            }
            do
            {
                yzero = Math.Sin(tradec.Altitude(tradec.HourAngle(udate.AddHours(thour), tlatlon), tlatlon)) - sinMinAltD;
                yplus = Math.Sin(tradec.Altitude(tradec.HourAngle(udate.AddHours(thour + 1), tlatlon), tlatlon)) - sinMinAltD;

                solve = Planar.Quad(yminus, yzero, yplus);

                switch (solve.nz)
                {
                case 0:
                    break;

                case 1:
                    if (yminus < 0)
                    {
                        utriseH = thour + solve.zero1;
                        rise    = true;
                    }
                    else
                    {
                        utsetH = thour + solve.zero1;
                        sett   = true;
                    }
                    break;

                case 2:
                    if (solve.ye < 0)
                    {
                        utriseH = thour + solve.zero2;
                        utsetH  = thour + solve.zero1;
                    }
                    else
                    {
                        utriseH = thour + solve.zero1;
                        utsetH  = thour + solve.zero2;
                    }
                    rise = true;
                    sett = true;
                    break;
                }
                yminus = yplus;
                thour  = thour + 2;
            }while (!((thour == 25) || (rise && sett) || (utcdateStart.AddHours(thour + 1) > utcdateEnd)));

            t_utcdate  = utcdateStart;
            t_position = tradec;
            t_location = tlatlon;
            t_minalt   = tminAlt;

            i_rise = utcdateStart;
            i_set  = utcdateEnd;

            //Condition abovetostart and rise or not abovetostart and sett cannot occur (at least on paper)
            if (AboveToStart && (!(rise || sett)))
            {
                //Tar{ get { path is always above minimum altitude (e.g. horizon)
                t_state = VisibilityState.UpAlways;
                t_rise  = utcdateStart;
                t_set   = utcdateEnd;
            }
            else if ((!AboveToStart) && (rise && (!sett)))
            {
                //Tar{ get { path starts below) { ascends above minimum altitude (e.g. horizon)
                t_state = VisibilityState.Rises;
                t_rise  = udate.AddHours(utriseH);
                t_set   = utcdateEnd;
                //if (t_rise > t_set) {
                //    t_set = t_set.AddDays(1)
                //}
            }
            else if (AboveToStart && ((!rise) && sett))
            {
                //Tar{ get { path starts above) { decends below minimum altitude (e.g. horizon)
                t_state = VisibilityState.Falls;
                t_rise  = utcdateStart;
                t_set   = udate.AddHours(utsetH);
                if (t_rise > t_set)
                {
                    t_set = t_set.AddDays(1);
                }
            }
            else if (AboveToStart && (rise && sett))
            {
                //Tar{ get { path decends below) { rises above minimum altitude (e.g. horizon)
                //Choose the longer of the two rise/set intervals
                t_state = VisibilityState.DownSome;
                t_rise  = udate.AddHours(utriseH);
                t_set   = udate.AddHours(utsetH);
                if ((t_set - i_rise) > (i_set - t_rise))
                {
                    t_rise = i_rise;
                }
                else
                {
                    t_set = i_set;
                }
                //rise should be after set
                //if (t_rise < t_set) {
                //    t_rise += TimeSpan.FromDays(1)
                //}
            }
            else
            {
                if ((!AboveToStart) && (rise && sett))
                {
                    //Tar{ get { path rises above) { decends below minimum altitude (e.g. horizon)
                    //Save the
                    t_state = VisibilityState.UpSome;
                    t_rise  = udate.AddHours(utriseH);
                    t_set   = udate.AddHours(utsetH);
                    //set should be after rise
                    if (t_rise > t_set)
                    {
                        t_set += TimeSpan.FromDays(1);
                    }
                }
                else
                { //not above at all
                  //Tar{ get { path is always below minimum altitude (e.g. horizon)
                    t_state = VisibilityState.UpNever;
                    t_rise  = utcdateStart;
                    t_set   = utcdateStart;
                }

                //The rise time should not precede the beginning of the interval...
                if (t_rise < i_rise)
                {
                    t_rise = i_rise;
                }
                //The set time should not exceed the end of the interval...
                if (t_set > i_set)
                {
                    t_set = i_set;
                }
                return;
            }
        }