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