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(); }
296 void anytocart2(coord coordin,
Angle lat,
Angle lon, vec3& R)
const;
318 void cart2toany(vec3 R, coord coordout,
Angle& lat,
Angle& lon)
const;
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 {
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 {
443 void anytocart(coord coordin,
Angle lat,
Angle lon,
real h, vec3& R)
const;
468 void carttoany(vec3 R,
482 coord coordout, real& lat, real& lon, real& h)
const {
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;
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;
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 anytoany(coord coordin, Angle lat1, Angle lon1, coord coordout, Angle &lat2, Angle &lon2) const
void anytocart(coord coordin, real lat, real lon, real h, vec3 &R) const
Cartesian3(const Ellipsoid3 &t)
void anytocart2(coord coordin, Angle lat, Angle lon, 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, Angle &lat, Angle &lon, real &h) const
void carttoany(vec3 R, coord coordout, real &lat, real &lon, real &h) const
const Ellipsoid3 & t() const
void anytocart(coord coordin, Angle lat, Angle lon, real h, vec3 &R) const
void anytoany(coord coordin, real lat1, real lon1, coord coordout, real &lat2, real &lon2) const
void cart2toany(vec3 R, coord coordout, Angle &lat, Angle &lon) const
std::array< Math::real, 3 > vec3
Namespace for operations on triaxial ellipsoids.
Namespace for GeographicLib.
AngleT< Math::real > Angle
void swap(GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &a, GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &b)