32 RadarGroundMap::RadarGroundMap(Camera *parent, Radar::LookDirection ldir,
34 CameraGroundMap(parent) {
36 p_lookDirection = ldir;
37 p_waveLength = waveLength;
48 double et1 = p_camera->Spice::cacheStartTime().Et();
49 double et2 = p_camera->Spice::cacheEndTime().Et();
50 p_timeTolerance = (et2 - et1) / p_camera->Lines() / 20.0;
68 std::vector<double> Ssc(6);
70 vequ_c((SpiceDouble *) & (spaceCraft->
Coordinate()[0]), &Ssc[0]);
71 vequ_c((SpiceDouble *) & (spaceCraft->
Velocity()[0]), &Ssc[3]);
74 std::vector<double> bfSsc(6);
78 std::vector<double> Vsc(3);
79 std::vector<double> Xsc(3);
80 vequ_c(&bfSsc[0], (SpiceDouble *) & (Xsc[0]));
81 vequ_c(&bfSsc[3], (SpiceDouble *) & (Vsc[0]));
89 dp = vdot_c(&Xsc[0], i);
90 SpiceDouble p[3], q[3];
92 vsub_c(&Xsc[0], p, q);
100 p_camera->
radii(radii);
103 SpiceDouble lat = DBL_MAX;
104 SpiceDouble lon = DBL_MAX;
107 slantRangeSqr = slantRangeSqr * slantRangeSqr;
118 bool useSlopeEqn =
false;
120 bool success =
Iterate(R,slantRangeSqr,c,r,X,lat,lon,Xsc,useSlopeEqn,slope);
125 success =
Iterate(R,slantRangeSqr,c,r,X,lat,lon,Xsc,useSlopeEqn,slope);
128 if(!success)
return false;
132 while(lon < 0.0) lon += 360.0;
135 std::vector<double> lookB;
137 lookB[0] = X[0] - Xsc[0];
138 lookB[1] = X[1] - Xsc[1];
139 lookB[2] = X[2] - Xsc[2];
141 std::vector<double> lookJ = bodyFrame->
J2000Vector(lookB);
145 SpiceDouble unitLookC[3];
146 vhat_c(&lookC[0], unitLookC);
148 return p_camera->Sensor::SetUniversalGround(lat, lon);
160 const SpiceDouble r[], SpiceDouble X[], SpiceDouble &lat,
161 SpiceDouble &lon,
const std::vector<double> &Xsc,
162 const bool &useSlopeEqn,
const double &slope) {
166 SpiceDouble lastR = DBL_MAX;
171 double normXsc = vnorm_c(&Xsc[0]);
172 double alpha = (R * R - slantRangeSqr - normXsc * normXsc) /
173 (2.0 * vdot_c(&Xsc[0], c));
175 double arg = slantRangeSqr - alpha * alpha;
176 if(arg < 0.0)
return false;
178 double beta = sqrt(arg);
179 if(p_lookDirection == Radar::Left) beta *= -1.0;
181 SpiceDouble alphac[3], betar[3];
182 vscl_c(alpha, c, alphac);
183 vscl_c(beta, r, betar);
185 vadd_c(alphac, betar, alphac);
186 vadd_c(&Xsc[0], alphac, X);
190 reclat_c(X, &R, &lon, &lat);
202 while(fabs(R - lastR) > p_tolerance && iter < 100);
204 if(fabs(R - lastR) > p_tolerance)
return false;
219 if(!localRadius.isValid()) {
236 if(!surfacePoint.Valid())
return false;
242 double et1 = p_camera->Spice::cacheStartTime().Et();
243 p_camera->Sensor::setTime(et1);
244 double xv1 = ComputeXv(X);
247 double et2 = p_camera->Spice::cacheEndTime().Et();
248 p_camera->Sensor::setTime(et2);
249 double xv2 = ComputeXv(X);
252 if((xv1 < 0.0) && (xv2 < 0.0))
return false;
253 if((xv1 > 0.0) && (xv2 > 0.0))
return false;
256 double fl, fh, xl, xh;
271 for(
int j = 0; j < 30; j++) {
273 double etGuess = xl + (xh - xl) * fl / (fl - fh);
277 p_camera->Sensor::setTime(etGuess);
278 double fGuess = ComputeXv(X);
283 delTime = xl - etGuess;
288 delTime = xh - etGuess;
294 if((fabs(delTime) <= p_timeTolerance) || (fGuess == 0.0)) {
299 std::vector<double> Ssc(6);
302 vequ_c((SpiceDouble *) & (spaceCraft->
Coordinate()[0]), &Ssc[0]);
303 vequ_c((SpiceDouble *) & (spaceCraft->
Velocity()[0]), &Ssc[3]);
304 std::vector<double> bfSsc(6);
308 std::vector<double> Vsc(3);
309 std::vector<double> Xsc(3);
310 vequ_c(&bfSsc[0], (SpiceDouble *) & (Xsc[0]));
311 vequ_c(&bfSsc[3], (SpiceDouble *) & (Vsc[0]));
321 SpiceDouble vout1[3];
322 SpiceDouble vout2[3];
324 vsub_c(X, &Xsc[0], vout1);
325 vcrss_c(&Vsc[0], &Xsc[0], vout2);
326 dp = vdot_c(vout1, vout2);
327 if(dp > 0.0 && p_lookDirection == Radar::Left)
return false;
328 if(dp < 0.0 && p_lookDirection == Radar::Right)
return false;
329 if(dp == 0.0)
return false;
332 std::vector<double> lookB;
334 lookB[0] = X[0] - Xsc[0];
335 lookB[1] = X[1] - Xsc[1];
336 lookB[2] = X[2] - Xsc[2];
338 std::vector<double> lookJ = bodyFrame->
J2000Vector(lookB);
342 SpiceDouble unitLookC[3];
343 vhat_c(&lookC[0], unitLookC);
381 std::vector<double> sJ(6);
383 vequ_c((SpiceDouble *) & (spaceCraft->
Coordinate()[0]), &sJ[0]);
384 vequ_c((SpiceDouble *) & (spaceCraft->
Velocity()[0]), &sJ[3]);
393 vequ_c(&p_sB[0], PsB);
394 vequ_c(&p_sB[3], VsB);
397 vsub_c(X, PsB, &p_lookB[0]);
408 double RadarGroundMap::ComputeXv(SpiceDouble X[3]) {
415 std::vector<double> Ssc(6);
416 vequ_c((SpiceDouble *) & (spaceCraft->
Coordinate()[0]), &Ssc[0]);
417 vequ_c((SpiceDouble *) & (spaceCraft->
Velocity()[0]), &Ssc[3]);
420 std::vector<double> bfSsc(6);
424 std::vector<double> Vsc(3);
425 std::vector<double> Xsc(3);
426 vequ_c(&bfSsc[0], &Xsc[0]);
427 vequ_c(&bfSsc[3], &Vsc[0]);
430 SpiceDouble lookB[3];
431 vsub_c(&Xsc[0], X, lookB);
437 double xv = -2.0 * vdot_c(lookB, &Vsc[0]) / (vnorm_c(lookB) *
WaveLength());
464 double *dx,
double *dy) {
468 std::vector <double> d_lookJ(6);
470 vequ_c(&(instPos->
VelocityPartial(varType, coefIndex))[0], &d_lookJ[3]);
499 double *dx,
double *dy) {