Ejemplo n.º 1
0
        // ///////////////////////////////////////////////////////////////////////////
        // 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.getDate();
            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.getVel().X - eciSite.getVel().X,
                                          eci.getVel().Y - eciSite.getVel().Y,
                                          eci.getVel().Z - eciSite.getVel().Z);

            double x = eci.getPos().X - eciSite.getPos().X;
            double y = eci.getPos().Y - eciSite.getPos().Y;
            double z = eci.getPos().Z - eciSite.getPos().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(Lon);

            double sin_lat = Math.Sin(Lat);
            double cos_lat = Math.Cos(Lat);
            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;
        }
Ejemplo n.º 2
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;
        }