GeographicLib  1.44
GeodesicLineExact.hpp
Go to the documentation of this file.
1 /**
2  * \file GeodesicLineExact.hpp
3  * \brief Header for GeographicLib::GeodesicLineExact class
4  *
5  * Copyright (c) Charles Karney (2012-2015) <charles@karney.com> and licensed
6  * under the MIT/X11 License. For more information, see
7  * http://geographiclib.sourceforge.net/
8  **********************************************************************/
9 
10 #if !defined(GEOGRAPHICLIB_GEODESICLINEEXACT_HPP)
11 #define GEOGRAPHICLIB_GEODESICLINEEXACT_HPP 1
12 
16 
17 namespace GeographicLib {
18 
19  /**
20  * \brief An exact geodesic line
21  *
22  * GeodesicLineExact facilitates the determination of a series of points on a
23  * single geodesic. This is a companion to the GeodesicExact class. For
24  * additional information on this class see the documentation on the
25  * GeodesicLine class.
26  *
27  * Example of use:
28  * \include example-GeodesicLineExact.cpp
29  *
30  * <a href="GeodSolve.1.html">GeodSolve</a> is a command-line utility
31  * providing access to the functionality of GeodesicExact and
32  * GeodesicLineExact (via the -E option).
33  **********************************************************************/
34 
36  private:
37  typedef Math::real real;
38  friend class GeodesicExact;
39  static const int nC4_ = GeodesicExact::nC4_;
40 
41  real tiny_;
42  real _lat1, _lon1, _azi1;
43  real _a, _f, _b, _c2, _f1, _e2, _salp0, _calp0, _k2,
44  _salp1, _calp1, _ssig1, _csig1, _dn1, _stau1, _ctau1,
45  _somg1, _comg1, _cchi1,
46  _A4, _B41, _E0, _D0, _H0, _E1, _D1, _H1;
47  real _C4a[nC4_]; // all the elements of _C4a are used
49  unsigned _caps;
50 
51  enum captype {
52  CAP_NONE = GeodesicExact::CAP_NONE,
53  CAP_E = GeodesicExact::CAP_E,
54  CAP_D = GeodesicExact::CAP_D,
55  CAP_H = GeodesicExact::CAP_H,
56  CAP_C4 = GeodesicExact::CAP_C4,
57  CAP_ALL = GeodesicExact::CAP_ALL,
58  CAP_MASK = GeodesicExact::CAP_MASK,
59  OUT_ALL = GeodesicExact::OUT_ALL,
60  OUT_MASK = GeodesicExact::OUT_MASK,
61  };
62  public:
63 
64  /**
65  * Bit masks for what calculations to do. They signify to the
66  * GeodesicLineExact::GeodesicLineExact constructor and to
67  * GeodesicExact::Line what capabilities should be included in the
68  * GeodesicLineExact object. This is merely a duplication of
69  * GeodesicExact::mask.
70  **********************************************************************/
71  enum mask {
72  /**
73  * No capabilities, no output.
74  * @hideinitializer
75  **********************************************************************/
77  /**
78  * Calculate latitude \e lat2. (It's not necessary to include this as a
79  * capability to GeodesicLineExact because this is included by default.)
80  * @hideinitializer
81  **********************************************************************/
83  /**
84  * Calculate longitude \e lon2.
85  * @hideinitializer
86  **********************************************************************/
88  /**
89  * Calculate azimuths \e azi1 and \e azi2. (It's not necessary to
90  * include this as a capability to GeodesicLineExact because this is
91  * included by default.)
92  * @hideinitializer
93  **********************************************************************/
95  /**
96  * Calculate distance \e s12.
97  * @hideinitializer
98  **********************************************************************/
100  /**
101  * Allow distance \e s12 to be used as input in the direct geodesic
102  * problem.
103  * @hideinitializer
104  **********************************************************************/
106  /**
107  * Calculate reduced length \e m12.
108  * @hideinitializer
109  **********************************************************************/
111  /**
112  * Calculate geodesic scales \e M12 and \e M21.
113  * @hideinitializer
114  **********************************************************************/
116  /**
117  * Calculate area \e S12.
118  * @hideinitializer
119  **********************************************************************/
121  /**
122  * Unroll \e lon2 in the direct calculation. (This flag used to be
123  * called LONG_NOWRAP.)
124  * @hideinitializer
125  **********************************************************************/
127  /// \cond SKIP
128  LONG_NOWRAP = LONG_UNROLL,
129  /// \endcond
130  /**
131  * All capabilities, calculate everything. (LONG_UNROLL is not
132  * included in this mask.)
133  * @hideinitializer
134  **********************************************************************/
136  };
137 
138  /** \name Constructors
139  **********************************************************************/
140  ///@{
141 
142  /**
143  * Constructor for a geodesic line staring at latitude \e lat1, longitude
144  * \e lon1, and azimuth \e azi1 (all in degrees).
145  *
146  * @param[in] g A GeodesicExact object used to compute the necessary
147  * information about the GeodesicLineExact.
148  * @param[in] lat1 latitude of point 1 (degrees).
149  * @param[in] lon1 longitude of point 1 (degrees).
150  * @param[in] azi1 azimuth at point 1 (degrees).
151  * @param[in] caps bitor'ed combination of GeodesicLineExact::mask values
152  * specifying the capabilities the GeodesicLineExact object should
153  * possess, i.e., which quantities can be returned in calls to
154  * GeodesicLine::Position.
155  *
156  * \e lat1 should be in the range [&minus;90&deg;, 90&deg;].
157  *
158  * The GeodesicLineExact::mask values are
159  * - \e caps |= GeodesicLineExact::LATITUDE for the latitude \e lat2; this
160  * is added automatically;
161  * - \e caps |= GeodesicLineExact::LONGITUDE for the latitude \e lon2;
162  * - \e caps |= GeodesicLineExact::AZIMUTH for the latitude \e azi2; this is
163  * added automatically;
164  * - \e caps |= GeodesicLineExact::DISTANCE for the distance \e s12;
165  * - \e caps |= GeodesicLineExact::REDUCEDLENGTH for the reduced length \e
166  m12;
167  * - \e caps |= GeodesicLineExact::GEODESICSCALE for the geodesic scales \e
168  * M12 and \e M21;
169  * - \e caps |= GeodesicLineExact::AREA for the area \e S12;
170  * - \e caps |= GeodesicLineExact::DISTANCE_IN permits the length of the
171  * geodesic to be given in terms of \e s12; without this capability the
172  * length can only be specified in terms of arc length;
173  * - \e caps |= GeodesicLineExact::ALL for all of the above.
174  * .
175  * The default value of \e caps is GeodesicLineExact::ALL.
176  *
177  * If the point is at a pole, the azimuth is defined by keeping \e lon1
178  * fixed, writing \e lat1 = &plusmn;(90&deg; &minus; &epsilon;), and taking
179  * the limit &epsilon; &rarr; 0+.
180  **********************************************************************/
181  GeodesicLineExact(const GeodesicExact& g, real lat1, real lon1, real azi1,
182  unsigned caps = ALL);
183 
184  /**
185  * A default constructor. If GeodesicLineExact::Position is called on the
186  * resulting object, it returns immediately (without doing any
187  * calculations). The object can be set with a call to
188  * GeodesicExact::Line. Use Init() to test whether object is still in this
189  * uninitialized state.
190  **********************************************************************/
191  GeodesicLineExact() : _caps(0U) {}
192  ///@}
193 
194  /** \name Position in terms of distance
195  **********************************************************************/
196  ///@{
197 
198  /**
199  * Compute the position of point 2 which is a distance \e s12 (meters)
200  * from point 1.
201  *
202  * @param[in] s12 distance between point 1 and point 2 (meters); it can be
203  * signed.
204  * @param[out] lat2 latitude of point 2 (degrees).
205  * @param[out] lon2 longitude of point 2 (degrees); requires that the
206  * GeodesicLineExact object was constructed with \e caps |=
207  * GeodesicLineExact::LONGITUDE.
208  * @param[out] azi2 (forward) azimuth at point 2 (degrees).
209  * @param[out] m12 reduced length of geodesic (meters); requires that the
210  * GeodesicLineExact object was constructed with \e caps |=
211  * GeodesicLineExact::REDUCEDLENGTH.
212  * @param[out] M12 geodesic scale of point 2 relative to point 1
213  * (dimensionless); requires that the GeodesicLineExact object was
214  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
215  * @param[out] M21 geodesic scale of point 1 relative to point 2
216  * (dimensionless); requires that the GeodesicLineExact object was
217  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
218  * @param[out] S12 area under the geodesic (meters<sup>2</sup>); requires
219  * that the GeodesicLineExact object was constructed with \e caps |=
220  * GeodesicLineExact::AREA.
221  * @return \e a12 arc length of between point 1 and point 2 (degrees).
222  *
223  * The values of \e lon2 and \e azi2 returned are in the range
224  * [&minus;180&deg;, 180&deg;).
225  *
226  * The GeodesicLineExact object \e must have been constructed with \e caps
227  * |= GeodesicLineExact::DISTANCE_IN; otherwise Math::NaN() is returned and
228  * no parameters are set. Requesting a value which the GeodesicLineExact
229  * object is not capable of computing is not an error; the corresponding
230  * argument will not be altered.
231  *
232  * The following functions are overloaded versions of
233  * GeodesicLineExact::Position which omit some of the output parameters.
234  * Note, however, that the arc length is always computed and returned as
235  * the function value.
236  **********************************************************************/
238  real& lat2, real& lon2, real& azi2,
239  real& m12, real& M12, real& M21,
240  real& S12) const {
241  real t;
242  return GenPosition(false, s12,
243  LATITUDE | LONGITUDE | AZIMUTH |
244  REDUCEDLENGTH | GEODESICSCALE | AREA,
245  lat2, lon2, azi2, t, m12, M12, M21, S12);
246  }
247 
248  /**
249  * See the documentation for GeodesicLineExact::Position.
250  **********************************************************************/
251  Math::real Position(real s12, real& lat2, real& lon2) const {
252  real t;
253  return GenPosition(false, s12,
254  LATITUDE | LONGITUDE,
255  lat2, lon2, t, t, t, t, t, t);
256  }
257 
258  /**
259  * See the documentation for GeodesicLineExact::Position.
260  **********************************************************************/
261  Math::real Position(real s12, real& lat2, real& lon2,
262  real& azi2) const {
263  real t;
264  return GenPosition(false, s12,
265  LATITUDE | LONGITUDE | AZIMUTH,
266  lat2, lon2, azi2, t, t, t, t, t);
267  }
268 
269  /**
270  * See the documentation for GeodesicLineExact::Position.
271  **********************************************************************/
272  Math::real Position(real s12, real& lat2, real& lon2,
273  real& azi2, real& m12) const {
274  real t;
275  return GenPosition(false, s12,
276  LATITUDE | LONGITUDE |
277  AZIMUTH | REDUCEDLENGTH,
278  lat2, lon2, azi2, t, m12, t, t, t);
279  }
280 
281  /**
282  * See the documentation for GeodesicLineExact::Position.
283  **********************************************************************/
284  Math::real Position(real s12, real& lat2, real& lon2,
285  real& azi2, real& M12, real& M21)
286  const {
287  real t;
288  return GenPosition(false, s12,
289  LATITUDE | LONGITUDE |
290  AZIMUTH | GEODESICSCALE,
291  lat2, lon2, azi2, t, t, M12, M21, t);
292  }
293 
294  /**
295  * See the documentation for GeodesicLineExact::Position.
296  **********************************************************************/
298  real& lat2, real& lon2, real& azi2,
299  real& m12, real& M12, real& M21)
300  const {
301  real t;
302  return GenPosition(false, s12,
303  LATITUDE | LONGITUDE | AZIMUTH |
304  REDUCEDLENGTH | GEODESICSCALE,
305  lat2, lon2, azi2, t, m12, M12, M21, t);
306  }
307 
308  ///@}
309 
310  /** \name Position in terms of arc length
311  **********************************************************************/
312  ///@{
313 
314  /**
315  * Compute the position of point 2 which is an arc length \e a12 (degrees)
316  * from point 1.
317  *
318  * @param[in] a12 arc length between point 1 and point 2 (degrees); it can
319  * be signed.
320  * @param[out] lat2 latitude of point 2 (degrees).
321  * @param[out] lon2 longitude of point 2 (degrees); requires that the
322  * GeodesicLineExact object was constructed with \e caps |=
323  * GeodesicLineExact::LONGITUDE.
324  * @param[out] azi2 (forward) azimuth at point 2 (degrees).
325  * @param[out] s12 distance between point 1 and point 2 (meters); requires
326  * that the GeodesicLineExact object was constructed with \e caps |=
327  * GeodesicLineExact::DISTANCE.
328  * @param[out] m12 reduced length of geodesic (meters); requires that the
329  * GeodesicLineExact object was constructed with \e caps |=
330  * GeodesicLineExact::REDUCEDLENGTH.
331  * @param[out] M12 geodesic scale of point 2 relative to point 1
332  * (dimensionless); requires that the GeodesicLineExact object was
333  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
334  * @param[out] M21 geodesic scale of point 1 relative to point 2
335  * (dimensionless); requires that the GeodesicLineExact object was
336  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
337  * @param[out] S12 area under the geodesic (meters<sup>2</sup>); requires
338  * that the GeodesicLineExact object was constructed with \e caps |=
339  * GeodesicLineExact::AREA.
340  *
341  * The values of \e lon2 and \e azi2 returned are in the range
342  * [&minus;180&deg;, 180&deg;).
343  *
344  * Requesting a value which the GeodesicLineExact object is not capable of
345  * computing is not an error; the corresponding argument will not be
346  * altered.
347  *
348  * The following functions are overloaded versions of
349  * GeodesicLineExact::ArcPosition which omit some of the output parameters.
350  **********************************************************************/
351  void ArcPosition(real a12, real& lat2, real& lon2, real& azi2,
352  real& s12, real& m12, real& M12, real& M21,
353  real& S12) const {
354  GenPosition(true, a12,
355  LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
356  REDUCEDLENGTH | GEODESICSCALE | AREA,
357  lat2, lon2, azi2, s12, m12, M12, M21, S12);
358  }
359 
360  /**
361  * See the documentation for GeodesicLineExact::ArcPosition.
362  **********************************************************************/
363  void ArcPosition(real a12, real& lat2, real& lon2)
364  const {
365  real t;
366  GenPosition(true, a12,
367  LATITUDE | LONGITUDE,
368  lat2, lon2, t, t, t, t, t, t);
369  }
370 
371  /**
372  * See the documentation for GeodesicLineExact::ArcPosition.
373  **********************************************************************/
374  void ArcPosition(real a12,
375  real& lat2, real& lon2, real& azi2)
376  const {
377  real t;
378  GenPosition(true, a12,
379  LATITUDE | LONGITUDE | AZIMUTH,
380  lat2, lon2, azi2, t, t, t, t, t);
381  }
382 
383  /**
384  * See the documentation for GeodesicLineExact::ArcPosition.
385  **********************************************************************/
386  void ArcPosition(real a12, real& lat2, real& lon2, real& azi2,
387  real& s12) const {
388  real t;
389  GenPosition(true, a12,
390  LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
391  lat2, lon2, azi2, s12, t, t, t, t);
392  }
393 
394  /**
395  * See the documentation for GeodesicLineExact::ArcPosition.
396  **********************************************************************/
397  void ArcPosition(real a12, real& lat2, real& lon2, real& azi2,
398  real& s12, real& m12) const {
399  real t;
400  GenPosition(true, a12,
401  LATITUDE | LONGITUDE | AZIMUTH |
402  DISTANCE | REDUCEDLENGTH,
403  lat2, lon2, azi2, s12, m12, t, t, t);
404  }
405 
406  /**
407  * See the documentation for GeodesicLineExact::ArcPosition.
408  **********************************************************************/
409  void ArcPosition(real a12, real& lat2, real& lon2, real& azi2,
410  real& s12, real& M12, real& M21)
411  const {
412  real t;
413  GenPosition(true, a12,
414  LATITUDE | LONGITUDE | AZIMUTH |
415  DISTANCE | GEODESICSCALE,
416  lat2, lon2, azi2, s12, t, M12, M21, t);
417  }
418 
419  /**
420  * See the documentation for GeodesicLineExact::ArcPosition.
421  **********************************************************************/
422  void ArcPosition(real a12, real& lat2, real& lon2, real& azi2,
423  real& s12, real& m12, real& M12, real& M21)
424  const {
425  real t;
426  GenPosition(true, a12,
427  LATITUDE | LONGITUDE | AZIMUTH |
428  DISTANCE | REDUCEDLENGTH | GEODESICSCALE,
429  lat2, lon2, azi2, s12, m12, M12, M21, t);
430  }
431  ///@}
432 
433  /** \name The general position function.
434  **********************************************************************/
435  ///@{
436 
437  /**
438  * The general position function. GeodesicLineExact::Position and
439  * GeodesicLineExact::ArcPosition are defined in terms of this function.
440  *
441  * @param[in] arcmode boolean flag determining the meaning of the second
442  * parameter; if arcmode is false, then the GeodesicLineExact object must
443  * have been constructed with \e caps |= GeodesicLineExact::DISTANCE_IN.
444  * @param[in] s12_a12 if \e arcmode is false, this is the distance between
445  * point 1 and point 2 (meters); otherwise it is the arc length between
446  * point 1 and point 2 (degrees); it can be signed.
447  * @param[in] outmask a bitor'ed combination of GeodesicLineExact::mask
448  * values specifying which of the following parameters should be set.
449  * @param[out] lat2 latitude of point 2 (degrees).
450  * @param[out] lon2 longitude of point 2 (degrees); requires that the
451  * GeodesicLineExact object was constructed with \e caps |=
452  * GeodesicLineExact::LONGITUDE.
453  * @param[out] azi2 (forward) azimuth at point 2 (degrees).
454  * @param[out] s12 distance between point 1 and point 2 (meters); requires
455  * that the GeodesicLineExact object was constructed with \e caps |=
456  * GeodesicLineExact::DISTANCE.
457  * @param[out] m12 reduced length of geodesic (meters); requires that the
458  * GeodesicLineExact object was constructed with \e caps |=
459  * GeodesicLineExact::REDUCEDLENGTH.
460  * @param[out] M12 geodesic scale of point 2 relative to point 1
461  * (dimensionless); requires that the GeodesicLineExact object was
462  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
463  * @param[out] M21 geodesic scale of point 1 relative to point 2
464  * (dimensionless); requires that the GeodesicLineExact object was
465  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
466  * @param[out] S12 area under the geodesic (meters<sup>2</sup>); requires
467  * that the GeodesicLineExact object was constructed with \e caps |=
468  * GeodesicLineExact::AREA.
469  * @return \e a12 arc length of between point 1 and point 2 (degrees).
470  *
471  * The GeodesicLineExact::mask values possible for \e outmask are
472  * - \e outmask |= GeodesicLineExact::LATITUDE for the latitude \e lat2;
473  * - \e outmask |= GeodesicLineExact::LONGITUDE for the latitude \e lon2;
474  * - \e outmask |= GeodesicLineExact::AZIMUTH for the latitude \e azi2;
475  * - \e outmask |= GeodesicLineExact::DISTANCE for the distance \e s12;
476  * - \e outmask |= GeodesicLineExact::REDUCEDLENGTH for the reduced length
477  * \e m12;
478  * - \e outmask |= GeodesicLineExact::GEODESICSCALE for the geodesic scales
479  * \e M12 and \e M21;
480  * - \e outmask |= GeodesicLineExact::AREA for the area \e S12;
481  * - \e outmask |= GeodesicLineExact::ALL for all of the above;
482  * - \e outmask |= GeodesicLineExact::LONG_UNROLL to unroll \e lon2 instead
483  * of wrapping it into the range [&minus;180&deg;, 180&deg;).
484  * .
485  * Requesting a value which the GeodesicLineExact object is not capable of
486  * computing is not an error; the corresponding argument will not be
487  * altered. Note, however, that the arc length is always computed and
488  * returned as the function value.
489  *
490  * With the GeodesicLineExact::LONG_UNROLL bit set, the quantity \e lon2
491  * &minus; \e lon1 indicates how many times and in what sense the geodesic
492  * encircles the ellipsoid.
493  **********************************************************************/
494  Math::real GenPosition(bool arcmode, real s12_a12, unsigned outmask,
495  real& lat2, real& lon2, real& azi2,
496  real& s12, real& m12, real& M12, real& M21,
497  real& S12) const;
498 
499  ///@}
500 
501  /** \name Inspector functions
502  **********************************************************************/
503  ///@{
504 
505  /**
506  * @return true if the object has been initialized.
507  **********************************************************************/
508  bool Init() const { return _caps != 0U; }
509 
510  /**
511  * @return \e lat1 the latitude of point 1 (degrees).
512  **********************************************************************/
514  { return Init() ? _lat1 : Math::NaN(); }
515 
516  /**
517  * @return \e lon1 the longitude of point 1 (degrees).
518  **********************************************************************/
520  { return Init() ? _lon1 : Math::NaN(); }
521 
522  /**
523  * @return \e azi1 the azimuth (degrees) of the geodesic line at point 1.
524  **********************************************************************/
526  { return Init() ? _azi1 : Math::NaN(); }
527 
528  /**
529  * @return \e azi0 the azimuth (degrees) of the geodesic line as it crosses
530  * the equator in a northward direction.
531  *
532  * The result lies in [&minus;90&deg;, 90&deg;].
533  **********************************************************************/
535  using std::atan2;
536  return Init() ? Math::atan2d(_salp0, _calp0) : Math::NaN();
537  }
538 
539  /**
540  * @return \e a1 the arc length (degrees) between the northward equatorial
541  * crossing and point 1.
542  *
543  * The result lies in (&minus;180&deg;, 180&deg;].
544  **********************************************************************/
546  using std::atan2;
547  return Init() ? atan2(_ssig1, _csig1) / Math::degree() : Math::NaN();
548  }
549 
550  /**
551  * @return \e a the equatorial radius of the ellipsoid (meters). This is
552  * the value inherited from the GeodesicExact object used in the
553  * constructor.
554  **********************************************************************/
556  { return Init() ? _a : Math::NaN(); }
557 
558  /**
559  * @return \e f the flattening of the ellipsoid. This is the value
560  * inherited from the GeodesicExact object used in the constructor.
561  **********************************************************************/
563  { return Init() ? _f : Math::NaN(); }
564 
565  /// \cond SKIP
566  /**
567  * <b>DEPRECATED</b>
568  * @return \e r the inverse flattening of the ellipsoid.
569  **********************************************************************/
570  Math::real InverseFlattening() const
571  { return Init() ? 1/_f : Math::NaN(); }
572  /// \endcond
573 
574  /**
575  * @return \e caps the computational capabilities that this object was
576  * constructed with. LATITUDE and AZIMUTH are always included.
577  **********************************************************************/
578  unsigned Capabilities() const { return _caps; }
579 
580  /**
581  * @param[in] testcaps a set of bitor'ed GeodesicLineExact::mask values.
582  * @return true if the GeodesicLineExact object has all these capabilities.
583  **********************************************************************/
584  bool Capabilities(unsigned testcaps) const {
585  testcaps &= OUT_ALL;
586  return (_caps & testcaps) == testcaps;
587  }
588  ///@}
589 
590  };
591 
592 } // namespace GeographicLib
593 
594 #endif // GEOGRAPHICLIB_GEODESICLINEEXACT_HPP
void ArcPosition(real a12, real &lat2, real &lon2, real &azi2) const
static T NaN()
Definition: Math.hpp:783
Math::real Position(real s12, real &lat2, real &lon2, real &azi2, real &m12) const
#define GEOGRAPHICLIB_EXPORT
Definition: Constants.hpp:90
Math::real Position(real s12, real &lat2, real &lon2, real &azi2, real &m12, real &M12, real &M21, real &S12) const
GeographicLib::Math::real real
Definition: GeodSolve.cpp:32
Math::real Position(real s12, real &lat2, real &lon2, real &azi2, real &M12, real &M21) const
Elliptic integrals and functions.
void ArcPosition(real a12, real &lat2, real &lon2) const
Math::real Position(real s12, real &lat2, real &lon2, real &azi2, real &m12, real &M12, real &M21) const
Math::real Position(real s12, real &lat2, real &lon2) const
void ArcPosition(real a12, real &lat2, real &lon2, real &azi2, real &s12, real &m12) const
static T atan2d(T y, T x)
Definition: Math.hpp:676
void ArcPosition(real a12, real &lat2, real &lon2, real &azi2, real &s12, real &m12, real &M12, real &M21) const
Namespace for GeographicLib.
Definition: Accumulator.cpp:12
Header for GeographicLib::EllipticFunction class.
Math::real Position(real s12, real &lat2, real &lon2, real &azi2) const
static T degree()
Definition: Math.hpp:230
Exact geodesic calculations.
void ArcPosition(real a12, real &lat2, real &lon2, real &azi2, real &s12, real &M12, real &M21) const
Header for GeographicLib::GeodesicExact class.
Header for GeographicLib::Constants class.
bool Capabilities(unsigned testcaps) const
void ArcPosition(real a12, real &lat2, real &lon2, real &azi2, real &s12, real &m12, real &M12, real &M21, real &S12) const
void ArcPosition(real a12, real &lat2, real &lon2, real &azi2, real &s12) const