Exemple #1
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;
        }
Exemple #2
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);
        }
        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;
            }
        }