?? sgp.cpp
字號:
#include <math.h>
#include "norad.h"
#include "norad_in.h"
#define ao params[0]
#define qo params[1]
#define xlo params[2]
#define d1o params[3]
#define d2o params[4]
#define d3o params[5]
#define d4o params[6]
#define omgdt params[7]
#define xnodot params[8]
#define c5 params[9]
#define c6 params[10]
void DLL_FUNC SGP_init( double *params, const tle_t *tle)
{
double c1, c2, c3, c4, r1, cosio, sinio, a1, d1, po, po2no;
c1 = ck2*1.5;
c2 = ck2/4.;
c3 = ck2/2.;
r1 = ae;
c4 = xj3*(r1*(r1*r1))/(ck2*4.);
cosio = cos(tle->xincl);
sinio = sin(tle->xincl);
a1 = pow( xke / tle->xno, two_thirds);
d1 = c1/a1/a1*(cosio*3.*cosio-1.)/pow( 1.-tle->eo*tle->eo, 1.5);
ao = a1*(1.-d1*.33333333333333331-d1*d1-d1*
1.654320987654321*d1*d1);
po = ao*(1.-tle->eo*tle->eo);
qo = ao*(1.-tle->eo);
xlo = tle->xmo+tle->omegao+tle->xnodeo;
d1o = c3*sinio*sinio;
d2o = c2*(cosio*7.*cosio-1.);
d3o = c1*cosio;
d4o = d3o*sinio;
po2no = tle->xno/(po*po);
omgdt = c1*po2no*(cosio*5.*cosio-1.);
xnodot = d3o*-2.*po2no;
c5 = c4*.5*sinio*(cosio*5.+3.)/(cosio+1.);
c6 = c4*sinio;
}
void DLL_FUNC SGP( const double tsince, const tle_t *tle, const double *params,
double *pos, double *vel)
{
double
temp, rdot, cosu, sinu, cos2u, sin2u, a, e,
p, rr, u, ecose, esine, omgas, cosik, xinck,
sinik, axnsl, aynsl,
sinuk, rvdot, cosuk, coseo1, sineo1, pl,
rk, uk, xl, su, ux, uy, uz, vx, vy, vz, pl2,
xnodek, cosnok, xnodes, el2, eo1, r1, sinnok,
xls, xmx, xmy, tem2, tem5;
int i;
/* Update for secular gravity and atmospheric drag */
a = tle->xno+(tle->xndt2o*2.+tle->xndd6o*3.*tsince)*tsince;
a = ao * pow( tle->xno / a, two_thirds);
e = e6a;
if (a > qo) e = 1.-qo/a;
p = a*(1.-e*e);
xnodes = tle->xnodeo+xnodot*tsince;
omgas = tle->omegao+omgdt*tsince;
r1 = xlo+(tle->xno+omgdt+xnodot+
(tle->xndt2o+tle->xndd6o*tsince)*tsince)*tsince;
xls = FMod2p(r1);
/* Long period periodics */
axnsl = e*cos(omgas);
aynsl = e*sin(omgas)-c6/p;
r1 = xls-c5/p*axnsl;
xl = FMod2p(r1);
/* Solve Kepler's equation */
r1 = xl-xnodes;
u = FMod2p(r1);
eo1 = u;
tem5 = 1.;
i = 0;
do
{
sineo1 = sin(eo1);
coseo1 = cos(eo1);
if (fabs(tem5) < e6a) break;
tem5 = 1.-coseo1*axnsl-sineo1*aynsl;
tem5 = (u-aynsl*coseo1+axnsl*sineo1-eo1)/tem5;
tem2 = fabs(tem5);
if (tem2 > 1.) tem5 = tem2/tem5;
eo1 += tem5;
}
while(i++ < 10);
/* Short period preliminary quantities */
ecose = axnsl*coseo1+aynsl*sineo1;
esine = axnsl*sineo1-aynsl*coseo1;
el2 = axnsl*axnsl+aynsl*aynsl;
pl = a*(1.-el2);
pl2 = pl*pl;
rr = a*(1.-ecose);
rdot = xke*sqrt(a)/rr*esine;
rvdot = xke*sqrt(pl)/rr;
temp = esine/(sqrt(1.-el2)+1.);
sinu = a/rr*(sineo1-aynsl-axnsl*temp);
cosu = a/rr*(coseo1-axnsl+aynsl*temp);
su = atan2(sinu, cosu);
/* Update for short periodics */
sin2u = (cosu+cosu)*sinu;
cos2u = 1.-2.*sinu*sinu;
rk = rr+d1o/pl*cos2u;
uk = su-d2o/pl2*sin2u;
xnodek = xnodes+d3o*sin2u/pl2;
xinck = tle->xincl+d4o/pl2*cos2u;
/* Orientation vectors */
sinuk = sin(uk);
cosuk = cos(uk);
sinnok = sin(xnodek);
cosnok = cos(xnodek);
sinik = sin(xinck);
cosik = cos(xinck);
xmx = -sinnok*cosik;
xmy = cosnok*cosik;
ux = xmx*sinuk+cosnok*cosuk;
uy = xmy*sinuk+sinnok*cosuk;
uz = sinik*sinuk;
vx = xmx*cosuk-cosnok*sinuk;
vy = xmy*cosuk-sinnok*sinuk;
vz = sinik*cosuk;
/* Position and velocity */
pos[0] = rk*ux*xkmper;
pos[1] = rk*uy*xkmper;
pos[2] = rk*uz*xkmper;
if( vel)
{
vel[0] = (rdot*ux + rvdot * vx)*xkmper;
vel[1] = (rdot*uy + rvdot * vy)*xkmper;
vel[2] = (rdot*uz + rvdot * vz)*xkmper;
}
} /* SGP */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -