// ///////////////////////////////////////////////////////////////////////////
		// getLookAngle()
		// Return the topocentric (azimuth, elevation, etc.) coordinates for a target
		// object described by the input ECI coordinates.
		public CoordTopo getLookAngle(Eci eci)
		{
			// Calculate the ECI coordinates for this Site object at the time
			// of interest.
			Julian date    = eci.Date;
			Eci    eciSite = new Eci(m_geo, date);

			// The Site ECI units are km-based; ensure target ECI units are same
			if (!eci.UnitsAreKm())
				throw new Exception("ECI units must be kilometer-based");

			Vector vecRgRate = new Vector(eci.Velocity.X - eciSite.Velocity.X,
				eci.Velocity.Y - eciSite.Velocity.Y,
				eci.Velocity.Z - eciSite.Velocity.Z);

			double x = eci.Position.X - eciSite.Position.X;
			double y = eci.Position.Y - eciSite.Position.Y;
			double z = eci.Position.Z - eciSite.Position.Z;
			double w = Math.Sqrt(Globals.Sqr(x) + Globals.Sqr(y) + Globals.Sqr(z));

			Vector vecRange = new Vector(x, y, z, w);

			// The site's Local Mean Sidereal Time at the time of interest.
			double theta = date.toLMST(Longitude);

			double sin_lat   = Math.Sin(Latitude);
			double cos_lat   = Math.Cos(Latitude);
			double sin_theta = Math.Sin(theta);
			double cos_theta = Math.Cos(theta);

			double top_s = sin_lat * cos_theta * vecRange.X +
				sin_lat * sin_theta * vecRange.Y -
				cos_lat * vecRange.Z;
			double top_e = -sin_theta * vecRange.X +
				cos_theta * vecRange.Y;
			double top_z = cos_lat * cos_theta * vecRange.X +
				cos_lat * sin_theta * vecRange.Y +
				sin_lat * vecRange.Z;
			double az    = Math.Atan(-top_e / top_s);

			if (top_s > 0.0)
				az += Globals.PI;

			if (az < 0.0)
				az += 2.0 * Globals.PI;

			double el   = Math.Asin(top_z / vecRange.W);
			double rate = (vecRange.X * vecRgRate.X +
				vecRange.Y * vecRgRate.Y +
				vecRange.Z * vecRgRate.Z) / vecRange.W;

			CoordTopo topo = new CoordTopo(az,         // azimuth, radians
				el,         // elevation, radians
				vecRange.W, // range, km
				rate);      // rate, km / sec
#if WANT_ATMOSPHERIC_CORRECTION
      // Elevation correction for atmospheric refraction.
      // Reference:  Astronomical Algorithms by Jean Meeus, pp. 101-104
      // Note:  Correction is meaningless when apparent elevation is below horizon
      topo.m_El += Globals.Deg2Rad((1.02 /
                                    Math.Tan(Globals.Deg2Rad(Globals.Rad2Deg(el) + 10.3 /
                                    (Globals.Rad2Deg(el) + 5.11)))) / 60.0);
      if (topo.m_El < 0.0)
         topo.m_El = el;    // Reset to true elevation

      if (topo.m_El > (Globals.PI / 2))
         topo.m_El = (Globals.PI / 2);
#endif
			return topo;
		}
Example #2
0
 /// <summary>
 /// Creates a new instance of the class given ECI coordinates.
 /// </summary>
 /// <param name="eci">The ECI coordinates.</param>
 /// <param name="date">The Julian date.</param>
 public Geo(Eci eci, Julian date)
     : this(eci.Position, 
        (Globals.AcTan(eci.Position.Y, eci.Position.X) - date.ToGmst()) % Globals.TwoPi)
 {
 }
Example #3
0
 /// <summary>
 /// Creates a new instance of the class from ECI coordinates.
 /// </summary>
 /// <param name="eci">The ECI coordinates.</param>
 /// <param name="date">The Julian date.</param>
 public GeoTime(Eci eci, Julian date)
     : base(eci, date)
 {
     Date = date;
 }
Example #4
0
        private bool InitFromTime(DateTime utc)
        {
            utc = Globals.InsureUTC(utc);
            TimeSpan ts = utc - this.EpochUTC;
            double minutes = ts.TotalMinutes;
            Eci position = new Eci();
            try
            {
               position = this._orbit.getPosition(minutes);
            }
            catch (Exception)
            {
                return false;
            }

            this._lat = new Angle(position.toGeo().LatDeg, AngleUnits.DEGREES);
            this._lon = new Angle(position.toGeo().LonDeg, AngleUnits.DEGREES);
            this._alt = position.toGeo().Altitude;

            Vector velVec = position.getVel();
            this._velX = velVec.X;
            this._velY = velVec.Y;
            this._velZ = velVec.Z;
            this._vel = Math.Sqrt(Math.Pow(this._velX, 2.0) + Math.Pow(this._velY, 2.0) + Math.Pow(this._velZ, 2.0));

            CoordTopo ct = this.Site.getLookAngle(position);
            this._az = new Angle(ct.Azimuth);
            this._el = new Angle(ct.Elevation);
            this._rg = new Distance(ct.Range, DistanceUnits.KILOMETERS);
            this._rr = ct.RangeRate;

            this.MakeFootprint(utc);

            return true;
        }
Example #5
0
 /// <summary>
 /// Creates a new instance of the class from ECI coordinates.
 /// </summary>
 /// <param name="eci">The ECI coordinates.</param>
 public Eci(Eci eci)
 {
     Position = new Vector(eci.Position);
      Velocity = new Vector(eci.Velocity);
 }
Example #6
0
 /// <summary>
 /// Creates a new instance of the class from ECI-time coordinates.
 /// </summary>
 /// <param name="eci">The ECI coordinates.</param>
 /// <param name="date">The time associated with the ECI coordinates.</param>
 public EciTime(Eci eci, Julian date)
     : this(eci.Position, eci.Velocity, date)
 {
 }