3 // Copyright (c) 2017 Barend Gehrels, Amsterdam, the Netherlands.
5 // Use, modification and distribution is subject to the Boost Software License,
6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 #ifndef BOOST_GEOMETRY_TEST_DEBUG_SORT_BY_SIDE_SVG_HPP
10 #define BOOST_GEOMETRY_TEST_DEBUG_SORT_BY_SIDE_SVG_HPP
16 #include <boost/geometry/io/svg/svg_mapper.hpp>
17 #include <boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>
18 #include <boost/geometry/algorithms/detail/overlay/sort_by_side.hpp>
20 namespace boost { namespace geometry { namespace debug
24 template <typename Sbs, typename Point, typename Geometry1, typename Geometry2>
25 inline void sorted_side_map(std::string const& case_id,
26 Sbs const& sbs, Point const& point,
27 Geometry1 const& geometry1,
28 Geometry2 const& geometry2,
29 int take_turn_index = -1, int take_operation_index = -1)
32 // Check number of sources (buffer has only one source)
33 std::set<signed_size_type> sources;
34 for (std::size_t i = 0; i < sbs.m_ranked_points.size(); i++)
36 const typename Sbs::rp& er = sbs.m_ranked_points[i];
37 sources.insert(er.seg_id.source_index);
39 std::size_t const source_count = sources.size();
41 std::ostringstream filename;
42 filename << "sort_by_side_" << case_id << ".svg";
43 std::ofstream svg(filename.str().c_str());
45 typedef geometry::svg_mapper<Point> mapper_type;
46 typedef geometry::model::referring_segment<Point const> seg;
48 mapper_type mapper(svg, 500, 500);
50 for (std::size_t i = 0; i < sbs.m_ranked_points.size(); i++)
52 const typename Sbs::rp& er = sbs.m_ranked_points[i];
56 if (sources.count(0) > 0)
58 mapper.map(geometry1, "fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);stroke-width:0");
60 if (sources.count(1) > 0)
62 mapper.map(geometry2, "fill-opacity:0.3;fill:rgb(51,51,153);stroke:rgb(51,51,153);stroke-width:0");
65 const std::string style = "fill:rgb(0,0,0);font-family:Arial;font-size:10px;";
66 for (std::size_t i = 0; i < sbs.m_ranked_points.size(); i++)
68 const typename Sbs::rp& er = sbs.m_ranked_points[i];
70 std::ostringstream out;
74 << " " << (er.direction == detail::overlay::sort_by_side::dir_to ? "t" : "f")
75 << " " << er.turn_index
76 << "[" << er.operation_index << "]";
78 if (er.direction == detail::overlay::sort_by_side::dir_to)
80 out << " L=" << er.count_left << " R=" << er.count_right;
84 out << " l=" << er.count_left << " r=" << er.count_right;
86 out << " " << operation_char(er.operation);
89 out << " s=" << er.seg_id.source_index;
92 bool left = (i / 2) % 2 == 1;
93 int x_offset = left ? -6 : 6;
94 int y_offset = i % 2 == 0 ? 0 : 10;
95 const std::string align = left ? "text-anchor:end;" : "";
97 std::string const source_style
98 = er.seg_id.source_index == 0
99 ? "opacity:0.7;stroke:rgb(0,255,0);stroke-width:4;"
100 : "opacity:0.7;stroke:rgb(0,0,255);stroke-width:4;";
101 mapper.map(seg(point, er.point), source_style);
103 if (er.direction == detail::overlay::sort_by_side::dir_to)
105 if (er.turn_index == take_turn_index
106 && er.operation_index == take_operation_index)
108 mapper.map(er.point, "opacity:0.7;fill:rgb(255,0,255);", 3);
112 mapper.map(er.point, "opacity:0.7;fill:rgb(0,0,0);", 3);
116 mapper.text(er.point, out.str(), style + align, x_offset, y_offset);
118 mapper.map(sbs.m_origin, "opacity:0.9;fill:rgb(255,0,0);", 5);
121 }}} // namespace boost::geometry::debug
123 #endif // BOOST_GEOMETRY_TEST_DEBUG_SORT_BY_SIDE_SVG_HPP