28 Ellipsoid(
double maj,
double ecc) : _a(maj), _e2(ecc) {}
38 double a()
const {
return _a;}
42 double b()
const {
return _a * std::sqrt(1.0 - _e2);}
46 double e2()
const {
return _e2;}
51 void a(
double val) {_a = val;}
56 void e2(
double val) {_e2 = val;}
60 inline double rEast(
double lat)
const;
64 inline double rNorth(
double lat)
const;
68 inline double rDir(
double hdg,
double lat)
const;
72 void lonLatToXyz(
const cartesian_t &llh, cartesian_t &xyz)
const;
73 CUDA_HOSTDEV Vec3
lonLatToXyz(
const Vec3& llh)
const {
81 void xyzToLonLat(
const cartesian_t &xyz, cartesian_t &llh)
const;
82 CUDA_HOSTDEV Vec3
xyzToLonLat(
const Vec3& xyz)
const {
90 inline void nVector(
double lon,
double lat, cartesian_t &vec)
const;
92 inline Vec3
nVector(
double lon,
double lat)
const {
100 inline void xyzOnEllipse(
double lon,
double lat, cartesian_t &xyz)
const;
104 const cartesian_t &los,
double &azi,
double &look)
const;
119 return _a / std::sqrt(1.0 - (_e2 * std::pow(std::sin(lat), 2)));
129 return (_a * (1.0 - _e2)) / std::pow((1.0 - (_e2 * std::pow(std::sin(lat), 2))), 1.5);
139 auto re =
rEast(lat);
141 return (re * rn) / ((re * std::pow(std::cos(hdg), 2))
142 + (rn * std::pow(std::sin(hdg), 2)));
154 double clat = std::cos(lat);
155 vec[0] = clat * std::cos(lon);
156 vec[1] = clat * std::sin(lon);
157 vec[2] = std::sin(lat);
178lonLatToXyz(
const cartesian_t & llh, cartesian_t & xyz)
const {
184 auto re =
rEast(llh[1]);
186 xyz[0] = (re + llh[2]) * std::cos(llh[1]) * std::cos(llh[0]);
187 xyz[1] = (re + llh[2]) * std::cos(llh[1]) * std::sin(llh[0]);
189 xyz[2] = ((re * (1.0 - _e2)) + llh[2]) * std::sin(llh[1]);
197xyzToLonLat(
const cartesian_t & xyz, cartesian_t & llh)
const {
203 const double e4 = _e2 * _e2;
204 const double a2 = _a * _a;
206 double p = (std::pow(xyz[0], 2) + std::pow(xyz[1], 2)) / a2;
208 double q = ((1. - _e2) * std::pow(xyz[2], 2)) / a2;
209 double r = (p + q - e4) / 6.;
210 double s = (e4 * p * q) / (4. * std::pow(r, 3));
211 double t = std::pow(1. + s + std::sqrt(s * (2. + s)), (1./3.));
212 double u = r * (1. + t + (1. / t));
213 double rv = std::sqrt(std::pow(u, 2) + (e4 * q));
214 double w = (_e2 * (u + rv - q)) / (2. * rv);
215 double k = std::sqrt(u + rv + std::pow(w, 2)) - w;
217 double d = (k * std::sqrt(std::pow(xyz[0], 2) + std::pow(xyz[1], 2))) / (k + _e2);
219 llh[1] = std::atan2(xyz[2], d);
221 llh[0] = std::atan2(xyz[1], xyz[0]);
223 llh[2] = ((k + _e2 - 1.) * sqrt(std::pow(d, 2) + std::pow(xyz[2], 2))) / k;
Data structure to store Ellipsoid information.
Definition Ellipsoid.h:20
void a(double val)
Set semi-major axis.
Definition Ellipsoid.h:51
CUDA_HOSTDEV double rNorth(double lat) const
Return local radius in NS direction.
Definition Ellipsoid.h:127
CUDA_HOSTDEV void xyzToLonLat(const cartesian_t &xyz, cartesian_t &llh) const
Transform ECEF xyz to Lon/Lat/Hgt.
Definition Ellipsoid.h:197
CUDA_HOSTDEV Ellipsoid(double maj, double ecc)
Constructor using semi-major axis and eccentricity^2.
Definition Ellipsoid.h:28
CUDA_HOSTDEV double a() const
Return semi-major axis.
Definition Ellipsoid.h:38
void getImagingAnglesAtPlatform(const cartesian_t &pos, const cartesian_t &vel, const cartesian_t &los, double &azi, double &look) const
Estimate azimuth angle and look angle for a given LOS vector.
Definition Ellipsoid.cpp:23
void e2(double val)
Set eccentricity^2.
Definition Ellipsoid.h:56
CUDA_HOSTDEV void xyzOnEllipse(double lon, double lat, cartesian_t &xyz) const
Return ECEF coordinates of point on ellipse.
Definition Ellipsoid.h:167
CUDA_HOSTDEV double e2() const
Return eccentricity^2.
Definition Ellipsoid.h:46
CUDA_HOSTDEV void nVector(double lon, double lat, cartesian_t &vec) const
Return normal to the ellipsoid at given lon, lat.
Definition Ellipsoid.h:152
CUDA_HOSTDEV void lonLatToXyz(const cartesian_t &llh, cartesian_t &xyz) const
Transform WGS84 Lon/Lat/Hgt to ECEF xyz.
Definition Ellipsoid.h:178
CUDA_HOSTDEV double b() const
Return semi-minor axis.
Definition Ellipsoid.h:42
CUDA_HOSTDEV double rEast(double lat) const
Return local radius in EW direction.
Definition Ellipsoid.h:117
CUDA_HOSTDEV double rDir(double hdg, double lat) const
Return directional local radius.
Definition Ellipsoid.h:138