94 vector<double> observerLookVectorToTarget) {
106 SpiceDouble plat, plon, pradius;
118 SpiceDouble ulookB[3];
119 ulookB[0] = observerLookVectorToTarget[0];
120 ulookB[1] = observerLookVectorToTarget[1];
121 ulookB[2] = observerLookVectorToTarget[2];
122 vhat_c(ulookB, ulookB);
126 SpiceDouble observer[3];
127 observer[0] = observerBodyFixedPos[0];
128 observer[1] = observerBodyFixedPos[1];
129 observer[2] = observerBodyFixedPos[2];
131 SpiceDouble negobserver[3];
132 vminus_c(observer, negobserver);
134 double psi0 = vsep_c(negobserver, ulookB);
139 if (psi0 > PI / 2.0) {
154 vperp_c(&observer, &ulookB, perp);
156 vsub_c(&observer, &perp, v);
157 double dot = vdot_c(ulookB, v);
158 qDebug() <<
"dot = " << dot;
177 double observerdist = vnorm_c(observer);
178 double cospsi0 = cos(psi0);
179 tvec[0] = observer[0] + observerdist * cospsi0 * ulookB[0];
180 tvec[1] = observer[1] + observerdist * cospsi0 * ulookB[1];
181 tvec[2] = observer[2] + observerdist * cospsi0 * ulookB[2];
183 double tlen = vnorm_c(tvec);
186 double radiusDiff = maxRadiusMetersSquared - tlen * tlen;
189 if (radiusDiff >= 0.0) {
190 radiusDiff = sqrt(radiusDiff);
197 double d0 = observerdist * cospsi0 - radiusDiff;
198 double dm = observerdist * cospsi0 + radiusDiff;
203 g1[0] = observer[0] + d0 * ulookB[0];
204 g1[1] = observer[1] + d0 * ulookB[1];
205 g1[2] = observer[2] + d0 * ulookB[2];
207 double g1len = vnorm_c(g1);
208 SpiceDouble g1lat, g1lon, g1radius;
209 reclat_c(g1, &g1radius, &g1lon, &g1lat);
213 if (g1lon < 0.0) g1lon += 360.0;
215 SpiceDouble negg1[3];
218 double psi1 = vsep_c(negg1, ulookB);
222 double cmin = cos((90.0 - 1.0 / (2.0 *
demScale())) * DEG2RAD);
223 double dalpha = std::max(cos(g1lat * DEG2RAD), cmin) / (2.0 *
demScale() * RAD2DEG);
230 if (Isis::IsSpecial(r1)) {
236 double tolerance = 3E-8 * a;
251 double psi2 = psi1 + dalpha;
254 double dd = g1len * sin(dalpha) / sin(PI - psi2);
261 if (dd < tolerance) {
270 g2[0] = observer[0] + d * ulookB[0];
271 g2[1] = observer[1] + d * ulookB[1];
272 g2[2] = observer[2] + d * ulookB[2];
274 double g2len = vnorm_c(g2);
277 SpiceDouble g2lat, g2lon, g2radius;
278 reclat_c(g2, &g2radius, &g2lon, &g2lat);
283 if (g2lon < 0.0) g2lon += 360.0;
291 if (Isis::IsSpecial(r2)) {
303 while (it < maxit && !done) {
308 if ((g2len * r1 / r2 - g1len) == 0.0) {
315 double v = (r1 - g1len) / (g2len * r1 / r2 - g1len);
316 pB[0] = g1[0] + v * dd * ulookB[0];
317 pB[1] = g1[1] + v * dd * ulookB[1];
318 pB[2] = g1[2] + v * dd * ulookB[2];
320 reclat_c(pB, &pradius, &plon, &plat);
323 if (plon < 0.0) plon += 360.0;
325 if (plon > 360.0) plon -= 360.0;
331 if (Isis::IsSpecial(pradius)) {
335 palt = plen - pradius;
339 if (palt > tolerance) {
351 else if (palt < -tolerance) {
369 if (!done && it >= maxit) {
391 dalpha = std::max(cos(g2lat * DEG2RAD), cmin) / (2.0 *
demScale() * RAD2DEG);
394 SpiceDouble intersectionPoint[3];
398 surfpt_c(&observerBodyFixedPos[0], &observerLookVectorToTarget[0], plen, plen, plen,
399 intersectionPoint, &found);