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