GeographicLib 2.1.2
LocalCartesian.cpp
Go to the documentation of this file.
1/**
2 * \file LocalCartesian.cpp
3 * \brief Implementation for GeographicLib::LocalCartesian class
4 *
5 * Copyright (c) Charles Karney (2008-2015) <charles@karney.com> and licensed
6 * under the MIT/X11 License. For more information, see
7 * https://geographiclib.sourceforge.io/
8 **********************************************************************/
9
11
12namespace GeographicLib {
13
14 using namespace std;
15
16 void LocalCartesian::Reset(real lat0, real lon0, real h0) {
17 _lat0 = Math::LatFix(lat0);
18 _lon0 = Math::AngNormalize(lon0);
19 _h0 = h0;
20 _earth.Forward(_lat0, _lon0, _h0, _x0, _y0, _z0);
21 real sphi, cphi, slam, clam;
22 Math::sincosd(_lat0, sphi, cphi);
23 Math::sincosd(_lon0, slam, clam);
24 Geocentric::Rotation(sphi, cphi, slam, clam, _r);
25 }
26
27 void LocalCartesian::MatrixMultiply(real M[dim2_]) const {
28 // M = r' . M
29 real t[dim2_];
30 copy(M, M + dim2_, t);
31 for (size_t i = 0; i < dim2_; ++i) {
32 size_t row = i / dim_, col = i % dim_;
33 M[i] = _r[row] * t[col] + _r[row+3] * t[col+3] + _r[row+6] * t[col+6];
34 }
35 }
36
37 void LocalCartesian::IntForward(real lat, real lon, real h,
38 real& x, real& y, real& z,
39 real M[dim2_]) const {
40 real xc, yc, zc;
41 _earth.IntForward(lat, lon, h, xc, yc, zc, M);
42 xc -= _x0; yc -= _y0; zc -= _z0;
43 x = _r[0] * xc + _r[3] * yc + _r[6] * zc;
44 y = _r[1] * xc + _r[4] * yc + _r[7] * zc;
45 z = _r[2] * xc + _r[5] * yc + _r[8] * zc;
46 if (M)
47 MatrixMultiply(M);
48 }
49
50 void LocalCartesian::IntReverse(real x, real y, real z,
51 real& lat, real& lon, real& h,
52 real M[dim2_]) const {
53 real
54 xc = _x0 + _r[0] * x + _r[1] * y + _r[2] * z,
55 yc = _y0 + _r[3] * x + _r[4] * y + _r[5] * z,
56 zc = _z0 + _r[6] * x + _r[7] * y + _r[8] * z;
57 _earth.IntReverse(xc, yc, zc, lat, lon, h, M);
58 if (M)
59 MatrixMultiply(M);
60 }
61
62} // namespace GeographicLib
GeographicLib::Math::real real
Definition: GeodSolve.cpp:31
Header for GeographicLib::LocalCartesian class.
void Forward(real lat, real lon, real h, real &X, real &Y, real &Z) const
Definition: Geocentric.hpp:132
void Reset(real lat0, real lon0, real h0=0)
static T LatFix(T x)
Definition: Math.hpp:300
static void sincosd(T x, T &sinx, T &cosx)
Definition: Math.cpp:106
static T AngNormalize(T x)
Definition: Math.cpp:71
Namespace for GeographicLib.
Definition: Accumulator.cpp:12