NETGeographicLib  1.52
GeodesicLineExact.h
Go to the documentation of this file.
1 #pragma once
2 /**
3  * \file NETGeographicLib/GeodesicLineExact.h
4  * \brief Header for NETGeographicLib::GeodesicLineExact class
5  *
6  * NETGeographicLib is copyright (c) Scott Heiman (2013)
7  * GeographicLib is Copyright (c) Charles Karney (2010-2012)
8  * <charles@karney.com> and licensed under the MIT/X11 License.
9  * For more information, see
10  * https://geographiclib.sourceforge.io/
11  **********************************************************************/
12 #include "NETGeographicLib.h"
13 
14 namespace NETGeographicLib
15 {
16  ref class GeodesicExact;
17  /**
18  * \brief .NET wrapper for GeographicLib::GeodesicLineExact.
19  *
20  * This class allows .NET applications to access GeographicLib::GeodesicLineExact.
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  * C# Example:
28  * \include example-GeodesicLineExact.cs
29  * Managed C++ Example:
30  * \include example-GeodesicLineExact.cpp
31  * Visual Basic Example:
32  * \include example-GeodesicLineExact.vb
33  *
34  * <B>INTERFACE DIFFERENCES:</B><BR>
35  * A constructor has been provided that assumes WGS84 parameters.
36  *
37  * The following functions are implemented as properties:
38  * Latitude, Longitude, Azimuth, EquatorialAzimuth, EquatorialArc,
39  * EquatorialRadius, Distance, Arc, and Flattening.
40  *
41  * The constructors, GenPosition, and Capabilities functions accept the
42  * "capabilities mask" as a NETGeographicLib::Mask rather than an
43  * unsigned. The Capabilities function returns a NETGeographicLib::Mask
44  * rather than an unsigned.
45  *
46  * The overloaded Azimuth and EquatorialAzimuth functions that return
47  * the sin and cosine terms have been renamed AzimuthSinCos and
48  * EquatorialAzimuthSinCos, repectively.
49  **********************************************************************/
50  public ref class GeodesicLineExact
51  {
52  private:
53  enum class captype {
54  CAP_NONE = 0U,
55  CAP_E = 1U<<0,
56  // Skip 1U<<1 for compatibility with Geodesic (not required)
57  CAP_D = 1U<<2,
58  CAP_H = 1U<<3,
59  CAP_C4 = 1U<<4,
60  CAP_ALL = 0x1FU,
61  CAP_MASK = CAP_ALL,
62  OUT_ALL = 0x7F80U,
63  OUT_MASK = 0xFF80U, // Includes LONG_UNROLL
64  };
65  // a pointer to the GeographicLib::GeodesicLineExact.
66  GeographicLib::GeodesicLineExact* m_pGeodesicLineExact;
67 
68  // the finalizer frees the unmanaged memory when the object is destroyed.
69  !GeodesicLineExact(void);
70  public:
71  /**
72  * Bit masks for what calculations to do. These masks do double duty.
73  * They signify to the GeodesicLineExact::GeodesicLineExact constructor and
74  * to GeodesicExact::Line what capabilities should be included in the
75  * GeodesicLineExact object. They also specify which results to return in
76  * the general routines GeodesicExact::GenDirect and
77  * GeodesicExact::GenInverse routines. GeodesicLineExact::mask is a
78  * duplication of this enum.
79  **********************************************************************/
80  enum class mask {
81  /**
82  * No capabilities, no output.
83  * @hideinitializer
84  **********************************************************************/
85  NONE = 0U,
86  /**
87  * Calculate latitude \e lat2. (It's not necessary to include this as a
88  * capability to GeodesicLineExact because this is included by default.)
89  * @hideinitializer
90  **********************************************************************/
91  LATITUDE = 1U<<7 | unsigned(captype::CAP_NONE),
92  /**
93  * Calculate longitude \e lon2.
94  * @hideinitializer
95  **********************************************************************/
96  LONGITUDE = 1U<<8 | unsigned(captype::CAP_H),
97  /**
98  * Calculate azimuths \e azi1 and \e azi2. (It's not necessary to
99  * include this as a capability to GeodesicLineExact because this is
100  * included by default.)
101  * @hideinitializer
102  **********************************************************************/
103  AZIMUTH = 1U<<9 | unsigned(captype::CAP_NONE),
104  /**
105  * Calculate distance \e s12.
106  * @hideinitializer
107  **********************************************************************/
108  DISTANCE = 1U<<10 | unsigned(captype::CAP_E),
109  /**
110  * Allow distance \e s12 to be used as input in the direct geodesic
111  * problem.
112  * @hideinitializer
113  **********************************************************************/
114  DISTANCE_IN = 1U<<11 | unsigned(captype::CAP_E),
115  /**
116  * Calculate reduced length \e m12.
117  * @hideinitializer
118  **********************************************************************/
119  REDUCEDLENGTH = 1U<<12 | unsigned(captype::CAP_D),
120  /**
121  * Calculate geodesic scales \e M12 and \e M21.
122  * @hideinitializer
123  **********************************************************************/
124  GEODESICSCALE = 1U<<13 | unsigned(captype::CAP_D),
125  /**
126  * Calculate area \e S12.
127  * @hideinitializer
128  **********************************************************************/
129  AREA = 1U<<14 | unsigned(captype::CAP_C4),
130  /**
131  * Unroll \e lon2 in the direct calculation.
132  * @hideinitializer
133  **********************************************************************/
134  LONG_UNROLL = 1U<<15,
135  /**
136  * All capabilities, calculate everything. (LONG_UNROLL is not
137  * included in this mask.)
138  * @hideinitializer
139  **********************************************************************/
140  ALL = unsigned(captype::OUT_ALL)| unsigned(captype::CAP_ALL),
141  };
142 
143  /** \name Constructors
144  **********************************************************************/
145  ///@{
146 
147  /**
148  * Constructor for a geodesic line staring at latitude \e lat1, longitude
149  * \e lon1, and azimuth \e azi1 (all in degrees).
150  *
151  * @param[in] g A GeodesicExact object used to compute the necessary
152  * information about the GeodesicLineExact.
153  * @param[in] lat1 latitude of point 1 (degrees).
154  * @param[in] lon1 longitude of point 1 (degrees).
155  * @param[in] azi1 azimuth at point 1 (degrees).
156  * @param[in] caps bitor'ed combination of NETGeographicLib::Mask values
157  * specifying the capabilities the GeodesicLineExact object should
158  * possess, i.e., which quantities can be returned in calls to
159  * GeodesicLine::Position.
160  *
161  * \e lat1 should be in the range [&minus;90&deg;, 90&deg;].
162  *
163  * The NETGeographicLib::Mask values are
164  * - \e caps |= GeodesicLineExact::LATITUDE for the latitude \e lat2; this
165  * is added automatically;
166  * - \e caps |= NETGeographicLib::Mask::LONGITUDE for the latitude \e lon2;
167  * - \e caps |= NETGeographicLib::Mask::AZIMUTH for the latitude \e azi2; this is
168  * added automatically;
169  * - \e caps |= NETGeographicLib::Mask::DISTANCE for the distance \e s12;
170  * - \e caps |= NETGeographicLib::Mask::REDUCEDLENGTH for the reduced length \e
171  m12;
172  * - \e caps |= NETGeographicLib::Mask::GEODESICSCALE for the geodesic scales \e
173  * M12 and \e M21;
174  * - \e caps |= NETGeographicLib::Mask::AREA for the area \e S12;
175  * - \e caps |= NETGeographicLib::Mask::DISTANCE_IN permits the length of the
176  * geodesic to be given in terms of \e s12; without this capability the
177  * length can only be specified in terms of arc length;
178  * - \e caps |= NETGeographicLib::Mask::ALL for all of the above.
179  * .
180  *
181  * If the point is at a pole, the azimuth is defined by keeping \e lon1
182  * fixed, writing \e lat1 = &plusmn;(90&deg; &minus; &epsilon;), and taking
183  * the limit &epsilon; &rarr; 0+.
184  **********************************************************************/
185  GeodesicLineExact(GeodesicExact^ g, double lat1, double lon1, double azi1,
186  NETGeographicLib::Mask caps );
187 
188  /**
189  * A default constructor which assumes the WGS84 ellipsoid. See
190  * constructor comments for details.
191  **********************************************************************/
192  GeodesicLineExact(double lat1, double lon1, double azi1,
194 
195  /**
196  * This constructor accepts a reference to an unmanaged
197  * GeodesicLineExact.
198  * FOR INTERNAL USE ONLY.
199  **********************************************************************/
201  ///@}
202 
203  /**
204  * The destructor calls the finalizer
205  **********************************************************************/
207  { this->!GeodesicLineExact(); }
208 
209  /** \name Position in terms of distance
210  **********************************************************************/
211  ///@{
212 
213  /**
214  * Compute the position of point 2 which is a distance \e s12 (meters)
215  * from point 1.
216  *
217  * @param[in] s12 distance between point 1 and point 2 (meters); it can be
218  * signed.
219  * @param[out] lat2 latitude of point 2 (degrees).
220  * @param[out] lon2 longitude of point 2 (degrees); requires that the
221  * GeodesicLineExact object was constructed with \e caps |=
222  * GeodesicLineExact::LONGITUDE.
223  * @param[out] azi2 (forward) azimuth at point 2 (degrees).
224  * @param[out] m12 reduced length of geodesic (meters); requires that the
225  * GeodesicLineExact object was constructed with \e caps |=
226  * GeodesicLineExact::REDUCEDLENGTH.
227  * @param[out] M12 geodesic scale of point 2 relative to point 1
228  * (dimensionless); requires that the GeodesicLineExact object was
229  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
230  * @param[out] M21 geodesic scale of point 1 relative to point 2
231  * (dimensionless); requires that the GeodesicLineExact object was
232  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
233  * @param[out] S12 area under the geodesic (meters<sup>2</sup>); requires
234  * that the GeodesicLineExact object was constructed with \e caps |=
235  * GeodesicLineExact::AREA.
236  * @return \e a12 arc length of between point 1 and point 2 (degrees).
237  *
238  * The values of \e lon2 and \e azi2 returned are in the range
239  * [&minus;180&deg;, 180&deg;).
240  *
241  * The GeodesicLineExact object \e must have been constructed with \e caps
242  * |= GeodesicLineExact::DISTANCE_IN; otherwise Math::NaN() is returned and
243  * no parameters are set. Requesting a value which the GeodesicLineExact
244  * object is not capable of computing is not an error; the corresponding
245  * argument will not be altered.
246  *
247  * The following functions are overloaded versions of
248  * GeodesicLineExact::Position which omit some of the output parameters.
249  * Note, however, that the arc length is always computed and returned as
250  * the function value.
251  **********************************************************************/
252  double Position(double s12,
253  [System::Runtime::InteropServices::Out] double% lat2,
254  [System::Runtime::InteropServices::Out] double% lon2,
255  [System::Runtime::InteropServices::Out] double% azi2,
256  [System::Runtime::InteropServices::Out] double% m12,
257  [System::Runtime::InteropServices::Out] double% M12,
258  [System::Runtime::InteropServices::Out] double% M21,
259  [System::Runtime::InteropServices::Out] double% S12);
260 
261  /**
262  * See the documentation for GeodesicLineExact::Position.
263  **********************************************************************/
264  double Position(double s12,
265  [System::Runtime::InteropServices::Out] double% lat2,
266  [System::Runtime::InteropServices::Out] double% lon2);
267 
268  /**
269  * See the documentation for GeodesicLineExact::Position.
270  **********************************************************************/
271  double Position(double s12,
272  [System::Runtime::InteropServices::Out] double% lat2,
273  [System::Runtime::InteropServices::Out] double% lon2,
274  [System::Runtime::InteropServices::Out] double% azi2);
275 
276  /**
277  * See the documentation for GeodesicLineExact::Position.
278  **********************************************************************/
279  double Position(double s12,
280  [System::Runtime::InteropServices::Out] double% lat2,
281  [System::Runtime::InteropServices::Out] double% lon2,
282  [System::Runtime::InteropServices::Out] double% azi2,
283  [System::Runtime::InteropServices::Out] double% m12);
284 
285  /**
286  * See the documentation for GeodesicLineExact::Position.
287  **********************************************************************/
288  double Position(double s12,
289  [System::Runtime::InteropServices::Out] double% lat2,
290  [System::Runtime::InteropServices::Out] double% lon2,
291  [System::Runtime::InteropServices::Out] double% azi2,
292  [System::Runtime::InteropServices::Out] double% M12,
293  [System::Runtime::InteropServices::Out] double% M21);
294 
295  /**
296  * See the documentation for GeodesicLineExact::Position.
297  **********************************************************************/
298  double Position(double s12,
299  [System::Runtime::InteropServices::Out] double% lat2,
300  [System::Runtime::InteropServices::Out] double% lon2,
301  [System::Runtime::InteropServices::Out] double% azi2,
302  [System::Runtime::InteropServices::Out] double% m12,
303  [System::Runtime::InteropServices::Out] double% M12,
304  [System::Runtime::InteropServices::Out] double% M21);
305 
306  ///@}
307 
308  /** \name Position in terms of arc length
309  **********************************************************************/
310  ///@{
311 
312  /**
313  * Compute the position of point 2 which is an arc length \e a12 (degrees)
314  * from point 1.
315  *
316  * @param[in] a12 arc length between point 1 and point 2 (degrees); it can
317  * be signed.
318  * @param[out] lat2 latitude of point 2 (degrees).
319  * @param[out] lon2 longitude of point 2 (degrees); requires that the
320  * GeodesicLineExact object was constructed with \e caps |=
321  * GeodesicLineExact::LONGITUDE.
322  * @param[out] azi2 (forward) azimuth at point 2 (degrees).
323  * @param[out] s12 distance between point 1 and point 2 (meters); requires
324  * that the GeodesicLineExact object was constructed with \e caps |=
325  * GeodesicLineExact::DISTANCE.
326  * @param[out] m12 reduced length of geodesic (meters); requires that the
327  * GeodesicLineExact object was constructed with \e caps |=
328  * GeodesicLineExact::REDUCEDLENGTH.
329  * @param[out] M12 geodesic scale of point 2 relative to point 1
330  * (dimensionless); requires that the GeodesicLineExact object was
331  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
332  * @param[out] M21 geodesic scale of point 1 relative to point 2
333  * (dimensionless); requires that the GeodesicLineExact object was
334  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
335  * @param[out] S12 area under the geodesic (meters<sup>2</sup>); requires
336  * that the GeodesicLineExact object was constructed with \e caps |=
337  * GeodesicLineExact::AREA.
338  *
339  * The values of \e lon2 and \e azi2 returned are in the range
340  * [&minus;180&deg;, 180&deg;).
341  *
342  * Requesting a value which the GeodesicLineExact object is not capable of
343  * computing is not an error; the corresponding argument will not be
344  * altered.
345  *
346  * The following functions are overloaded versions of
347  * GeodesicLineExact::ArcPosition which omit some of the output parameters.
348  **********************************************************************/
349  void ArcPosition(double a12,
350  [System::Runtime::InteropServices::Out] double% lat2,
351  [System::Runtime::InteropServices::Out] double% lon2,
352  [System::Runtime::InteropServices::Out] double% azi2,
353  [System::Runtime::InteropServices::Out] double% s12,
354  [System::Runtime::InteropServices::Out] double% m12,
355  [System::Runtime::InteropServices::Out] double% M12,
356  [System::Runtime::InteropServices::Out] double% M21,
357  [System::Runtime::InteropServices::Out] double% S12);
358 
359  /**
360  * See the documentation for GeodesicLineExact::ArcPosition.
361  **********************************************************************/
362  void ArcPosition(double a12,
363  [System::Runtime::InteropServices::Out] double% lat2,
364  [System::Runtime::InteropServices::Out] double% lon2);
365 
366  /**
367  * See the documentation for GeodesicLineExact::ArcPosition.
368  **********************************************************************/
369  void ArcPosition(double a12,
370  [System::Runtime::InteropServices::Out] double% lat2,
371  [System::Runtime::InteropServices::Out] double% lon2,
372  [System::Runtime::InteropServices::Out] double% azi2);
373 
374  /**
375  * See the documentation for GeodesicLineExact::ArcPosition.
376  **********************************************************************/
377  void ArcPosition(double a12,
378  [System::Runtime::InteropServices::Out] double% lat2,
379  [System::Runtime::InteropServices::Out] double% lon2,
380  [System::Runtime::InteropServices::Out] double% azi2,
381  [System::Runtime::InteropServices::Out] double% s12);
382 
383  /**
384  * See the documentation for GeodesicLineExact::ArcPosition.
385  **********************************************************************/
386  void ArcPosition(double a12,
387  [System::Runtime::InteropServices::Out] double% lat2,
388  [System::Runtime::InteropServices::Out] double% lon2,
389  [System::Runtime::InteropServices::Out] double% azi2,
390  [System::Runtime::InteropServices::Out] double% s12,
391  [System::Runtime::InteropServices::Out] double% m12);
392 
393  /**
394  * See the documentation for GeodesicLineExact::ArcPosition.
395  **********************************************************************/
396  void ArcPosition(double a12,
397  [System::Runtime::InteropServices::Out] double% lat2,
398  [System::Runtime::InteropServices::Out] double% lon2,
399  [System::Runtime::InteropServices::Out] double% azi2,
400  [System::Runtime::InteropServices::Out] double% s12,
401  [System::Runtime::InteropServices::Out] double% M12,
402  [System::Runtime::InteropServices::Out] double% M21);
403 
404  /**
405  * See the documentation for GeodesicLineExact::ArcPosition.
406  **********************************************************************/
407  void ArcPosition(double a12,
408  [System::Runtime::InteropServices::Out] double% lat2,
409  [System::Runtime::InteropServices::Out] double% lon2,
410  [System::Runtime::InteropServices::Out] double% azi2,
411  [System::Runtime::InteropServices::Out] double% s12,
412  [System::Runtime::InteropServices::Out] double% m12,
413  [System::Runtime::InteropServices::Out] double% M12,
414  [System::Runtime::InteropServices::Out] double% M21);
415  ///@}
416 
417  /** \name The general position function.
418  **********************************************************************/
419  ///@{
420 
421  /**
422  * The general position function. GeodesicLineExact::Position and
423  * GeodesicLineExact::ArcPosition are defined in terms of this function.
424  *
425  * @param[in] arcmode boolean flag determining the meaning of the second
426  * parameter; if arcmode is false, then the GeodesicLineExact object must
427  * have been constructed with \e caps |= GeodesicLineExact::DISTANCE_IN.
428  * @param[in] s12_a12 if \e arcmode is false, this is the distance between
429  * point 1 and point 2 (meters); otherwise it is the arc length between
430  * point 1 and point 2 (degrees); it can be signed.
431  * @param[in] outmask a bitor'ed combination of GeodesicLineExact::mask
432  * values specifying which of the following parameters should be set.
433  * @param[out] lat2 latitude of point 2 (degrees).
434  * @param[out] lon2 longitude of point 2 (degrees); requires that the
435  * GeodesicLineExact object was constructed with \e caps |=
436  * GeodesicLineExact::LONGITUDE.
437  * @param[out] azi2 (forward) azimuth at point 2 (degrees).
438  * @param[out] s12 distance between point 1 and point 2 (meters); requires
439  * that the GeodesicLineExact object was constructed with \e caps |=
440  * GeodesicLineExact::DISTANCE.
441  * @param[out] m12 reduced length of geodesic (meters); requires that the
442  * GeodesicLineExact object was constructed with \e caps |=
443  * GeodesicLineExact::REDUCEDLENGTH.
444  * @param[out] M12 geodesic scale of point 2 relative to point 1
445  * (dimensionless); requires that the GeodesicLineExact object was
446  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
447  * @param[out] M21 geodesic scale of point 1 relative to point 2
448  * (dimensionless); requires that the GeodesicLineExact object was
449  * constructed with \e caps |= GeodesicLineExact::GEODESICSCALE.
450  * @param[out] S12 area under the geodesic (meters<sup>2</sup>); requires
451  * that the GeodesicLineExact object was constructed with \e caps |=
452  * GeodesicLineExact::AREA.
453  * @return \e a12 arc length of between point 1 and point 2 (degrees).
454  *
455  * The GeodesicLineExact::mask values possible for \e outmask are
456  * - \e outmask |= GeodesicLineExact::LATITUDE for the latitude \e lat2;
457  * - \e outmask |= GeodesicLineExact::LONGITUDE for the latitude \e lon2;
458  * - \e outmask |= GeodesicLineExact::AZIMUTH for the latitude \e azi2;
459  * - \e outmask |= GeodesicLineExact::DISTANCE for the distance \e s12;
460  * - \e outmask |= GeodesicLineExact::REDUCEDLENGTH for the reduced length
461  * \e m12;
462  * - \e outmask |= GeodesicLineExact::GEODESICSCALE for the geodesic scales
463  * \e M12 and \e M21;
464  * - \e outmask |= GeodesicLineExact::AREA for the area \e S12;
465  * - \e outmask |= GeodesicLineExact::ALL for all of the above;
466  * - \e outmask |= GeodesicLineExact::LONG_UNROLL to unroll \e lon2 instead
467  * of wrapping it into the range [&minus;180&deg;, 180&deg;).
468  * .
469  * Requesting a value which the GeodesicLineExact object is not capable of
470  * computing is not an error; the corresponding argument will not be
471  * altered. Note, however, that the arc length is always computed and
472  * returned as the function value.
473  *
474  * With the LONG_UNROLL bit set, the quantity \e lon2 &minus; \e lon1
475  * indicates how many times and in what sense the geodesic encircles
476  * the ellipsoid.
477  **********************************************************************/
478  double GenPosition(bool arcmode, double s12_a12,
479  GeodesicLineExact::mask outmask,
480  [System::Runtime::InteropServices::Out] double% lat2,
481  [System::Runtime::InteropServices::Out] double% lon2,
482  [System::Runtime::InteropServices::Out] double% azi2,
483  [System::Runtime::InteropServices::Out] double% s12,
484  [System::Runtime::InteropServices::Out] double% m12,
485  [System::Runtime::InteropServices::Out] double% M12,
486  [System::Runtime::InteropServices::Out] double% M21,
487  [System::Runtime::InteropServices::Out] double% S12);
488 
489  ///@}
490 
491  /** \name Setting point 3
492  **********************************************************************/
493  ///@{
494 
495  /**
496  * Specify position of point 3 in terms of distance.
497  *
498  * @param[in] s13 the distance from point 1 to point 3 (meters); it
499  * can be negative.
500  *
501  * This is only useful if the GeodesicLineExact object has been constructed
502  * with \e caps |= GeodesicLineExact::DISTANCE_IN.
503  **********************************************************************/
504  void SetDistance(double s13);
505 
506  /**
507  * Specify position of point 3 in terms of arc length.
508  *
509  * @param[in] a13 the arc length from point 1 to point 3 (degrees); it
510  * can be negative.
511  *
512  * The distance \e s13 is only set if the GeodesicLineExact object has been
513  * constructed with \e caps |= GeodesicLineExact::DISTANCE.
514  **********************************************************************/
515  void SetArc(double a13);
516 
517  /**
518  * Specify position of point 3 in terms of either distance or arc length.
519  *
520  * @param[in] arcmode boolean flag determining the meaning of the second
521  * parameter; if \e arcmode is false, then the GeodesicLineExact object
522  * must have been constructed with \e caps |=
523  * GeodesicLineExact::DISTANCE_IN.
524  * @param[in] s13_a13 if \e arcmode is false, this is the distance from
525  * point 1 to point 3 (meters); otherwise it is the arc length from
526  * point 1 to point 3 (degrees); it can be negative.
527  **********************************************************************/
528  void GenSetDistance(bool arcmode, double s13_a13);
529 
530  /**
531  * The distance or arc length to point 3.
532  *
533  * @param[in] arcmode boolean flag determining the meaning of returned
534  * value.
535  * @return \e s13 if \e arcmode is false; \e a13 if \e arcmode is true.
536  **********************************************************************/
537  double GenDistance(bool arcmode);
538  ///@}
539 
540  /** \name Trigonometric accessor functions
541  **********************************************************************/
542  ///@{
543  /**
544  * The sine and cosine of \e azi1.
545  *
546  * @param[out] sazi1 the sine of \e azi1.
547  * @param[out] cazi1 the cosine of \e azi1.
548  **********************************************************************/
550  [System::Runtime::InteropServices::Out] double% sazi1,
551  [System::Runtime::InteropServices::Out] double% cazi1);
552 
553  /**
554  * The sine and cosine of \e azi0.
555  *
556  * @param[out] sazi0 the sine of \e azi0.
557  * @param[out] cazi0 the cosine of \e azi0.
558  **********************************************************************/
560  [System::Runtime::InteropServices::Out] double% sazi0,
561  [System::Runtime::InteropServices::Out] double% cazi0);
562  ///@}
563 
564  /** \name Inspector functions
565  **********************************************************************/
566  ///@{
567  /**
568  * @return \e lat1 the latitude of point 1 (degrees).
569  **********************************************************************/
570  property double Latitude { double get(); }
571 
572  /**
573  * @return \e lon1 the longitude of point 1 (degrees).
574  **********************************************************************/
575  property double Longitude { double get(); }
576 
577  /**
578  * @return \e azi1 the azimuth (degrees) of the geodesic line at point 1.
579  **********************************************************************/
580  property double Azimuth { double get(); }
581 
582  /**
583  * @return \e azi0 the azimuth (degrees) of the geodesic line as it crosses
584  * the equator in a northward direction.
585  **********************************************************************/
586  property double EquatorialAzimuth { double get(); }
587 
588  /**
589  * @return \e a1 the arc length (degrees) between the northward equatorial
590  * crossing and point 1.
591  **********************************************************************/
592  property double EquatorialArc { double get(); }
593 
594  /**
595  * @return \e a the equatorial radius of the ellipsoid (meters). This is
596  * the value inherited from the GeodesicExact object used in the
597  * constructor.
598  **********************************************************************/
599  property double EquatorialRadius { double get(); }
600 
601  /**
602  * @return \e f the flattening of the ellipsoid. This is the value
603  * inherited from the GeodesicExact object used in the constructor.
604  **********************************************************************/
605  property double Flattening { double get(); }
606 
607  /**
608  * @return \e s13, the distance to point 3 (meters).
609  **********************************************************************/
610  property double Distance { double get(); }
611 
612  /**
613  * @return \e a13, the arc length to point 3 (degrees).
614  **********************************************************************/
615  property double Arc { double get(); }
616 
617  /**
618  * @return \e caps the computational capabilities that this object was
619  * constructed with. LATITUDE and AZIMUTH are always included.
620  **********************************************************************/
622 
623  /**
624  * @param[in] testcaps a set of bitor'ed GeodesicLineExact::mask values.
625  * @return true if the GeodesicLineExact object has all these capabilities.
626  **********************************************************************/
628  ///@}
629  };
630 } // namespace NETGeographicLib
Header for NETGeographicLib::NETGeographicLib objects.
.NET wrapper for GeographicLib::GeodesicExact.
Definition: GeodesicExact.h:87
.NET wrapper for GeographicLib::GeodesicLineExact.
void GenSetDistance(bool arcmode, double s13_a13)
double GenPosition(bool arcmode, double s12_a12, GeodesicLineExact::mask outmask, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% s12, [System::Runtime::InteropServices::Out] double% m12, [System::Runtime::InteropServices::Out] double% M12, [System::Runtime::InteropServices::Out] double% M21, [System::Runtime::InteropServices::Out] double% S12)
double Position(double s12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% m12, [System::Runtime::InteropServices::Out] double% M12, [System::Runtime::InteropServices::Out] double% M21)
bool Capabilities(NETGeographicLib::Mask testcaps)
double Position(double s12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2)
double Position(double s12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% m12)
void ArcPosition(double a12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% s12, [System::Runtime::InteropServices::Out] double% M12, [System::Runtime::InteropServices::Out] double% M21)
GeodesicLineExact(const GeographicLib::GeodesicLineExact &gle)
GeodesicLineExact(double lat1, double lon1, double azi1, NETGeographicLib::Mask caps)
void ArcPosition(double a12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% s12, [System::Runtime::InteropServices::Out] double% m12, [System::Runtime::InteropServices::Out] double% M12, [System::Runtime::InteropServices::Out] double% M21)
void EquatorialAzimuthSinCos([System::Runtime::InteropServices::Out] double% sazi0, [System::Runtime::InteropServices::Out] double% cazi0)
double Position(double s12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% M12, [System::Runtime::InteropServices::Out] double% M21)
void ArcPosition(double a12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2)
void ArcPosition(double a12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2)
double GenDistance(bool arcmode)
GeodesicLineExact(GeodesicExact^ g, double lat1, double lon1, double azi1, NETGeographicLib::Mask caps)
void ArcPosition(double a12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% s12, [System::Runtime::InteropServices::Out] double% m12)
void AzimuthSinCos([System::Runtime::InteropServices::Out] double% sazi1, [System::Runtime::InteropServices::Out] double% cazi1)
double Position(double s12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% m12, [System::Runtime::InteropServices::Out] double% M12, [System::Runtime::InteropServices::Out] double% M21, [System::Runtime::InteropServices::Out] double% S12)
void ArcPosition(double a12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% s12)
void ArcPosition(double a12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2, [System::Runtime::InteropServices::Out] double% s12, [System::Runtime::InteropServices::Out] double% m12, [System::Runtime::InteropServices::Out] double% M12, [System::Runtime::InteropServices::Out] double% M21, [System::Runtime::InteropServices::Out] double% S12)
NETGeographicLib::Mask Capabilities()
double Position(double s12, [System::Runtime::InteropServices::Out] double% lat2, [System::Runtime::InteropServices::Out] double% lon2, [System::Runtime::InteropServices::Out] double% azi2)