33 m_F(ell.getFlattening()),
34 m_Ecc2(ell.eccentricitySquared())
51 <<
"DEBUG: ~ossimGeodeticEvaluator(): returning..." << std::endl;
74 <<
"\nossimGeodeticEvaluator::direct DEBUG:" << std::endl;
77 bool computationOK =
false;
79 double phi1 = p1.
latr();
82 double cosalpha1 = cos(az12);
83 double sinalpha1 = sin(az12);
84 double tanU1 = (1.0 -
m_F) * tan(phi1);
85 double cosU1 = 1.0 / sqrt( 1.0 + tanU1 * tanU1 );
86 double sinU1 = tanU1 * cosU1;
89 double sigma1 = atan2(tanU1, cosalpha1);
92 double sinalpha = cosU1 * sinalpha1;
94 double sin2alpha = sinalpha * sinalpha;
95 double cos2alpha = 1.0 - sin2alpha;
100 double A = 1 + u2 / 16384 * (4096 + u2 * (-768 + u2 * (320 - 175*u2)));
103 double B = u2 / 1024 * (256 + u2 * (-128 + u2 * (74 - 47*u2)));
107 double d_bA = d / (
m_B *
A);
111 double prevSigma =
M_PI;
116 while (
abs(sigma - prevSigma) > 1.e-12)
119 sigmaM2 = 2.0*sigma1 + sigma;
120 cos2sigm = cos(sigmaM2);
121 cos2sigm2 = cos2sigm * cos2sigm;
124 double sin2sig = sinsig*sinsig;
127 dSig = B * sinsig * (cos2sigm + B / 4 * (cossig * (-1 + 2*cos2sigm2) - B / 6 * cos2sigm * (-3 + 4*sin2sig) * (-3 + 4*cos2sigm2)));
134 sigmaM2 = 2.0*sigma1 + sigma;
135 cos2sigm = cos(sigmaM2);
136 cos2sigm2 = cos2sigm * cos2sigm;
141 double tmp = sinU1*sinsig - cosU1*cossig*cosalpha1;
142 double phi2 = atan2( sinU1*cossig + cosU1*sinsig*cosalpha1,
143 (1.0-
m_F) * sqrt( sin2alpha + tmp*tmp));
146 double lam = atan2(sinsig*sinalpha1, cosU1*cossig - sinU1*sinsig*cosalpha1);
149 double C =
m_F/16 * cos2alpha * (4 +
m_F * (4 - 3*cos2alpha));
152 double L = lam - (1-C) *
m_F * sinalpha * (sigma + C * sinsig * (cos2sigm + C * cossig * (-1 + 2*cos2sigm2)));
155 double alpha2 = atan2(sinalpha, -tmp);
160 az21 = alpha2 +
M_PI;
166 return computationOK;
190 <<
"\nossimGeodeticEvaluator::inverse DEBUG:" << std::endl;
193 bool computationOK =
false;
195 double phi1 = p1.
latr();
196 double lam1 = p1.
lonr();
197 double phi2 = p2.
latr();
198 double lam2 = p2.
lonr();
200 double U1 = atan((1.0-
m_F) * tan(phi1));
201 double sinU1 = sin(U1);
202 double cosU1 = cos(U1);
204 double U2 = atan((1.0-
m_F) * tan(phi2));
205 double sinU2 = sin(U2);
206 double cosU2 = cos(U2);
208 double sinU1sinU2 = sinU1 * sinU2;
209 double cosU1sinU2 = cosU1 * sinU2;
210 double sinU1cosU2 = sinU1 * cosU2;
211 double cosU1cosU2 = cosU1 * cosU2;
215 double L = lam2 - lam1;
229 bool converged =
false;
241 double sinlam = sin(lam);
242 double coslam = cos(lam);
245 double tmp = cosU1sinU2 - sinU1cosU2 * coslam;
246 sin2sig = cosU2*sinlam * cosU2*sinlam + tmp * tmp;
247 sinsig = sqrt(sin2sig);
250 cossig = sinU1sinU2 + (cosU1cosU2 * coslam);
253 sig = atan2(sinsig, cossig);
260 sinalpha = cosU1cosU2 * sinlam / sinsig;
261 cos2alpha = 1.0 - sinalpha*sinalpha;
264 if (cos2alpha == 0.0)
267 cos2sigm = cossig - 2 * sinU1sinU2 / cos2alpha;
268 cos2sigm2 = cos2sigm * cos2sigm;
271 double C =
m_F/16 * cos2alpha * (4 +
m_F * (4 - 3*cos2alpha));
275 lam = L + (1-C) *
m_F * sinalpha * (sig + C * sinsig * (cos2sigm + C * cossig * (-1 + 2*cos2sigm2)));
279 double delta =
abs(lam - lam0);
280 if (delta < 1e-13 && iter>=iterMin)
285 }
while (!converged && iter<=iterMax);
291 double A = 1 + u2 / 16384 * (4096 + u2 * (-768 + u2 * (320 - 175*u2)));
294 double B = u2 / 1024 * (256 + u2 * (-128 + u2 * (74 - 47*u2)));
297 dSig = B * sinsig * (cos2sigm + B / 4 * (cossig * (-1 + 2*cos2sigm2) - B / 6 * cos2sigm * (-3 + 4*sin2sig) * (-3 + 4*cos2sigm2)));
302 d =
m_B *
A * (sig - dSig);
314 else if (phi1 < phi2)
330 az12 = atan2(cosU2 * sin(lam), (cosU1sinU2 - sinU1cosU2 * cos(lam)));
331 if (az12 < 0.0) az12 += 2.0*
M_PI;
334 az21 = atan2(cosU1 * sin(lam), (-sinU1cosU2 + cosU1sinU2 * cos(lam))) +
M_PI;
335 if (az21 < 0.0) az21 += 2.0*
M_PI;
337 computationOK =
true;
340 return computationOK;
bool inverse(const ossimGpt &p1, const ossimGpt &p2, double &d, double &az12, double &az21)
Evaluate Vincenty inverse problem.
double nan()
Method to return ieee floating point double precision NAN.
ossimGeodeticEvaluator(const ossimEllipsoid &ell=ossimEllipsoid())
constructor.
double lonr() const
Returns the longitude in radian measure.
bool direct(const ossimGpt &p1, const double &az1, const double &d, ossimGpt &p2, double &az2)
Evaluate direct problem.
~ossimGeodeticEvaluator()
virtual destructor.
double latr() const
latr().
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)