summaryrefslogtreecommitdiff
path: root/boost/geometry/algorithms/detail/sections/section_functions.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/geometry/algorithms/detail/sections/section_functions.hpp')
-rw-r--r--boost/geometry/algorithms/detail/sections/section_functions.hpp96
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);
}