23 #define MAX(x,y) (((x) > (y)) ? (x) : (y))
33 setName(
"EquatorialCylindricalShape");
40 if (!
demCube()->hasTable(
"ShapeModelStatistics")) {
41 QString msg =
"The input cube references a ShapeModel that has "
42 "not been updated for the new ray tracing algorithm. All DEM "
43 "files must now be padded at the poles and contain a "
44 "ShapeModelStatistics table defining their minimum and maximum "
45 "radii values. The demprep program should be used to prepare the "
46 "DEM before you can run this program. There is more information "
47 "available in the documentation of the demprep program.";
77 std::vector<double> observerPos, std::vector<double> lookDirection) {
90 SpiceDouble plat, plon, pradius;
92 double maxRadiusMetersSquared =
105 SpiceDouble ulookB[3];
106 ulookB[0] = lookDirection[0];
107 ulookB[1] = lookDirection[1];
108 ulookB[2] = lookDirection[2];
109 vhat_c(ulookB,ulookB);
113 SpiceDouble observer[3];
114 observer[0] = observerPos[0];
115 observer[1] = observerPos[1];
116 observer[2] = observerPos[2];
117 SpiceDouble negobserver[3];
118 vminus_c(observer, negobserver);
119 double psi0 = vsep_c(negobserver, ulookB);
120 double cospsi0 = cos(psi0);
132 double observerdist = vnorm_c(observer);
133 tvec[0] = observer[0] + observerdist*cospsi0*ulookB[0];
134 tvec[1] = observer[1] + observerdist*cospsi0*ulookB[1];
135 tvec[2] = observer[2] + observerdist*cospsi0*ulookB[2];
136 double tlen = vnorm_c(tvec);
139 double radiusDiff = maxRadiusMetersSquared - tlen * tlen;
142 if (radiusDiff >= 0.0) {
143 radiusDiff = sqrt(radiusDiff);
150 double d0 = observerdist * cospsi0 - radiusDiff;
151 double dm = observerdist * cospsi0 + radiusDiff;
156 g1[0] = observer[0] + d0*ulookB[0];
157 g1[1] = observer[1] + d0*ulookB[1];
158 g1[2] = observer[2] + d0*ulookB[2];
159 double g1len = vnorm_c(g1);
160 SpiceDouble g1lat, g1lon, g1radius;
161 reclat_c(g1,&g1radius,&g1lon,&g1lat);
168 SpiceDouble negg1[3];
170 double psi1 = vsep_c(negg1, ulookB);
187 double tolerance = 3
E-8 * a;
202 double psi2 = psi1 + dalpha;
205 double dd = g1len * sin(dalpha) / sin(
PI-psi2);
212 if (dd < tolerance) {
220 g2[0] = observer[0] + d * ulookB[0];
221 g2[1] = observer[1] + d * ulookB[1];
222 g2[2] = observer[2] + d * ulookB[2];
223 double g2len = vnorm_c(g2);
226 SpiceDouble g2lat, g2lon, g2radius;
227 reclat_c(g2,&g2radius,&g2lon,&g2lat);
253 while (it < maxit && !done) {
258 if ((g2len*r1/r2 - g1len) == 0.0) {
265 double v = (r1-g1len) / (g2len*r1/r2 - g1len);
266 pB[0] = g1[0] + v * dd * ulookB[0];
267 pB[1] = g1[1] + v * dd * ulookB[1];
268 pB[2] = g1[2] + v * dd * ulookB[2];
270 reclat_c(pB,&pradius,&plon,&plat);
287 palt = plen - pradius;
291 if (palt > tolerance) {
303 else if (palt < -tolerance) {
321 if (!done && it >= maxit) {
346 SpiceDouble intersectionPoint[3];
348 surfpt_c(&observerPos[0], &lookDirection[0], plen, plen, plen,
349 intersectionPoint, &found);