10#if !defined(GEOGRAPHICLIB_CARTESIAN3_HPP)
11#define GEOGRAPHICLIB_CARTESIAN3_HPP 1
20# pragma warning (push)
21# pragma warning (disable: 4251)
110#if GEOGRAPHICLIB_PRECISION > 3
117 static constexpr int maxit_ = 20;
118 static constexpr bool throw_ =
true;
120 const vec3 _axes, _axes2, _linecc2;
122 mutable std::normal_distribution<random_prec> _norm;
123 mutable std::uniform_real_distribution<random_prec> _uni;
125 static void roty(
vec3& R,
int n) {
148 void cart2togeneric(vec3 R,
ang& phi,
ang& lam,
bool alt)
const;
150 void generictocart2(
ang phi,
ang lam, vec3& R,
bool alt)
const;
151 template<
int n>
ang meridianplane(
ang lam,
bool alt)
const;
152 void cardinaldir(vec3 R,
ang merid, vec3& N, vec3& E,
bool alt)
const;
154 void cart2togeneric(vec3 R, vec3 V,
ang& phi,
ang& lam,
ang& zet,
bool alt)
157 void generictocart2(
ang phi,
ang lam,
ang zet, vec3& R, vec3&V,
bool alt)
159 real cubic(vec3 R2)
const;
170 funp(
const vec3& R,
const vec3& l)
171 : _d(
std::numeric_limits<
real>::epsilon()/2)
175 static_assert(n >= 1 && n <= 2,
"Bad power in funp");
177 std::pair<real, real> operator()(
real p)
const;
180 static real cartsolve(
const std::function<std::pair<real, real>(
real)>& f,
182 void carttoellip(vec3 R, Angle& bet, Angle& omg,
real& H)
const;
183 void elliptocart(Angle bet, Angle omg,
real H, vec3& R)
const;
186 real b()
const {
return t().b(); }
187 real c()
const {
return t().c(); }
217 GEODETIC_X = 4 + GEODETIC,
222 PARAMETRIC_X = 4 + PARAMETRIC,
227 GEOCENTRIC_X = 4 + GEOCENTRIC,
232 PLANETODETIC = GEODETIC,
237 GEOGRAPHIC = GEODETIC,
242 PLANETOCENTRIC = GEOCENTRIC,
296 void anytocart2(coord coordin,
Angle lat,
Angle lon, vec3& R)
const;
307 anytocart2(coordin,
Angle(lat),
Angle(lon), R);
318 void cart2toany(vec3 R, coord coordout,
Angle& lat,
Angle& lon)
const;
329 Angle lata, lona; cart2toany(R, coordout, lata, lona);
343 void anytoany(coord coordin,
Angle lat1,
Angle lon1,
344 coord coordout,
Angle& lat2,
Angle& lon2)
const;
357 coord coordout, real& lat2, real& lon2)
const {
359 anytoany(coordin,
Angle(lat1),
Angle(lon1), coordout, lat2a, lon2a);
360 lat2 =
real(lat2a); lon2 =
real(lon2a);
380 vec3& R, vec3& V)
const;
409 void cart2toany(vec3 R, vec3 V,
424 coord coordout, real& lat, real& lon, real& azi)
const {
425 Angle lata, lona, azia; cart2toany(R, V, coordout, lata, lona, azia);
443 void anytocart(coord coordin,
Angle lat,
Angle lon,
real h, vec3& R)
const;
456 anytocart(coordin,
Angle(lat),
Angle(lon), h, R);
468 void carttoany(vec3 R,
482 coord coordout, real& lat, real& lon, real& h)
const {
483 Angle lata, lona; carttoany(R, coordout, lata, lona, h);
498 void cart2tocart(vec3 R2,
real h, vec3& R)
const;
507 void carttocart2(vec3 R, vec3& R2,
real& h)
const;
530 template <
class G>
void cart2rand(G& g, vec3& R)
const;
541 template <
class G>
void cart2rand(G& g, vec3& R, vec3& V)
const;
562 R = {real(_norm(g)), real(_norm(g)), real(_norm(g))};
563 Ellipsoid3::normvec(R);
564 if (isfinite(R[0]))
break;
566 R[0] *= _axes[0]; R[1] *= _axes[1]; R[2] *= _axes[2];
567 vec3 up{ R[0] / _axes2[0], R[1] / _axes2[1], R[2] / _axes2[2] };
569 if (real(_uni(g)) < q)
break;
578 V = {real(_norm(g)), real(_norm(g)), real(_norm(g))};
579 vec3 up{ R[0] / _axes2[0], R[1] / _axes2[1], R[2] / _axes2[2] };
582 uv = (V[0] * up[0] + V[1] * up[1] + V[2] * up[2])/u2;
584 V[0] -= uv * up[0]; V[1] -= uv * up[1]; V[2] -= uv * up[2];
585 Ellipsoid3::normvec(V);
586 if (isfinite(V[0]))
break;
594# pragma warning (pop)
#define GEOGRAPHICLIB_EXPORT
Header for GeographicLib::Triaxial::Ellipsoid3 class.
GeographicLib::Math::real real
static T hypot3(T x, T y, T z)
Transformations between cartesian and triaxial coordinates.
void anytocart2(coord coordin, real lat, real lon, real azi, vec3 &R, vec3 &V) const
void anytocart(coord coordin, real lat, real lon, real h, vec3 &R) const
void cart2toany(vec3 R, vec3 V, coord coordout, real &lat, real &lon, real &azi) const
void cart2toany(vec3 R, coord coordout, real &lat, real &lon) const
void anytocart2(coord coordin, real lat, real lon, vec3 &R) const
void cart2rand(G &g, vec3 &R) const
void carttoany(vec3 R, coord coordout, real &lat, real &lon, real &h) const
const Ellipsoid3 & t() const
void anytoany(coord coordin, real lat1, real lon1, coord coordout, real &lat2, real &lon2) const
std::array< Math::real, 3 > vec3
Namespace for GeographicLib.