diff options
Diffstat (limited to 'boost/geometry/algorithms/difference.hpp')
-rw-r--r-- | boost/geometry/algorithms/difference.hpp | 45 |
1 files changed, 27 insertions, 18 deletions
diff --git a/boost/geometry/algorithms/difference.hpp b/boost/geometry/algorithms/difference.hpp index 480dd928de..780436f015 100644 --- a/boost/geometry/algorithms/difference.hpp +++ b/boost/geometry/algorithms/difference.hpp @@ -12,6 +12,7 @@ #include <algorithm> #include <boost/geometry/algorithms/detail/overlay/intersection_insert.hpp> +#include <boost/geometry/policies/robustness/get_rescale_policy.hpp> namespace boost { namespace geometry { @@ -43,33 +44,28 @@ template typename GeometryOut, typename Geometry1, typename Geometry2, + typename RobustPolicy, typename OutputIterator, typename Strategy > inline OutputIterator difference_insert(Geometry1 const& geometry1, - Geometry2 const& geometry2, OutputIterator out, + Geometry2 const& geometry2, + RobustPolicy const& robust_policy, + OutputIterator out, Strategy const& strategy) { concept::check<Geometry1 const>(); concept::check<Geometry2 const>(); concept::check<GeometryOut>(); - + return geometry::dispatch::intersection_insert < - typename geometry::tag<Geometry1>::type, - typename geometry::tag<Geometry2>::type, - typename geometry::tag<GeometryOut>::type, - geometry::is_areal<Geometry1>::value, - geometry::is_areal<Geometry2>::value, - geometry::is_areal<GeometryOut>::value, Geometry1, Geometry2, - geometry::detail::overlay::do_reverse<geometry::point_order<Geometry1>::value>::value, - geometry::detail::overlay::do_reverse<geometry::point_order<Geometry2>::value, true>::value, - geometry::detail::overlay::do_reverse<geometry::point_order<GeometryOut>::value>::value, - OutputIterator, GeometryOut, + GeometryOut, overlay_difference, - Strategy - >::apply(geometry1, geometry2, out, strategy); + geometry::detail::overlay::do_reverse<geometry::point_order<Geometry1>::value>::value, + geometry::detail::overlay::do_reverse<geometry::point_order<Geometry2>::value, true>::value + >::apply(geometry1, geometry2, robust_policy, out, strategy); } /*! @@ -93,10 +89,13 @@ template typename GeometryOut, typename Geometry1, typename Geometry2, + typename RobustPolicy, typename OutputIterator > inline OutputIterator difference_insert(Geometry1 const& geometry1, - Geometry2 const& geometry2, OutputIterator out) + Geometry2 const& geometry2, + RobustPolicy const& robust_policy, + OutputIterator out) { concept::check<Geometry1 const>(); concept::check<Geometry2 const>(); @@ -107,11 +106,12 @@ inline OutputIterator difference_insert(Geometry1 const& geometry1, typename cs_tag<GeometryOut>::type, Geometry1, Geometry2, - typename geometry::point_type<GeometryOut>::type + typename geometry::point_type<GeometryOut>::type, + RobustPolicy > strategy; return difference_insert<GeometryOut>(geometry1, geometry2, - out, strategy()); + robust_policy, out, strategy()); } @@ -148,8 +148,17 @@ inline void difference(Geometry1 const& geometry1, typedef typename boost::range_value<Collection>::type geometry_out; concept::check<geometry_out>(); + typedef typename geometry::rescale_overlay_policy_type + < + Geometry1, + Geometry2 + >::type rescale_policy_type; + + rescale_policy_type robust_policy + = geometry::get_rescale_policy<rescale_policy_type>(geometry1, geometry2); + detail::difference::difference_insert<geometry_out>( - geometry1, geometry2, + geometry1, geometry2, robust_policy, std::back_inserter(output_collection)); } |