GeographicLib 2.6
Loading...
Searching...
No Matches
GeographicLib::Triaxial::Geodesic3 Class Reference

The solution of the geodesic problem for a triaxial ellipsoid. More...

#include <GeographicLib/Triaxial/Geodesic3.hpp>

Public Member Functions

 Geodesic3 (const Ellipsoid3 &t=Ellipsoid3{})
 Geodesic3 (real a, real b, real c)
 Geodesic3 (real b, real e2, real k2, real kp2)
const Ellipsoid3t () const
GeodesicLine3 Inverse (Angle bet1, Angle omg1, Angle bet2, Angle omg2, real &s12, Angle &alp1, Angle &alp2) const
GeodesicLine3 Inverse (real bet1, real omg1, real bet2, real omg2, real &s12, real &alp1, real &alp2) const
GeodesicLine3 Direct (Angle bet1, Angle omg1, Angle alp1, real s12, Angle &bet2, Angle &omg2, Angle &alp2) const
GeodesicLine3 Direct (real bet1, real omg1, real alp1, real s12, real &bet2, real &omg2, real &alp2) const
GeodesicLine3 Line (Angle bet1, Angle omg1, Angle alp1) const
GeodesicLine3 Line (real bet1, real omg1, real alp1) const
void umbalt (bool numbalt)
bool umbalt () const

Detailed Description

The solution of the geodesic problem for a triaxial ellipsoid.

This is an implementation of Jacobi's method for finding geodesics on a triaxial ellipsoid (1839). This class offers an interface to the solutions to the direct geodesic problem via the GeodesicLine3 class which contains the meat of Jacobi's direct solution. In addition it provides a solution to the inverse problem which closely parallels the solution for the biaxial problem given by GeodesicExact. For more details see Geodesics on a triaxial ellipsoid.

Data for testing the geodesic routines is availble at Test set of geodesics on a triaxial ellipsoid (2024).

Note
There's a lot of new code here and testing is two orders of magnitude more difficult compared with the biaxial case (an extra parameter to fix the shape of the ellipsoid and geodesics now depend on the longitude of the two end points separately). I've limited by testing to ellipsoids with a/c 2. I don't expect any problems if a/c 10; but you might run into problems with more eccentric ellipsoids. The code treats oblate and prolate (biaxial) ellipsoids correctly; but, again, there may be problems with triaxial ellipsoids which are extremely close to oblate or prolate i.e., with either k or k' very small. (However the triaxial model of the Earth where the difference in the equatorial semiaxes is 70 m, \(k' = 0.057\), is treated just fine.) While I have made every effort to ensure that the code is error free, it's likely that some bugs remain. Please use caution with the results and report any problems (via email or with a Github issue).

Example of use:

// Example of using the Triaxial::Geodesic3 class.
#include <iostream>
#include <iomanip>
#include <exception>
using namespace std;
using namespace GeographicLib;
int main() {
try {
double bet1 = 10, omg1 = 30, bet2 = 80, omg2 = -50,
alp1, alp2, s12;
g.Inverse(bet1, omg1, bet2, omg2, s12, alp1, alp2);
cout << "geodesic between [" << bet1 << "," << omg1 << "] and ["
<< bet2 << "," << omg2 << "]\n";
cout << fixed << setprecision(3)
<< "s12 = " << s12 << ", alp1 = "
<< alp1 << ", alp2 = " << alp2 << "\n";
}
catch (const exception& e) {
cerr << "Caught exception: " << e.what() << "\n";
return 1;
}
}
int main(int argc, const char *const argv[])
Header for GeographicLib::Triaxial::Geodesic3 class.
static const Ellipsoid3 & Earth()
The solution of the geodesic problem for a triaxial ellipsoid.
Definition Geodesic3.hpp:65
Namespace for GeographicLib.

Geod3Solve is a command-line utility providing access to the functionality of Geodesic3 and GeodesicLine3.

Definition at line 65 of file Geodesic3.hpp.

Constructor & Destructor Documentation

◆ Geodesic3() [1/3]

GeographicLib::Triaxial::Geodesic3::Geodesic3 ( const Ellipsoid3 & t = Ellipsoid3{})

Constructor for a triaxial ellipsoid defined by Ellipsoid3 object.

Parameters
[in]tthe Ellipsoid3 object.

Definition at line 19 of file Geodesic3.cpp.

References t().

Referenced by Geodesic3(), and Geodesic3().

◆ Geodesic3() [2/3]

GeographicLib::Triaxial::Geodesic3::Geodesic3 ( real a,
real b,
real c )

Constructor for a trixial ellipsoid with semi-axes.

Parameters
[in]athe largest semi-axis.
[in]bthe middle semi-axis.
[in]cthe smallest semi-axis.
Exceptions
GeographicErrif the required ordering is semiaxes is violated.

The semi-axes must satisfy abc > 0. If a = c (a sphere), then the oblate limit is taken.

Definition at line 25 of file Geodesic3.cpp.

References Geodesic3().

◆ Geodesic3() [3/3]

GeographicLib::Triaxial::Geodesic3::Geodesic3 ( real b,
real e2,
real k2,
real kp2 )

Alternate constructor for a triaxial ellipsoid.

Parameters
[in]bthe middle semi-axis.
[in]e2the eccentricity squared \(e^2 = (a^2 - c^2)/b^2\).
[in]k2the oblateness parameter squared \(k^2 = (b^2 - c^2) / (a^2 - c^2)\).
[in]kp2the prolateness parameter squared \(k'^2= (a^2 - b^2) / (a^2 - c^2)\).
Exceptions
GeographicErrif the required ordering is semiaxes is violated.
Note
The constructor normalizes k2 and kp2 to ensure then k2 + kp2 = 1.

Definition at line 29 of file Geodesic3.cpp.

References Geodesic3().

Member Function Documentation

◆ t()

const Ellipsoid3 & GeographicLib::Triaxial::Geodesic3::t ( ) const
inline
Returns
the Ellipsoid3 object for this projection.

Definition at line 187 of file Geodesic3.hpp.

Referenced by Geodesic3(), and Inverse().

◆ Inverse() [1/2]

GeodesicLine3 GeographicLib::Triaxial::Geodesic3::Inverse ( Angle bet1,
Angle omg1,
Angle bet2,
Angle omg2,
real & s12,
Angle & alp1,
Angle & alp2 ) const

Solve the inverse problem

Parameters
[in]bet1the ellipsoidal latitude of point 1.
[in]omg1the ellipsoidal longitude of point 1.
[in]bet2the ellipsoidal latitude of point 2.
[in]omg2the ellipsoidal longitude of point 2.
[out]s12the shortest distance between the points.
[out]alp1the forward azimuth of the geodesic at point 1.
[out]alp2the forward azimuth of the geodesic at point 2.
Returns
a GeodesicLine3 object defining the geodesic.

Definition at line 34 of file Geodesic3.cpp.

References GeographicLib::Triaxial::Ellipsoid3::AngNorm(), GeographicLib::AngleT< T >::base(), GeographicLib::AngleT< T >::c(), GeographicLib::AngleT< Math::real >::cardinal(), GeographicLib::AngleT< Math::real >::eps(), GeographicLib::AngleT< T >::flipsign(), GeographicLib::Math::NaN(), GeographicLib::Math::pi(), GeographicLib::AngleT< T >::radians(), GeographicLib::AngleT< Math::real >::radians(), GeographicLib::AngleT< T >::radians0(), GeographicLib::AngleT< T >::reflect(), GeographicLib::AngleT< T >::round(), GeographicLib::AngleT< T >::s(), GeographicLib::AngleT< T >::setn(), GeographicLib::AngleT< T >::setquadrant(), GeographicLib::Math::sq(), std::swap(), and t().

Referenced by Inverse().

◆ Inverse() [2/2]

GeodesicLine3 GeographicLib::Triaxial::Geodesic3::Inverse ( real bet1,
real omg1,
real bet2,
real omg2,
real & s12,
real & alp1,
real & alp2 ) const

Solve the inverse problem in degrees

Parameters
[in]bet1the ellipsoidal latitude of point 1 (in degrees).
[in]omg1the ellipsoidal longitude of point 1 (in degrees).
[in]bet2the ellipsoidal latitude of point 2 (in degrees).
[in]omg2the ellipsoidal longitude of point 2 (in degrees).
[out]s12the shortest distance between the points.
[out]alp1the forward azimuth of the geodesic at point 1 (in degrees).
[out]alp2the forward azimuth of the geodesic at point 2 (in degrees).
Returns
a GeodesicLine3 object defining the geodesic.

Definition at line 893 of file Geodesic3.cpp.

References Inverse().

◆ Direct() [1/2]

GeodesicLine3 GeographicLib::Triaxial::Geodesic3::Direct ( Angle bet1,
Angle omg1,
Angle alp1,
real s12,
Angle & bet2,
Angle & omg2,
Angle & alp2 ) const

Solve the direct problem

Parameters
[in]bet1the ellipsoidal latitude of point 1.
[in]omg1the ellipsoidal longitude of point 1.
[in]alp1the forward azimuth of the geodesic at point 1.
[in]s12the distance from point 1 to point 2.
[out]bet2the ellipsoidal latitude of point 2.
[out]omg2the ellipsoidal longitude of point 2.
[out]alp2the forward azimuth of the geodesic at point 2.
Returns
a GeodesicLine3 object defining the geodesic.

Definition at line 885 of file Geodesic3.cpp.

References GeographicLib::Triaxial::GeodesicLine3::Position().

Referenced by Direct().

◆ Direct() [2/2]

GeodesicLine3 GeographicLib::Triaxial::Geodesic3::Direct ( real bet1,
real omg1,
real alp1,
real s12,
real & bet2,
real & omg2,
real & alp2 ) const

Solve the direct problem in degrees

Parameters
[in]bet1the ellipsoidal latitude of point 1 (in degrees).
[in]omg1the ellipsoidal longitude of point 1 (in degrees).
[in]alp1the forward azimuth of the geodesic at point 1 (in degrees).
[in]s12the distance from point 1 to point 2.
[out]bet2the ellipsoidal latitude of point 2 (in degrees).
[out]omg2the ellipsoidal longitude of point 2 (in degrees).
[out]alp2the forward azimuth of the geodesic at point 2 (in degrees).
Returns
a GeodesicLine3 object defining the geodesic.

Definition at line 906 of file Geodesic3.cpp.

References Direct().

◆ Line() [1/2]

GeodesicLine3 GeographicLib::Triaxial::Geodesic3::Line ( Angle bet1,
Angle omg1,
Angle alp1 ) const

A geodesic line defined at a starting point

Parameters
[in]bet1the ellipsoidal latitude of point 1.
[in]omg1the ellipsoidal longitude of point 1.
[in]alp1the forward azimuth of the geodesic at point 1.
Returns
a GeodesicLine3 object defining the geodesic.

Definition at line 881 of file Geodesic3.cpp.

Referenced by Line().

◆ Line() [2/2]

GeodesicLine3 GeographicLib::Triaxial::Geodesic3::Line ( real bet1,
real omg1,
real alp1 ) const

A geodesic line defined at a starting point specified in degrees

Parameters
[in]bet1the ellipsoidal latitude of point 1 (in degrees).
[in]omg1the ellipsoidal longitude of point 1 (in degrees).
[in]alp1the forward azimuth of the geodesic at point 1 (in degrees).
Returns
a GeodesicLine3 object defining the geodesic.

Definition at line 902 of file Geodesic3.cpp.

References Line().

◆ umbalt() [1/2]

void GeographicLib::Triaxial::Geodesic3::umbalt ( bool numbalt)
inline

Specify the behavior of umbilical geodesics

Parameters
[in]numbaltthe new value of the umbalt flag.

If umbalt is true (resp. false) then the latitude (resp. longitude) of an umbilical geodesic is the librating coordinate and the longitude (resp. latitude) is the rotating coordinate. This has no effect for biaxial ellipsoids. In this case the latitude (resp. longitude) is always the librating coordinate for oblate (resp. prolate) ellipsoids.

Definition at line 278 of file Geodesic3.hpp.

◆ umbalt() [2/2]

bool GeographicLib::Triaxial::Geodesic3::umbalt ( ) const
inline
Returns
the value of the umbalt flag; see umbalt(bool)).

Definition at line 284 of file Geodesic3.hpp.


The documentation for this class was generated from the following files: