debug_sort_by_side_svg.hpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Boost.Geometry
  2. // Copyright (c) 2017 Barend Gehrels, Amsterdam, the Netherlands.
  3. // Use, modification and distribution is subject to the Boost Software License,
  4. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #ifndef BOOST_GEOMETRY_TEST_DEBUG_SORT_BY_SIDE_SVG_HPP
  7. #define BOOST_GEOMETRY_TEST_DEBUG_SORT_BY_SIDE_SVG_HPP
  8. #include <fstream>
  9. #include <sstream>
  10. #include <set>
  11. #include <boost/geometry/io/svg/svg_mapper.hpp>
  12. #include <boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>
  13. #include <boost/geometry/algorithms/detail/overlay/sort_by_side.hpp>
  14. namespace boost { namespace geometry { namespace debug
  15. {
  16. template <typename Sbs, typename Point, typename Geometry1, typename Geometry2>
  17. inline void sorted_side_map(std::string const& case_id,
  18. Sbs const& sbs, Point const& point,
  19. Geometry1 const& geometry1,
  20. Geometry2 const& geometry2,
  21. int take_turn_index = -1, int take_operation_index = -1)
  22. {
  23. // Check number of sources (buffer has only one source)
  24. std::set<signed_size_type> sources;
  25. for (std::size_t i = 0; i < sbs.m_ranked_points.size(); i++)
  26. {
  27. const typename Sbs::rp& er = sbs.m_ranked_points[i];
  28. sources.insert(er.seg_id.source_index);
  29. }
  30. std::size_t const source_count = sources.size();
  31. std::ostringstream filename;
  32. filename << "sort_by_side_" << case_id << ".svg";
  33. std::ofstream svg(filename.str().c_str());
  34. typedef geometry::svg_mapper<Point> mapper_type;
  35. typedef geometry::model::referring_segment<Point const> seg;
  36. mapper_type mapper(svg, 500, 500);
  37. for (std::size_t i = 0; i < sbs.m_ranked_points.size(); i++)
  38. {
  39. const typename Sbs::rp& er = sbs.m_ranked_points[i];
  40. mapper.add(er.point);
  41. }
  42. if (sources.count(0) > 0)
  43. {
  44. mapper.map(geometry1, "fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);stroke-width:0");
  45. }
  46. if (sources.count(1) > 0)
  47. {
  48. mapper.map(geometry2, "fill-opacity:0.3;fill:rgb(51,51,153);stroke:rgb(51,51,153);stroke-width:0");
  49. }
  50. const std::string style = "fill:rgb(0,0,0);font-family:Arial;font-size:10px;";
  51. for (std::size_t i = 0; i < sbs.m_ranked_points.size(); i++)
  52. {
  53. const typename Sbs::rp& er = sbs.m_ranked_points[i];
  54. std::ostringstream out;
  55. out << er.rank
  56. << " (" << i << ")"
  57. << " z=" << er.zone
  58. << " " << (er.direction == detail::overlay::sort_by_side::dir_to ? "t" : "f")
  59. << " " << er.turn_index
  60. << "[" << er.operation_index << "]";
  61. if (er.direction == detail::overlay::sort_by_side::dir_to)
  62. {
  63. out << " L=" << er.count_left << " R=" << er.count_right;
  64. }
  65. else
  66. {
  67. out << " l=" << er.count_left << " r=" << er.count_right;
  68. }
  69. out << " " << operation_char(er.operation);
  70. if (source_count > 1)
  71. {
  72. out << " s=" << er.seg_id.source_index;
  73. }
  74. bool left = (i / 2) % 2 == 1;
  75. int x_offset = left ? -6 : 6;
  76. int y_offset = i % 2 == 0 ? 0 : 10;
  77. const std::string align = left ? "text-anchor:end;" : "";
  78. std::string const source_style
  79. = er.seg_id.source_index == 0
  80. ? "opacity:0.7;stroke:rgb(0,255,0);stroke-width:4;"
  81. : "opacity:0.7;stroke:rgb(0,0,255);stroke-width:4;";
  82. mapper.map(seg(point, er.point), source_style);
  83. if (er.direction == detail::overlay::sort_by_side::dir_to)
  84. {
  85. if (er.turn_index == take_turn_index
  86. && er.operation_index == take_operation_index)
  87. {
  88. mapper.map(er.point, "opacity:0.7;fill:rgb(255,0,255);", 3);
  89. }
  90. else
  91. {
  92. mapper.map(er.point, "opacity:0.7;fill:rgb(0,0,0);", 3);
  93. }
  94. }
  95. mapper.text(er.point, out.str(), style + align, x_offset, y_offset);
  96. }
  97. mapper.map(sbs.m_origin, "opacity:0.9;fill:rgb(255,0,0);", 5);
  98. }
  99. }}} // namespace boost::geometry::debug
  100. #endif // BOOST_GEOMETRY_TEST_DEBUG_SORT_BY_SIDE_SVG_HPP