diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/distance/linear_to_box.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/distance/linear_to_box.hpp | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/boost/geometry/algorithms/detail/distance/linear_to_box.hpp b/boost/geometry/algorithms/detail/distance/linear_to_box.hpp new file mode 100644 index 0000000000..833dbf5f6a --- /dev/null +++ b/boost/geometry/algorithms/detail/distance/linear_to_box.hpp @@ -0,0 +1,123 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2018, Oracle and/or its affiliates. + +// Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +#ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_BOX_HPP +#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_BOX_HPP + +#include <boost/geometry/core/point_type.hpp> + +#include <boost/geometry/algorithms/intersects.hpp> + +namespace boost { namespace geometry +{ + +#ifndef DOXYGEN_NO_DETAIL +namespace detail { namespace distance +{ + +template <typename Linear, typename Box, typename Strategy> +struct linear_to_box +{ + typedef typename strategy::distance::services::return_type + < + Strategy, + typename point_type<Linear>::type, + typename point_type<Box>::type + >::type return_type; + + template <typename Iterator> + static inline return_type apply(Box const& box, + Iterator begin, + Iterator end, + Strategy const& strategy) + { + bool first = true; + return_type d_min(0); + for (Iterator it = begin; it != end; ++it, first = false) + { + typedef typename std::iterator_traits<Iterator>::value_type + Segment; + + return_type d = dispatch::distance<Segment, Box, Strategy> + ::apply(*it, box, strategy); + + if ( first || d < d_min ) + { + d_min = d; + } + } + return d_min; + } + + static inline return_type apply(Linear const& linear, + Box const& box, + Strategy const& strategy) + { + if ( geometry::intersects(linear, box) ) + { + return 0; + } + + return apply(box, + geometry::segments_begin(linear), + geometry::segments_end(linear), + strategy); + } + + + static inline return_type apply(Box const& box, + Linear const& linear, + Strategy const& strategy) + { + return apply(linear, box, strategy); + } +}; + +}} // namespace detail::distance +#endif // DOXYGEN_NO_DETAIL + + +#ifndef DOXYGEN_NO_DISPATCH +namespace dispatch +{ + +template <typename Linear, typename Box, typename Strategy> +struct distance + < + Linear, Box, Strategy, + linear_tag, box_tag, + strategy_tag_distance_segment_box, false + > + : detail::distance::linear_to_box + < + Linear, Box, Strategy + > +{}; + + +template <typename Areal, typename Box, typename Strategy> +struct distance + < + Areal, Box, Strategy, + areal_tag, box_tag, + strategy_tag_distance_segment_box, false + > + : detail::distance::linear_to_box + < + Areal, Box, Strategy + > +{}; + + +} // namespace dispatch +#endif // DOXYGEN_NO_DISPATCH + +}} // namespace boost::geometry + +#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_BOX_HPP |