src/CassiniSoldner.cpp
Go to the documentation of this file.
1 
11 
12 namespace GeographicLib {
13 
14  using namespace std;
15 
17  : _earth(earth) {}
18 
20  : _earth(earth)
21  { Reset(lat0, lon0); }
22 
24  _meridian = _earth.Line(lat0, lon0, real(0),
28  real f = _earth.Flattening();
30  _sbet0 *= (1 - f);
32  }
33 
35  real& azi, real& rk) const {
36  if (!Init())
37  return;
38  real dlon = Math::AngDiff(LongitudeOrigin(), lon);
39  real sig12, s12, azi1, azi2;
40  sig12 = _earth.Inverse(lat, -abs(dlon), lat, abs(dlon), s12, azi1, azi2);
41  sig12 *= real(0.5);
42  s12 *= real(0.5);
43  if (s12 == 0) {
44  real da = Math::AngDiff(azi1, azi2)/2;
45  if (abs(dlon) <= 90) {
46  azi1 = 90 - da;
47  azi2 = 90 + da;
48  } else {
49  azi1 = -90 - da;
50  azi2 = -90 + da;
51  }
52  }
53  if (dlon < 0) {
54  azi2 = azi1;
55  s12 = -s12;
56  sig12 = -sig12;
57  }
58  x = s12;
59  azi = Math::AngNormalize(azi2);
60  GeodesicLine perp(_earth.Line(lat, dlon, azi, Geodesic::GEODESICSCALE));
61  real t;
62  perp.GenPosition(true, -sig12,
64  t, t, t, t, t, t, rk, t);
65 
66  real salp0, calp0;
67  Math::sincosd(perp.EquatorialAzimuth(), salp0, calp0);
68  real
69  sbet1 = lat >=0 ? calp0 : -calp0,
70  cbet1 = abs(dlon) <= 90 ? abs(salp0) : -abs(salp0),
71  sbet01 = sbet1 * _cbet0 - cbet1 * _sbet0,
72  cbet01 = cbet1 * _cbet0 + sbet1 * _sbet0,
73  sig01 = atan2(sbet01, cbet01) / Math::degree();
74  _meridian.GenPosition(true, sig01,
76  t, t, t, y, t, t, t, t);
77  }
78 
80  real& azi, real& rk) const {
81  if (!Init())
82  return;
83  real lat1, lon1;
84  real azi0, t;
85  _meridian.Position(y, lat1, lon1, azi0);
86  _earth.Direct(lat1, lon1, azi0 + 90, x, lat, lon, azi, rk, t);
87  }
88 
89 } // namespace GeographicLib
static T AngNormalize(T x)
Definition: Math.hpp:440
Math::real LongitudeOrigin() const
CassiniSoldner(const Geodesic &earth=Geodesic::WGS84())
void Forward(real lat, real lon, real &x, real &y, real &azi, real &rk) const
Header for GeographicLib::CassiniSoldner class.
Scalar * y
static const double lat
GeodesicLine Line(real lat1, real lon1, real azi1, unsigned caps=ALL) const
Math::real Position(real s12, real &lat2, real &lon2, real &azi2, real &m12, real &M12, real &M21, real &S12) const
Definition: BFloat16.h:88
static void sincosd(T x, T &sinx, T &cosx)
Definition: Math.hpp:558
static T AngDiff(T x, T y, T &e)
Definition: Math.hpp:486
static void norm(T &x, T &y)
Definition: Math.hpp:384
const double lat0
Math::real LatitudeOrigin() const
Definition: main.h:100
Point2(* f)(const Point3 &, OptionalJacobian< 2, 3 >)
Namespace for GeographicLib.
void Reverse(real x, real y, real &lat, real &lon, real &azi, real &rk) const
const double lon0
static T degree()
Definition: Math.hpp:216
AnnoyingScalar atan2(const AnnoyingScalar &y, const AnnoyingScalar &x)
Math::real Flattening() const
Definition: Geodesic.hpp:949
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2, real &m12, real &M12, real &M21, real &S12) const
Definition: Geodesic.hpp:379
static const double lon
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
#define abs(x)
Definition: datatypes.h:17
Math::real GenPosition(bool arcmode, real s12_a12, unsigned outmask, real &lat2, real &lon2, real &azi2, real &s12, real &m12, real &M12, real &M21, real &S12) const
Geodesic calculations
Definition: Geodesic.hpp:172
void Reset(real lat0, real lon0)
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2, real &m12, real &M12, real &M21, real &S12) const
Definition: Geodesic.hpp:674
Point2 t(10, 10)


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:34:00