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,
179 real b()
const {
return t().b(); }
180 real c()
const {
return t().c(); }
210 GEODETIC_X = 4 + GEODETIC,
215 PARAMETRIC_X = 4 + PARAMETRIC,
220 GEOCENTRIC_X = 4 + GEOCENTRIC,
225 PLANETODETIC = GEODETIC,
230 GEOGRAPHIC = GEODETIC,
235 PLANETOCENTRIC = GEOCENTRIC,
289 void anytocart2(coord coordin,
Angle lat,
Angle lon, vec3& R)
const;
300 anytocart2(coordin,
Angle(lat),
Angle(lon), R);
311 void cart2toany(vec3 R, coord coordout,
Angle& lat,
Angle& lon)
const;
322 Angle lata, lona; cart2toany(R, coordout, lata, lona);
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 {
352 anytoany(coordin,
Angle(lat1),
Angle(lon1), coordout, lat2a, lon2a);
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 {
418 Angle lata, lona, azia; cart2toany(R, V, coordout, lata, lona, azia);
436 void anytocart(coord coordin,
Angle lat,
Angle lon,
real h, vec3& R)
const;
449 anytocart(coordin,
Angle(lat),
Angle(lon), h, R);
461 void carttoany(vec3 R,
475 coord coordout, real& lat, real& lon, real& h)
const {
476 Angle lata, lona; carttoany(R, coordout, lata, lona, h);
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;
555 R = {real(_norm(g)), real(_norm(g)), real(_norm(g))};
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;
571 V = {real(_norm(g)), real(_norm(g)), real(_norm(g))};
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;
586 #if defined(_MSC_VER) 587 # pragma warning (pop) 590 #endif // GEOGRAPHICLIB_CARTESIAN3_HPP
std::array< Math::real, 3 > vec3
#define GEOGRAPHICLIB_EXPORT
void cart2rand(G &g, vec3 &R) const
void anytocart(coord coordin, real lat, real lon, real h, vec3 &R) const
AngleT< Math::real > Angle
void anytoany(coord coordin, real lat1, real lon1, coord coordout, real &lat2, real &lon2) const
void anytocart2(coord coordin, real lat, real lon, vec3 &R) const
Namespace for GeographicLib.
Header for GeographicLib::Triaxial::Ellipsoid3 class.
static T hypot3(T x, T y, T z)
GeographicLib::Math::real real
const Ellipsoid3 & t() const
void swap(GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &a, GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &b)
Transformations between Cartesian and triaxial coordinates.
void anytocart2(coord coordin, real lat, real lon, real azi, vec3 &R, vec3 &V) const
void cart2toany(vec3 R, vec3 V, coord coordout, real &lat, real &lon, real &azi) const
void carttoany(vec3 R, coord coordout, real &lat, real &lon, real &h) const
void cart2toany(vec3 R, coord coordout, real &lat, real &lon) const