// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2017-2018, Oracle and/or its affiliates. // Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle. // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_DISTANCE_CROSS_TRACK_POINT_BOX_HPP #define BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_DISTANCE_CROSS_TRACK_POINT_BOX_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace geometry { namespace strategy { namespace distance { /*! \brief Strategy functor for distance point to box calculation \ingroup strategies \details Class which calculates the distance of a point to a box, for points and boxes on a sphere or globe \tparam CalculationType \tparam_calculation \tparam Strategy underlying point-segment distance strategy, defaults to cross track \qbk{ [heading See also] [link geometry.reference.algorithms.distance.distance_3_with_strategy distance (with strategy)] } */ template < typename FormulaPolicy = strategy::andoyer, typename Spheroid = srs::spheroid, typename CalculationType = void > class geographic_cross_track_point_box { public: // point-point strategy getters struct distance_ps_strategy { typedef geographic_cross_track type; }; template struct return_type : services::return_type::type> {}; //constructor explicit geographic_cross_track_point_box(Spheroid const& spheroid = Spheroid()) : m_spheroid(spheroid) {} template inline typename return_type::type apply(Point const& point, Box const& box) const { /* #if !defined(BOOST_MSVC) BOOST_CONCEPT_ASSERT ( (concepts::PointSegmentDistanceStrategy < Strategy, Point, typename point_type::type >) ); #endif */ typedef typename return_type::type return_type; return details::cross_track_point_box_generic ::apply(point, box, typename distance_ps_strategy::type(m_spheroid)); } private : Spheroid m_spheroid; }; #ifndef DOXYGEN_NO_STRATEGY_SPECIALIZATIONS namespace services { template struct tag > { typedef strategy_tag_distance_point_box type; }; template struct return_type, P, Box> : geographic_cross_track_point_box < Strategy, Spheroid, CalculationType >::template return_type {}; template struct return_type, P, Box> : geographic_cross_track_point_box < Strategy, Spheroid >::template return_type {}; template struct return_type, P, Box> : geographic_cross_track_point_box < Strategy >::template return_type {}; template struct comparable_type > { typedef geographic_cross_track_point_box < Strategy, Spheroid, CalculationType > type; }; template struct get_comparable > { public: static inline geographic_cross_track_point_box apply(geographic_cross_track_point_box const& str) { return str; } }; template struct result_from_distance < geographic_cross_track_point_box, P, Box > { private: typedef geographic_cross_track_point_box this_strategy; typedef typename this_strategy::template return_type < P, Box >::type return_type; public: template static inline return_type apply(this_strategy const& strategy, T const& distance) { result_from_distance < Strategy, P, typename point_type::type >::apply(strategy, distance); } }; template struct default_strategy < point_tag, box_tag, Point, Box, geographic_tag, geographic_tag > { typedef geographic_cross_track_point_box<> type; }; template struct default_strategy < box_tag, point_tag, Box, Point, geographic_tag, geographic_tag > { typedef typename default_strategy < point_tag, box_tag, Point, Box, geographic_tag, geographic_tag >::type type; }; } // namespace services #endif // DOXYGEN_NO_STRATEGY_SPECIALIZATIONS }} // namespace strategy::distance }} // namespace boost::geometry #endif // BOOST_GEOMETRY_STRATEGIES_GEOGRAPHIC_DISTANCE_CROSS_TRACK_POINT_BOX_HPP