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