10#if !defined(GEOGRAPHICLIB_CARTESIAN3_HPP)
11#define GEOGRAPHICLIB_CARTESIAN3_HPP 1
20# pragma warning (push)
21# pragma warning (disable: 4251)
103#if GEOGRAPHICLIB_PRECISION > 3
110 static constexpr int maxit_ = 20;
111 static constexpr bool throw_ =
true;
113 const vec3 _axes, _axes2, _linecc2;
115 mutable std::normal_distribution<random_prec> _norm;
116 mutable std::uniform_real_distribution<random_prec> _uni;
118 static void roty(
vec3& R,
int n) {
141 void cart2togeneric(vec3 R,
ang& phi,
ang& lam,
bool alt)
const;
143 void generictocart2(
ang phi,
ang lam, vec3& R,
bool alt)
const;
144 template<
int n>
ang meridianplane(
ang lam,
bool alt)
const;
145 void cardinaldir(vec3 R,
ang merid, vec3& N, vec3& E,
bool alt)
const;
147 void cart2togeneric(vec3 R, vec3 V,
ang& phi,
ang& lam,
ang& zet,
bool alt)
150 void generictocart2(
ang phi,
ang lam,
ang zet, vec3& R, vec3&V,
bool alt)
152 real cubic(vec3 R2)
const;
163 funp(
const vec3& R,
const vec3& l)
164 : _d(
std::numeric_limits<
real>::epsilon()/2)
168 static_assert(n >= 1 && n <= 2,
"Bad power in funp");
170 std::pair<real, real> operator()(
real p)
const;
173 static real cartsolve(
const std::function<std::pair<real, real>(
real)>& f,
175 void carttoellip(vec3 R, Angle& bet, Angle& omg,
real& H)
const;
176 void elliptocart(Angle bet, Angle omg,
real H, vec3& R)
const;
179 real b()
const {
return t().b(); }
180 real c()
const {
return t().c(); }
289 void anytocart2(coord coordin,
Angle lat,
Angle lon, vec3& R)
const;
311 void cart2toany(vec3 R, coord coordout,
Angle& lat,
Angle& lon)
const;
336 void anytoany(coord coordin,
Angle lat1,
Angle lon1,
337 coord coordout,
Angle& lat2,
Angle& lon2)
const;
350 coord coordout, real& lat2, real& lon2)
const {
353 lat2 =
real(lat2a); lon2 =
real(lon2a);
373 vec3& R, vec3& V)
const;
402 void cart2toany(vec3 R, vec3 V,
417 coord coordout, real& lat, real& lon, real& azi)
const {
436 void anytocart(coord coordin,
Angle lat,
Angle lon,
real h, vec3& R)
const;
461 void carttoany(vec3 R,
475 coord coordout, real& lat, real& lon, real& h)
const {
491 void cart2tocart(vec3 R2,
real h, vec3& R)
const;
500 void carttocart2(vec3 R, vec3& R2,
real& h)
const;
523 template <
class G>
void cart2rand(G& g, vec3& R)
const;
534 template <
class G>
void cart2rand(G& g, vec3& R, vec3& V)
const;
556 Ellipsoid3::normvec(R);
557 if (isfinite(R[0]))
break;
559 R[0] *= _axes[0]; R[1] *= _axes[1]; R[2] *= _axes[2];
560 vec3 up{ R[0] / _axes2[0], R[1] / _axes2[1], R[2] / _axes2[2] };
562 if (
real(_uni(g)) < q)
break;
572 vec3 up{ R[0] / _axes2[0], R[1] / _axes2[1], R[2] / _axes2[2] };
575 uv = (V[0] * up[0] + V[1] * up[1] + V[2] * up[2])/u2;
577 V[0] -= uv * up[0]; V[1] -= uv * up[1]; V[2] -= uv * up[2];
578 Ellipsoid3::normvec(V);
579 if (isfinite(V[0]))
break;
587# 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)