inline void map_offsetted_rings(OffsettedRings const& offsetted_rings) { for(typename boost::range_iterator<OffsettedRings const>::type it = boost::begin(offsetted_rings); it != boost::end(offsetted_rings); ++it) { if (it->discarded()) { m_mapper.map(*it, "opacity:0.4;fill:none;stroke:rgb(255,0,0);stroke-width:2"); } else { m_mapper.map(*it, "opacity:0.4;fill:none;stroke:rgb(0,0,255);stroke-width:2"); } } }
void checkProxyBase(Vector& vec, std::size_t nnz){ Proxy proxy(vec); //check basic properties BOOST_REQUIRE_EQUAL(proxy.nnz(),nnz); BOOST_REQUIRE_EQUAL(proxy.size(),vec.size()); //check iterators typename boost::range_iterator<Proxy>::type proxyiter = proxy.begin(); typename boost::range_iterator<Vector>::type vectoriter = vec.begin(); for(;vectoriter != vec.end(); ++vectoriter, ++ proxyiter){ BOOST_REQUIRE(proxyiter != proxy.end()); BOOST_CHECK_EQUAL(vectoriter.index(), proxyiter.index()); BOOST_CHECK_EQUAL(*vectoriter, *proxyiter); } }
inline void map_turns(Turns const& turns, bool label_good_turns, bool label_wrong_turns) { namespace bgdb = boost::geometry::detail::buffer; typedef typename boost::range_value<Turns const>::type turn_type; typedef typename turn_type::point_type point_type; typedef typename turn_type::robust_point_type robust_point_type; std::map<robust_point_type, int, bg::less<robust_point_type> > offsets; for (typename boost::range_iterator<Turns const>::type it = boost::begin(turns); it != boost::end(turns); ++it) { if (m_zoom && bg::disjoint(it->point, m_alternate_box)) { continue; } bool is_good = true; char color = 'g'; std::string fill = "fill:rgb(0,255,0);"; switch(it->location) { case bgdb::inside_buffer : fill = "fill:rgb(255,0,0);"; color = 'r'; is_good = false; break; case bgdb::location_discard : fill = "fill:rgb(0,0,255);"; color = 'b'; is_good = false; break; } if (!it->selectable_start) { fill = "fill:rgb(255,192,0);"; color = 'o'; // orange } if (it->blocked()) { fill = "fill:rgb(128,128,128);"; color = '-'; is_good = false; } fill += "fill-opacity:0.7;"; m_mapper.map(it->point, fill, 4); if ((label_good_turns && is_good) || (label_wrong_turns && ! is_good)) { std::ostringstream out; out << it->turn_index << " " << it->operations[0].piece_index << "/" << it->operations[1].piece_index << " " << si(it->operations[0].seg_id) << "/" << si(it->operations[1].seg_id) // If you want to see travel information << std::endl << " nxt " << it->operations[0].enriched.travels_to_ip_index << "/" << it->operations[1].enriched.travels_to_ip_index << " or " << it->operations[0].enriched.next_ip_index << "/" << it->operations[1].enriched.next_ip_index //<< " frac " << it->operations[0].fraction // If you want to see (robust)point coordinates (e.g. to find duplicates) << std::endl << std::setprecision(16) << bg::wkt(it->point) << std::endl << bg::wkt(it->robust_point) << std::endl; out << " " << bg::method_char(it->method) << ":" << bg::operation_char(it->operations[0].operation) << "/" << bg::operation_char(it->operations[1].operation); out << " " << (it->count_on_offsetted > 0 ? "b" : "") // b: offsetted border #if ! defined(BOOST_GEOMETRY_BUFFER_USE_SIDE_OF_INTERSECTION) << (it->count_within_near_offsetted > 0 ? "n" : "") #endif << (it->count_within > 0 ? "w" : "") << (it->count_on_helper > 0 ? "h" : "") << (it->count_on_multi > 0 ? "m" : "") ; offsets[it->get_robust_point()] += 10; int offset = offsets[it->get_robust_point()]; m_mapper.text(it->point, out.str(), "fill:rgb(0,0,0);font-family='Arial';font-size:9px;", 5, offset); offsets[it->get_robust_point()] += 25; } } }
inline void enrich_intersection_points(TurnPoints& turn_points, detail::overlay::operation_type for_operation, Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy) { typedef typename boost::range_value<TurnPoints>::type turn_point_type; typedef typename turn_point_type::turn_operation_type turn_operation_type; typedef detail::overlay::indexed_turn_operation < turn_operation_type > indexed_turn_operation; typedef std::map < ring_identifier, std::vector<indexed_turn_operation> > mapped_vector_type; // DISCARD ALL UU // #76 is the reason that this is necessary... // With uu, at all points there is the risk that rings are being traversed twice or more. // Without uu, all rings having only uu will be untouched and gathered by assemble for (typename boost::range_iterator<TurnPoints>::type it = boost::begin(turn_points); it != boost::end(turn_points); ++it) { if (it->both(detail::overlay::operation_union)) { it->discarded = true; } } // Create a map of vectors of indexed operation-types to be able // to sort intersection points PER RING mapped_vector_type mapped_vector; detail::overlay::create_map<indexed_turn_operation>(turn_points, mapped_vector); // No const-iterator; contents of mapped copy is temporary, // and changed by enrich for (typename mapped_vector_type::iterator mit = mapped_vector.begin(); mit != mapped_vector.end(); ++mit) { #ifdef BOOST_GEOMETRY_DEBUG_ENRICH std::cout << "ENRICH-sort Ring " << mit->first << std::endl; #endif detail::overlay::enrich_sort<indexed_turn_operation, Reverse1, Reverse2>(mit->second, turn_points, for_operation, geometry1, geometry2, strategy); } for (typename mapped_vector_type::iterator mit = mapped_vector.begin(); mit != mapped_vector.end(); ++mit) { #ifdef BOOST_GEOMETRY_DEBUG_ENRICH std::cout << "ENRICH-discard Ring " << mit->first << std::endl; #endif detail::overlay::enrich_discard<indexed_turn_operation>(mit->second, turn_points); } for (typename mapped_vector_type::iterator mit = mapped_vector.begin(); mit != mapped_vector.end(); ++mit) { #ifdef BOOST_GEOMETRY_DEBUG_ENRICH std::cout << "ENRICH-assign Ring " << mit->first << std::endl; #endif detail::overlay::enrich_assign<indexed_turn_operation>(mit->second, turn_points, for_operation, geometry1, geometry2, strategy); } #ifdef BOOST_GEOMETRY_DEBUG_ENRICH //detail::overlay::check_graph(turn_points, for_operation); #endif }
inline void enrich_intersection_points(Turns& turns, Clusters& clusters, detail::overlay::operation_type for_operation, Geometry1 const& geometry1, Geometry2 const& geometry2, RobustPolicy const& robust_policy, Strategy const& strategy) { typedef typename boost::range_value<Turns>::type turn_type; typedef typename turn_type::turn_operation_type op_type; typedef detail::overlay::indexed_turn_operation < op_type > indexed_turn_operation; typedef std::map < ring_identifier, std::vector<indexed_turn_operation> > mapped_vector_type; bool const has_colocations = detail::overlay::handle_colocations<Reverse1, Reverse2>(turns, clusters, geometry1, geometry2); // Discard none turns, if any for (typename boost::range_iterator<Turns>::type it = boost::begin(turns); it != boost::end(turns); ++it) { if (it->both(detail::overlay::operation_none)) { it->discarded = true; } } // Create a map of vectors of indexed operation-types to be able // to sort intersection points PER RING mapped_vector_type mapped_vector; detail::overlay::create_map(turns, for_operation, mapped_vector); // No const-iterator; contents of mapped copy is temporary, // and changed by enrich for (typename mapped_vector_type::iterator mit = mapped_vector.begin(); mit != mapped_vector.end(); ++mit) { #ifdef BOOST_GEOMETRY_DEBUG_ENRICH std::cout << "ENRICH-sort Ring " << mit->first << std::endl; #endif detail::overlay::enrich_sort<Reverse1, Reverse2>( mit->second, turns, for_operation, geometry1, geometry2, robust_policy, strategy); } for (typename mapped_vector_type::iterator mit = mapped_vector.begin(); mit != mapped_vector.end(); ++mit) { #ifdef BOOST_GEOMETRY_DEBUG_ENRICH std::cout << "ENRICH-assign Ring " << mit->first << std::endl; #endif detail::overlay::enrich_assign(mit->second, turns); } if (has_colocations) { detail::overlay::assign_startable_in_clusters<Reverse1, Reverse2>( clusters, turns, for_operation, geometry1, geometry2); } #ifdef BOOST_GEOMETRY_DEBUG_ENRICH //detail::overlay::check_graph(turns, for_operation); #endif }