static inline OutputIterator apply(LineString const& linestring, Areal const& areal, OutputIterator out, Strategy const& ) { if (boost::size(linestring) == 0) { return out; } typedef detail::overlay::follow < LineStringOut, LineString, Areal, OverlayType > follower; typedef typename point_type<LineStringOut>::type point_type; typedef detail::overlay::traversal_turn_info<point_type> turn_info; std::deque<turn_info> turns; detail::get_turns::no_interrupt_policy policy; geometry::get_turns < false, (OverlayType == overlay_intersection ? ReverseAreal : !ReverseAreal), detail::overlay::calculate_distance_policy >(linestring, areal, turns, policy); if (turns.empty()) { // No intersection points, it is either completely // inside (interior + borders) // or completely outside // Use border point (on a segment) to check this // (because turn points might skip some cases) point_type border_point; if (! geometry::point_on_border(border_point, linestring, true)) { return out; } if (follower::included(border_point, areal)) { LineStringOut copy; geometry::convert(linestring, copy); *out++ = copy; } return out; } #if defined(BOOST_GEOMETRY_DEBUG_FOLLOW) int index = 0; BOOST_FOREACH(turn_info const& turn, turns) { debug_follow(turn, turn.operations[0], index++); }
static inline OutputIterator apply(LineString const& linestring, Areal const& areal, RobustPolicy const& robust_policy, OutputIterator out, Strategy const& ) { if (boost::size(linestring) == 0) { return out; } typedef detail::overlay::follow < LineStringOut, LineString, Areal, OverlayType, false // do not remove spikes for linear geometries > follower; typedef typename point_type<LineStringOut>::type point_type; typedef detail::overlay::traversal_turn_info < point_type, typename geometry::segment_ratio_type<point_type, RobustPolicy>::type > turn_info; std::deque<turn_info> turns; detail::get_turns::no_interrupt_policy policy; geometry::get_turns < false, (OverlayType == overlay_intersection ? ReverseAreal : !ReverseAreal), detail::overlay::assign_null_policy >(linestring, areal, robust_policy, turns, policy); if (no_crossing_turns_or_empty(turns)) { // No intersection points, it is either completely // inside (interior + borders) // or completely outside // Use border point (on a segment) to check this // (because turn points might skip some cases) point_type border_point; if (! geometry::point_on_border(border_point, linestring, true)) { return out; } if (follower::included(border_point, areal, robust_policy)) { LineStringOut copy; geometry::convert(linestring, copy); *out++ = copy; } return out; } #if defined(BOOST_GEOMETRY_DEBUG_FOLLOW) int index = 0; for(typename std::deque<turn_info>::const_iterator it = turns.begin(); it != turns.end(); ++it) { debug_follow(*it, it->operations[0], index++); } #endif return follower::apply ( linestring, areal, geometry::detail::overlay::operation_intersection, turns, robust_policy, out ); }