static inline OutputIterator apply(Linear1 const& linear1, Linear2 const& linear2, RobustPolicy const& robust_policy, OutputIterator oit, Strategy const& ) { typedef typename detail::relate::turns::get_turns < Linear1, Linear2, detail::get_turns::get_turn_info_type < Linear1, Linear2, assign_policy >, RobustPolicy >::turn_info turn_info; typedef std::vector<turn_info> turns_container; turns_container turns; compute_turns(turns, linear1, linear2, robust_policy); if ( turns.empty() ) { // the two linear geometries are disjoint return linear_linear_no_intersections < LinestringOut, OverlayType, Linear1, typename tag<Linear1>::type >::apply(linear1, oit); } return sort_and_follow_turns < OverlayType, EnableFollowIsolatedPoints && OverlayType == overlay_intersection >(turns, linear1, linear2, oit); }
static inline void apply(Linear1 const& lineargeometry1, Linear2 const& lineargeometry2) { typedef typename bg_detail::relate::turns::get_turns < Linear1, Linear2 >::turn_info turn_info; typedef std::vector<turn_info> turns_container; typedef bg_turns::filter_continue_turns < turns_container, true > filter_continue_turns; typedef bg_turns::remove_duplicate_turns < turns_container, EnableRemoveDuplicateTurns > remove_duplicate_turns; turns_container turns; Linear1 linear1(lineargeometry1); Linear2 linear2(lineargeometry2); Linear2 linear2_reverse(linear2); boost::geometry::reverse(linear2_reverse); turns_container turns_all, rturns_all; compute_turns(turns_all, linear1, linear2); compute_turns(rturns_all, linear1, linear2_reverse); turns_container turns_wo_cont(turns_all); turns_container rturns_wo_cont(rturns_all); filter_continue_turns::apply(turns_wo_cont); filter_continue_turns::apply(rturns_wo_cont); std::sort(boost::begin(turns_all), boost::end(turns_all), bg_turns::less_seg_fraction_other_op<>()); std::sort(boost::begin(turns_wo_cont), boost::end(turns_wo_cont), bg_turns::less_seg_fraction_other_op<>()); std::sort(boost::begin(rturns_all), boost::end(rturns_all), bg_turns::less_seg_fraction_other_op<std::greater<boost::geometry::signed_size_type> >()); std::sort(boost::begin(rturns_wo_cont), boost::end(rturns_wo_cont), bg_turns::less_seg_fraction_other_op<std::greater<boost::geometry::signed_size_type> >()); remove_duplicate_turns::apply(turns_all); remove_duplicate_turns::apply(turns_wo_cont); remove_duplicate_turns::apply(rturns_all); remove_duplicate_turns::apply(rturns_wo_cont); #ifdef BOOST_GEOMETRY_TEST_DEBUG std::cout << std::endl << std::endl; std::cout << "### ORIGINAL TURNS ###" << std::endl; bg_turns::print_turns(linear1, linear2, turns_all); std::cout << std::endl << std::endl; std::cout << "### ORIGINAL REVERSE TURNS ###" << std::endl; bg_turns::print_turns(linear1, linear2_reverse, rturns_all); std::cout << std::endl << std::endl; std::cout << "### TURNS W/O CONTINUE TURNS ###" << std::endl; bg_turns::print_turns(linear1, linear2, turns_wo_cont); std::cout << std::endl << std::endl; std::cout << "### REVERSE TURNS W/O CONTINUE TURNS ###" << std::endl; bg_turns::print_turns(linear1, linear2_reverse, rturns_wo_cont); std::cout << std::endl << std::endl; #endif BOOST_CHECK_MESSAGE(boost::size(turns_wo_cont) == boost::size(rturns_wo_cont), "Incompatible turns count: " << boost::size(turns_wo_cont) << " and " << boost::size(rturns_wo_cont) << " for L1: " << bg::wkt(lineargeometry1) << ", L2: " << bg::wkt(lineargeometry2)); }