From 3ff1382c613abe1d1087fc094e2b599dcd1fcb4e Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Wed, 22 Mar 2017 20:57:35 +0100 Subject: [PATCH] [strategies] Add envelope-seg and disjoint-seg-box getters to intersection, side and within strategies. --- .../agnostic/point_in_poly_winding.hpp | 14 ++++++++++ .../strategies/cartesian/intersection.hpp | 9 +++++++ .../strategies/cartesian/side_by_triangle.hpp | 16 ++++++++++++ .../strategies/geographic/intersection.hpp | 17 +++++++++--- .../geometry/strategies/geographic/side.hpp | 26 +++++++++++++++++++ .../strategies/spherical/intersection.hpp | 9 +++++++ .../geometry/strategies/spherical/ssf.hpp | 16 ++++++++++++ 7 files changed, 103 insertions(+), 4 deletions(-) diff --git a/include/boost/geometry/strategies/agnostic/point_in_poly_winding.hpp b/include/boost/geometry/strategies/agnostic/point_in_poly_winding.hpp index 46278f012..8fffd659d 100644 --- a/include/boost/geometry/strategies/agnostic/point_in_poly_winding.hpp +++ b/include/boost/geometry/strategies/agnostic/point_in_poly_winding.hpp @@ -388,6 +388,20 @@ class winding public: + typedef typename SideStrategy::envelope_strategy_type envelope_strategy_type; + + inline envelope_strategy_type get_envelope_strategy() const + { + return m_side_strategy.get_envelope_strategy(); + } + + typedef typename SideStrategy::disjoint_strategy_type disjoint_strategy_type; + + inline disjoint_strategy_type get_disjoint_strategy() const + { + return m_side_strategy.get_disjoint_strategy(); + } + winding() {} diff --git a/include/boost/geometry/strategies/cartesian/intersection.hpp b/include/boost/geometry/strategies/cartesian/intersection.hpp index 20b6b9336..50e903885 100644 --- a/include/boost/geometry/strategies/cartesian/intersection.hpp +++ b/include/boost/geometry/strategies/cartesian/intersection.hpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -133,6 +134,14 @@ struct cartesian_segments return strategy_type(); } + typedef envelope::cartesian_segment + envelope_strategy_type; + + static inline envelope_strategy_type get_envelope_strategy() + { + return envelope_strategy_type(); + } + template struct segment_intersection_info { diff --git a/include/boost/geometry/strategies/cartesian/side_by_triangle.hpp b/include/boost/geometry/strategies/cartesian/side_by_triangle.hpp index ba7749ba7..4d1d97520 100644 --- a/include/boost/geometry/strategies/cartesian/side_by_triangle.hpp +++ b/include/boost/geometry/strategies/cartesian/side_by_triangle.hpp @@ -26,6 +26,9 @@ #include #include #include + +#include +#include #include #include @@ -66,6 +69,19 @@ class side_by_triangle }; public : + typedef strategy::envelope::cartesian_segment envelope_strategy_type; + + static inline envelope_strategy_type get_envelope_strategy() + { + return envelope_strategy_type(); + } + + typedef strategy::disjoint::segment_box disjoint_strategy_type; + + static inline disjoint_strategy_type get_disjoint_strategy() + { + return disjoint_strategy_type(); + } // Template member function, because it is not always trivial // or convenient to explicitly mention the typenames in the diff --git a/include/boost/geometry/strategies/geographic/intersection.hpp b/include/boost/geometry/strategies/geographic/intersection.hpp index 5a0a8eb58..84acd149c 100644 --- a/include/boost/geometry/strategies/geographic/intersection.hpp +++ b/include/boost/geometry/strategies/geographic/intersection.hpp @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -69,7 +70,7 @@ struct geographic_segments FormulaPolicy, Spheroid, CalculationType > side_strategy_type; - inline side_strategy_type get_side_strategy() + inline side_strategy_type get_side_strategy() const { return side_strategy_type(m_spheroid); } @@ -88,7 +89,7 @@ struct geographic_segments template inline typename point_in_geometry_strategy::type - get_point_in_geometry_strategy() + get_point_in_geometry_strategy() const { typedef typename point_in_geometry_strategy < @@ -111,7 +112,7 @@ struct geographic_segments }; template - inline typename area_strategy::type get_area_strategy() + inline typename area_strategy::type get_area_strategy() const { typedef typename area_strategy::type strategy_type; return strategy_type(m_spheroid); @@ -129,12 +130,20 @@ struct geographic_segments }; template - inline typename distance_strategy::type get_distance_strategy() + inline typename distance_strategy::type get_distance_strategy() const { typedef typename distance_strategy::type strategy_type; return strategy_type(m_spheroid); } + typedef envelope::geographic_segment + envelope_strategy_type; + + inline envelope_strategy_type get_envelope_strategy() const + { + return envelope_strategy_type(m_spheroid); + } + enum intersection_point_flag { ipi_inters = 0, ipi_at_a1, ipi_at_a2, ipi_at_b1, ipi_at_b2 }; template diff --git a/include/boost/geometry/strategies/geographic/side.hpp b/include/boost/geometry/strategies/geographic/side.hpp index 4cbfc6d31..6d71271b1 100644 --- a/include/boost/geometry/strategies/geographic/side.hpp +++ b/include/boost/geometry/strategies/geographic/side.hpp @@ -26,6 +26,8 @@ #include #include +#include +#include #include #include //#include @@ -56,6 +58,30 @@ template class geographic { public: + typedef strategy::envelope::geographic_segment + < + FormulaPolicy, + Spheroid, + CalculationType + > envelope_strategy_type; + + inline envelope_strategy_type get_envelope_strategy() const + { + return envelope_strategy_type(m_model); + } + + typedef strategy::disjoint::segment_box_geographic + < + FormulaPolicy, + Spheroid, + CalculationType + > disjoint_strategy_type; + + inline disjoint_strategy_type get_disjoint_strategy() const + { + return disjoint_strategy_type(m_model); + } + geographic() {} diff --git a/include/boost/geometry/strategies/spherical/intersection.hpp b/include/boost/geometry/strategies/spherical/intersection.hpp index 5d3758333..035961c0a 100644 --- a/include/boost/geometry/strategies/spherical/intersection.hpp +++ b/include/boost/geometry/strategies/spherical/intersection.hpp @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -147,6 +148,14 @@ struct ecef_segments return strategy_type(); } + typedef envelope::spherical_segment + envelope_strategy_type; + + static inline envelope_strategy_type get_envelope_strategy() + { + return envelope_strategy_type(); + } + enum intersection_point_flag { ipi_inters = 0, ipi_at_a1, ipi_at_a2, ipi_at_b1, ipi_at_b2 }; // segment_intersection_info cannot outlive relate_ecef_segments diff --git a/include/boost/geometry/strategies/spherical/ssf.hpp b/include/boost/geometry/strategies/spherical/ssf.hpp index c99e5835e..03f5428ed 100644 --- a/include/boost/geometry/strategies/spherical/ssf.hpp +++ b/include/boost/geometry/strategies/spherical/ssf.hpp @@ -23,6 +23,8 @@ #include #include +#include +#include //#include @@ -82,6 +84,20 @@ class spherical_side_formula { public : + typedef strategy::envelope::spherical_segment envelope_strategy_type; + + static inline envelope_strategy_type get_envelope_strategy() + { + return envelope_strategy_type(); + } + + typedef strategy::disjoint::segment_box_spherical disjoint_strategy_type; + + static inline disjoint_strategy_type get_disjoint_strategy() + { + return disjoint_strategy_type(); + } + template static inline int apply(P1 const& p1, P2 const& p2, P const& p) {