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