diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/sections/section_functions.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/sections/section_functions.hpp | 96 |
1 files changed, 82 insertions, 14 deletions
diff --git a/boost/geometry/algorithms/detail/sections/section_functions.hpp b/boost/geometry/algorithms/detail/sections/section_functions.hpp index 7bc5c08046..67df3060c4 100644 --- a/boost/geometry/algorithms/detail/sections/section_functions.hpp +++ b/boost/geometry/algorithms/detail/sections/section_functions.hpp @@ -2,8 +2,8 @@ // Copyright (c) 2015 Barend Gehrels, Amsterdam, the Netherlands. -// This file was modified by Oracle on 2015. -// Modifications copyright (c) 2015, Oracle and/or its affiliates. +// This file was modified by Oracle on 2015, 2017. +// Modifications copyright (c) 2015-2017, Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle @@ -30,18 +30,87 @@ namespace detail { namespace section template < std::size_t Dimension, + typename Geometry, + typename CastedCSTag = typename tag_cast + < + typename cs_tag<Geometry>::type, + spherical_tag + >::type +> +struct preceding_check +{ + template <typename Point, typename Box> + static inline bool apply(int dir, Point const& point, Box const& /*point_box*/, Box const& other_box) + { + return (dir == 1 && get<Dimension>(point) < get<min_corner, Dimension>(other_box)) + || (dir == -1 && get<Dimension>(point) > get<max_corner, Dimension>(other_box)); + } +}; + +template <typename Geometry> +struct preceding_check<0, Geometry, spherical_tag> +{ + template <typename Point, typename Box> + static inline bool apply(int dir, Point const& point, Box const& point_box, Box const& other_box) + { + typedef typename select_coordinate_type + < + Point, Box + >::type calc_t; + typedef typename coordinate_system<Point>::type::units units_t; + + calc_t const c0 = 0; + + if (dir == 1) + { + calc_t const diff_min = math::longitude_distance_signed + < + units_t, calc_t + >(get<min_corner, 0>(other_box), get<0>(point)); + + calc_t const diff_min_min = math::longitude_distance_signed + < + units_t, calc_t + >(get<min_corner, 0>(other_box), get<min_corner, 0>(point_box)); + + return diff_min < c0 && diff_min_min <= c0 && diff_min_min <= diff_min; + } + else if (dir == -1) + { + calc_t const diff_max = math::longitude_distance_signed + < + units_t, calc_t + >(get<max_corner, 0>(other_box), get<0>(point)); + + calc_t const diff_max_max = math::longitude_distance_signed + < + units_t, calc_t + >(get<max_corner, 0>(other_box), get<max_corner, 0>(point_box)); + + return diff_max > c0 && diff_max_max >= c0 && diff_max <= diff_max_max; + } + + return false; + } +}; + + +template +< + std::size_t Dimension, typename Point, typename RobustBox, typename RobustPolicy > -static inline bool preceding(int dir, Point const& point, - RobustBox const& robust_box, - RobustPolicy const& robust_policy) +static inline bool preceding(int dir, + Point const& point, + RobustBox const& point_robust_box, + RobustBox const& other_robust_box, + RobustPolicy const& robust_policy) { typename geometry::robust_point_type<Point, RobustPolicy>::type robust_point; geometry::recalculate(robust_point, point, robust_policy); - return (dir == 1 && get<Dimension>(robust_point) < get<min_corner, Dimension>(robust_box)) - || (dir == -1 && get<Dimension>(robust_point) > get<max_corner, Dimension>(robust_box)); + return preceding_check<Dimension, Point>::apply(dir, robust_point, point_robust_box, other_robust_box); } template @@ -51,14 +120,13 @@ template typename RobustBox, typename RobustPolicy > -static inline bool exceeding(int dir, Point const& point, - RobustBox const& robust_box, - RobustPolicy const& robust_policy) +static inline bool exceeding(int dir, + Point const& point, + RobustBox const& point_robust_box, + RobustBox const& other_robust_box, + RobustPolicy const& robust_policy) { - typename geometry::robust_point_type<Point, RobustPolicy>::type robust_point; - geometry::recalculate(robust_point, point, robust_policy); - return (dir == 1 && get<Dimension>(robust_point) > get<max_corner, Dimension>(robust_box)) - || (dir == -1 && get<Dimension>(robust_point) < get<min_corner, Dimension>(robust_box)); + return preceding<Dimension>(-dir, point, point_robust_box, other_robust_box, robust_policy); } |