Exemplo n.º 1
0
 /// <summary>
 /// 计算坐标
 /// </summary>
 /// <param name="timeFromReffer"></param>
 /// <param name="param"></param>
 /// <returns></returns>
 public static MotionState GetSatPos(double timeFromReffer, KeplerEphemerisParam param)
 {
     return(GetSatPos(
                timeFromReffer,
                param.Inclination,
                param.LongOfAscension,
                param.SqrtA * param.SqrtA,
                param.Eccentricity,
                param.ArgumentOfPerigee,
                param.MeanAnomaly));
 }
Exemplo n.º 2
0
        /// <summary>
        /// 计算开普勒根数
        /// </summary>
        /// <param name="pos"></param>
        /// <param name="velocity"></param>
        /// <returns></returns>
        public static KeplerEphemerisParam GetKeplerEphemerisParam(XYZ pos, XYZ velocity)
        {
            //2.6.1.1	计算轨道倾角i和升交点赤经Ω
            XYZ    hXyz = pos.Cross(velocity);
            double hLen = hXyz.Length;
            double r    = pos.Length;
            double vv   = velocity.Dot(velocity);

            //计算轨道倾角
            //double ABLen = Math.Sqrt(hXyz.X * hXyz.X + hXyz.Y * hXyz.Y);
            //double i = Math.Atan2(ABLen, hXyz.Z);
            double i = Math.Acos(hXyz.Z / hLen); //表示在Z轴上的投影,与上结果计算一致
            //double includedAngle = hXyz.GetIncludedAngle(new XYZ(0, 0, 1));//轨道倾角为两个平面法向量的夹角

            //计算升交点赤经
            double Ω = Math.Atan2(hXyz.X, -hXyz.Y);

            //2.6.1.2	计算轨道长半轴a,
            double a     = 1 / (2 / r - vv / GM);                   //由活力公式计算
            double sqrtA = Math.Sqrt(a);
            double n     = Math.Sqrt(GM) / (sqrtA * sqrtA * sqrtA); //平运动角速度n
            //离心率e和平近点交M
            double rdotv = pos.Dot(velocity);
            double eCosE = 1 - r / a;
            double eSinE = rdotv / Math.Sqrt(GM * a);
            double e     = Math.Sqrt(eSinE * eSinE + eCosE * eCosE); //离心率e
            double E     = Math.Atan2(eSinE, eCosE);                 //偏近点角E
            double M     = E - eSinE;                                //平近点角

            //2.6.1.3	计算近升角距ω
            XYZ    eXyz = velocity.Cross(hXyz) / GM - pos.UnitVector();
            double ww   = Math.Atan2(eXyz.Z, (eXyz.Y * Math.Sin(Ω) + eXyz.X * Math.Cos(Ω)) * Math.Sin(i));

            double u  = Math.Atan2(pos.Z, (pos.Y * Math.Sin(Ω) + pos.X * Math.Cos(Ω)) * Math.Sin(i));
            double ff = u - ww;//真近点角

            KeplerEphemerisParam param = new KeplerEphemerisParam
            {
                ArgumentOfPerigee = ww,
                Eccentricity      = e,
                Inclination       = i,
                LongOfAscension   = Ω,
                MeanAnomaly       = M,
                SqrtA             = sqrtA
            };

            return(param);
        }