13#if !defined(GEOGRAPHICLIB_ANGLE_HPP)
14#define GEOGRAPHICLIB_ANGLE_HPP 1
49 template<
typename T = Math::real>
80 AngleT(T
s, T
c, T num = 0,
bool normp =
false);
149 T
s()
const {
return _s; }
153 T
c()
const {
return _c; }
157 T
t()
const {
return _s/_c; }
182 explicit operator T()
const;
419 static void DecodeLatLon(
const std::string& stra,
const std::string& strb,
421 bool longfirst =
false);
450 bool dms =
false,
char dmssep =
'\0',
451 bool longfirst =
false);
467 bool dms =
false,
char dmssep =
'\0');
477 using std::isfinite, std::isnan, std::isinf, std::hypot,
478 std::copysign, std::rint;
487 _c = copysign(T(1), _c);
488 }
else if (isfinite(h)) {
490 }
else if (isnan(h) || (isinf(_s) && isinf(_c)))
492 else if (isinf(_s)) {
494 _s = copysign(T(1), _s);
495 _c = copysign(T(0), _c);
498 _s = copysign(T(0), _s);
499 _c = copysign(T(1), _c);
515 return _n == 0 ? d : d +
Math::td * _n;
535 using std::sin, std::cos, std::atan2, std::rint;
536 T sn = sin(rad), cs = cos(rad);
545 return _n == 0 ? r : r + 2 *
Math::pi() * _n;
551 return atan2(_s, _c);
573 using std::signbit, std::fabs;
574 int iq = (signbit(_s) ? -1 : 1) * (signbit(_c) ?
575 ( -_c >= fabs(_s) ? 2 : 1 ) :
576 ( _c >= fabs(_s) ? 0 : 1 ));
582 return AngleT<T>(std::numeric_limits<T>::epsilon() / (1 << 20), 1, 0,
true);
595 T
c = _c * p._c - _s * p._s;
596 _s = _s * p._c + _c * p._s;
625 return _n == 0 &&_c > 0 &&
626 fabs(_s) <= mult * std::numeric_limits<T>::epsilon();
637 _s = rnd(_s); _c = rnd(_c);
651 return t.setn0(((*
this -
c).
base() +
c).
n0());
657 T h = hypot(_s, _c); _s /= h; _c /= h;
671 return (_n - (_s == 0 && signbit(_s) && _c < 0 ? 1 : 0)) + 0;
676 using std::rint, std::signbit;
677 _n = rint(
n) + (_s == 0 && signbit(_s) && _c < 0 ? 1 : 0);
684 _s = copysign(_s, T( q & 2U ? -1 : 1 ));
685 _c = copysign(_c, T( ((q >> 1) ^ q) & 1U ? -1 : 1 ));
692 return 2U * signbit(_s) + (signbit(_c) ^ signbit(_s));
700 if (swapp)
swap(_s, _c);
707 return signbit(mult) ? -*this : *
this;
716 _c / (m > 1 ? m : 1),
722 using std::isfinite, std::rint, std::remainder;
725 int iq = int(remainder(q, T(4)));
730 case -2:
s = -z;
c = -1;
break;
731 case -1:
s = -1;
c = z;
break;
732 case 1:
s = 1;
c = z;
break;
733 case 2:
s = z;
c = -1;
break;
736 s = q != 0 ? z : q;
c = 1;
744 using std::fabs, std::copysign;
747 if (fabs(_c) >= fabs(_s)) {
748 s = copysign(T(0), _s);
c = copysign(T(1), _c);
750 s = copysign(T(1), _s);
c = copysign(T(0), _c);
752 }
else if ((ind & 1U) == 0U) {
753 s = copysign(T(0), _s);
c = copysign(T(1), _c);
755 s = copysign(T(1), _s);
c = copysign(T(0), _c);
Header for GeographicLib::Math class.
An accurate representation of angles.
AngleT & operator+=(const AngleT &p)
AngleT rebase(const AngleT &c) const
AngleT operator-(const AngleT &p) const
static AngleT cardinal(T q)
bool operator==(const AngleT &p) const
AngleT flipsign(T mult) const
AngleT operator+(const AngleT &p) const
AngleT(T s, T c, T num=0, bool normp=false)
static void DecodeLatLon(const std::string &stra, const std::string &strb, AngleT &lat, AngleT &lon, bool longfirst=false)
static std::string LatLonString(AngleT lat, AngleT lon, int prec, bool dms=false, char dmssep='\0', bool longfirst=false)
static AngleT radians(T rad)
AngleT & setquadrant(unsigned q)
static AngleT DecodeAzimuth(const std::string &azistr)
bool zerop(T mult=0) const
static AngleT degrees(T deg)
AngleT nearest(unsigned ind=0U) const
static std::string AzimuthString(AngleT azi, int prec, bool dms=false, char dmssep='\0')
AngleT & reflect(bool flips, bool flipc=false, bool swapp=false)
unsigned quadrant() const
AngleT & operator-=(const AngleT &p)
static void sincosd(T x, T &sinx, T &cosx)
static T atan2d(T y, T x)
static constexpr int td
degrees per turn
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)