]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/geometry/algorithms/detail/disjoint/areal_areal.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / geometry / algorithms / detail / disjoint / areal_areal.hpp
index 664c9953846c3e5b4a82dc8b533b2d35ffa93ce4..3fccc74d223f75185aa3674907d1273f0f7ec10a 100644 (file)
@@ -5,8 +5,8 @@
 // Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
 // Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland.
 
-// This file was modified by Oracle on 2013-2017.
-// Modifications copyright (c) 2013-2017, Oracle and/or its affiliates.
+// This file was modified by Oracle on 2013-2019.
+// Modifications copyright (c) 2013-2019, Oracle and/or its affiliates.
 
 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
@@ -28,6 +28,9 @@
 #include <boost/geometry/algorithms/detail/point_on_border.hpp>
 
 #include <boost/geometry/algorithms/detail/disjoint/linear_linear.hpp>
+#include <boost/geometry/algorithms/detail/disjoint/segment_box.hpp>
+
+#include <boost/geometry/iterators/segment_iterator.hpp>
 
 
 namespace boost { namespace geometry
@@ -38,30 +41,15 @@ namespace boost { namespace geometry
 namespace detail { namespace disjoint
 {
 
-
-template <typename Geometry, typename Tag = typename tag<Geometry>::type>
-struct check_each_ring_for_within_call_covered_by
+template <typename Geometry1, typename Geometry2, typename Strategy>
+inline bool point_on_border_covered_by(Geometry1 const& geometry1,
+                                       Geometry2 const& geometry2,
+                                       Strategy const& strategy)
 {
-    /*!
-    \tparam Strategy point_in_geometry strategy
-    */
-    template <typename Point, typename Strategy>
-    static inline bool apply(Point const& p, Geometry const& g, Strategy const& strategy)
-    {
-        return geometry::covered_by(p, g, strategy);
-    }
-};
-
-template <typename Geometry>
-struct check_each_ring_for_within_call_covered_by<Geometry, box_tag>
-{
-    template <typename Point, typename Strategy>
-    static inline bool apply(Point const& p, Geometry const& g, Strategy const& )
-    {
-        return geometry::covered_by(p, g);
-    }
-};
-
+    typename geometry::point_type<Geometry1>::type pt;
+    return geometry::point_on_border(pt, geometry1)
+        && geometry::covered_by(pt, geometry2, strategy);
+}
 
 /*!
 \tparam Strategy point_in_geometry strategy
@@ -83,13 +71,8 @@ struct check_each_ring_for_within
     template <typename Range>
     inline void apply(Range const& range)
     {
-        typename point_type<Range>::type pt;
         not_disjoint = not_disjoint
-                || ( geometry::point_on_border(pt, range)
-                  && check_each_ring_for_within_call_covered_by
-                        <
-                            Geometry
-                        >::apply(pt, m_geometry, m_strategy) );
+                    || point_on_border_covered_by(range, m_geometry, m_strategy);
     }
 };
 
@@ -113,7 +96,7 @@ inline bool rings_containing(FirstGeometry const& geometry1,
 
 
 template <typename Geometry1, typename Geometry2>
-struct general_areal
+struct areal_areal
 {
     /*!
     \tparam Strategy relate (segments intersection) strategy
@@ -147,6 +130,56 @@ struct general_areal
 };
 
 
+template <typename Areal, typename Box>
+struct areal_box
+{
+    /*!
+    \tparam Strategy relate (segments intersection) strategy
+    */
+    template <typename Strategy>
+    static inline bool apply(Areal const& areal,
+                             Box const& box,
+                             Strategy const& strategy)
+    {
+        if ( ! for_each_segment(geometry::segments_begin(areal),
+                                geometry::segments_end(areal),
+                                box,
+                                strategy.get_disjoint_segment_box_strategy()) )
+        {
+            return false;
+        }
+
+        // If there is no intersection of any segment and box,
+        // the box might be located inside areal geometry
+
+        if ( point_on_border_covered_by(box, areal,
+                strategy.template get_point_in_geometry_strategy<Box, Areal>()) )
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+private:
+    template <typename SegIter, typename Strategy>
+    static inline bool for_each_segment(SegIter first,
+                                        SegIter last,
+                                        Box const& box,
+                                        Strategy const& strategy)
+    {
+        for ( ; first != last ; ++first)
+        {
+            if (! disjoint_segment_box::apply(*first, box, strategy))
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+};
+
+
 }} // namespace detail::disjoint
 #endif // DOXYGEN_NO_DETAIL
 
@@ -160,13 +193,13 @@ namespace dispatch
 
 template <typename Areal1, typename Areal2>
 struct disjoint<Areal1, Areal2, 2, areal_tag, areal_tag, false>
-    : detail::disjoint::general_areal<Areal1, Areal2>
+    : detail::disjoint::areal_areal<Areal1, Areal2>
 {};
 
 
 template <typename Areal, typename Box>
 struct disjoint<Areal, Box, 2, areal_tag, box_tag, false>
-    : detail::disjoint::general_areal<Areal, Box>
+    : detail::disjoint::areal_box<Areal, Box>
 {};