123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #ifndef BOOST_GEOMETRY_FORMULAS_MERIDIAN_SEGMENT_HPP
- #define BOOST_GEOMETRY_FORMULAS_MERIDIAN_SEGMENT_HPP
- #include <boost/math/constants/constants.hpp>
- #include <boost/geometry/core/radius.hpp>
- #include <boost/geometry/util/condition.hpp>
- #include <boost/geometry/util/math.hpp>
- #include <boost/geometry/util/normalize_spheroidal_coordinates.hpp>
- namespace boost { namespace geometry { namespace formula
- {
- class meridian_segment
- {
- public :
- enum SegmentType {NonMeridian, MeridianCrossingPole, MeridianNotCrossingPole};
- template <typename T>
- static inline SegmentType is_meridian(T lon1, T lat1, T lon2, T lat2)
- {
- SegmentType res = NonMeridian;
- T diff = geometry::math::longitude_distance_signed<geometry::radian>(lon1, lon2);
- if ( meridian_not_crossing_pole(lat1, lat2, diff) )
- {
- res = MeridianNotCrossingPole;
- }
- else if ( meridian_crossing_pole(diff) )
- {
- res = MeridianCrossingPole;
- }
- return res;
- }
- template <typename T>
- static bool meridian_not_crossing_pole(T lat1, T lat2, T diff)
- {
- T half_pi = math::half_pi<T>();
- return math::equals(diff, T(0)) ||
- (math::equals(lat2, half_pi) && math::equals(lat1, -half_pi));
- }
- template <typename T>
- static bool meridian_crossing_pole(T diff)
- {
- return math::equals(math::abs(diff), math::pi<T>());
- }
- };
- }}}
- #endif
|