static int get_target_latlon(stateVector *st, double look, double *tlat, double *tlon) { // satellite height, from the state vector double ht = vecMagnitude(st->pos); // earth radius, calculate from WGS84 values, and approx latitude double re = 6378137.0; double rp = 6356752.31414; double lat = asin(st->pos.z/ht); double er = re*rp/sqrt(rp*rp*cos(lat)*cos(lat)+re*re*sin(lat)*sin(lat)); // calculate slant range by law of cosines // (where we know two sides, but not the angle between them) double D = er*er - ht*ht*sin(look)*sin(look); if (D < 0) return 0; // can't see the Earth from here double sr1 = ht*cos(look) + sqrt(D); double sr2 = ht*cos(look) - sqrt(D); double sr = sr1>sr2 ? sr2 : sr1; // target position, first in inertial coords, then convert to lat/lon vector target; get_target_position(st, look, 0, sr, &target); double glat; // geocentric cart2sph(target,&er,&glat,tlon); // tlon should be -180,180 // tlat needs to be geodetic // both should be degrees *tlon *= R2D; if (*tlon < -180.) *tlon += 360.; *tlat = R2D*atan(tan(glat)*re*re/(rp*rp)); return 1; }
void KheperaView::print_targetInfo(){ if (is_target_set()){ Point targetCenter = get_target_position(); View::print_targetInfo(_frame, get_height(), get_width(), targetCenter); } }