diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp b/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp index 019c3ba3f9..63011c7d48 100644 --- a/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp +++ b/boost/geometry/algorithms/detail/overlay/get_intersection_points.hpp @@ -17,6 +17,7 @@ #include <boost/geometry/geometries/segment.hpp> +#include <boost/geometry/policies/robustness/robust_point_type.hpp> namespace boost { namespace geometry { @@ -35,32 +36,45 @@ template > struct get_turn_without_info { - typedef strategy_intersection - < - typename cs_tag<typename TurnInfo::point_type>::type, - Point1, - Point2, - typename TurnInfo::point_type - > si; - - typedef typename si::segment_intersection_strategy_type strategy; - - - - template <typename OutputIterator> + template <typename RobustPolicy, typename OutputIterator> static inline OutputIterator apply( - Point1 const& pi, Point1 const& pj, Point1 const& pk, - Point2 const& qi, Point2 const& qj, Point2 const& qk, + Point1 const& pi, Point1 const& pj, Point1 const& /*pk*/, + Point2 const& qi, Point2 const& qj, Point2 const& /*qk*/, + bool /*is_p_first*/, bool /*is_p_last*/, + bool /*is_q_first*/, bool /*is_q_last*/, TurnInfo const& , + RobustPolicy const& robust_policy, OutputIterator out) { + typedef strategy_intersection + < + typename cs_tag<typename TurnInfo::point_type>::type, + Point1, + Point2, + typename TurnInfo::point_type, + RobustPolicy + > si; + + typedef typename si::segment_intersection_strategy_type strategy; + typedef model::referring_segment<Point1 const> segment_type1; typedef model::referring_segment<Point1 const> segment_type2; - segment_type1 p1(pi, pj), p2(pj, pk); - segment_type2 q1(qi, qj), q2(qj, qk); + segment_type1 p1(pi, pj); + segment_type2 q1(qi, qj); - // - typename strategy::return_type result = strategy::apply(p1, q1); + typedef typename geometry::robust_point_type + < + Point1, RobustPolicy + >::type robust_point_type; + + robust_point_type pi_rob, pj_rob, qi_rob, qj_rob; + geometry::recalculate(pi_rob, pi, robust_policy); + geometry::recalculate(pj_rob, pj, robust_policy); + geometry::recalculate(qi_rob, qi, robust_policy); + geometry::recalculate(qj_rob, qj, robust_policy); + typename strategy::return_type result + = strategy::apply(p1, q1, robust_policy, + pi_rob, pj_rob, qi_rob, qj_rob); for (std::size_t i = 0; i < result.template get<0>().count; i++) { @@ -84,10 +98,12 @@ template < typename Geometry1, typename Geometry2, + typename RobustPolicy, typename Turns > inline void get_intersection_points(Geometry1 const& geometry1, Geometry2 const& geometry2, + RobustPolicy const& robust_policy, Turns& turns) { concept::check_concepts_and_equal_dimensions<Geometry1 const, Geometry2 const>(); @@ -99,14 +115,6 @@ inline void get_intersection_points(Geometry1 const& geometry1, typename boost::range_value<Turns>::type > TurnPolicy; - typedef typename strategy_intersection - < - typename cs_tag<Geometry1>::type, - Geometry1, - Geometry2, - typename boost::range_value<Turns>::type - >::segment_intersection_strategy_type segment_intersection_strategy_type; - detail::get_turns::no_interrupt_policy interrupt_policy; boost::mpl::if_c @@ -118,9 +126,7 @@ inline void get_intersection_points(Geometry1 const& geometry1, typename tag<Geometry2>::type, Geometry1, Geometry2, false, false, - Turns, TurnPolicy, - //segment_intersection_strategy_type, - detail::get_turns::no_interrupt_policy + TurnPolicy >, dispatch::get_turns < @@ -128,13 +134,12 @@ inline void get_intersection_points(Geometry1 const& geometry1, typename tag<Geometry2>::type, Geometry1, Geometry2, false, false, - Turns, TurnPolicy, - //segment_intersection_strategy_type, - detail::get_turns::no_interrupt_policy + TurnPolicy > >::type::apply( 0, geometry1, 1, geometry2, + robust_policy, turns, interrupt_policy); } |