is_straight_line_draw_test.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. //=======================================================================
  2. // Copyright 2008 Aaron Windsor
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See
  5. // accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //=======================================================================
  8. #include <boost/property_map/property_map.hpp>
  9. #include <boost/test/minimal.hpp>
  10. #include <boost/graph/adjacency_list.hpp>
  11. #include <boost/graph/properties.hpp>
  12. #include <boost/graph/graph_traits.hpp>
  13. #include <boost/graph/is_straight_line_drawing.hpp>
  14. #include <vector>
  15. using namespace boost;
  16. struct coord_t
  17. {
  18. std::size_t x;
  19. std::size_t y;
  20. };
  21. int test_main(int, char*[])
  22. {
  23. typedef adjacency_list< vecS, vecS, undirectedS,
  24. property<vertex_index_t, int>
  25. > graph_t;
  26. typedef std::vector< coord_t > drawing_storage_t;
  27. typedef boost::iterator_property_map
  28. < drawing_storage_t::iterator,
  29. property_map<graph_t, vertex_index_t>::type
  30. > drawing_t;
  31. graph_t g(4);
  32. add_edge(0,1,g);
  33. add_edge(2,3,g);
  34. drawing_storage_t drawing_storage(num_vertices(g));
  35. drawing_t drawing(drawing_storage.begin(), get(vertex_index,g));
  36. // two perpendicular lines that intersect at (1,1)
  37. drawing[0].x = 1; drawing[0].y = 0;
  38. drawing[1].x = 1; drawing[1].y = 2;
  39. drawing[2].x = 0; drawing[2].y = 1;
  40. drawing[3].x = 2; drawing[3].y = 1;
  41. BOOST_REQUIRE(!is_straight_line_drawing(g,drawing));
  42. // two parallel horizontal lines
  43. drawing[0].x = 0; drawing[0].y = 0;
  44. drawing[1].x = 2; drawing[1].y = 0;
  45. BOOST_REQUIRE(is_straight_line_drawing(g,drawing));
  46. // two parallel vertical lines
  47. drawing[0].x = 0; drawing[0].y = 0;
  48. drawing[1].x = 0; drawing[1].y = 2;
  49. drawing[2].x = 1; drawing[2].y = 0;
  50. drawing[3].x = 1; drawing[3].y = 2;
  51. BOOST_REQUIRE(is_straight_line_drawing(g,drawing));
  52. // two lines that intersect at (1,1)
  53. drawing[0].x = 0; drawing[0].y = 0;
  54. drawing[1].x = 2; drawing[1].y = 2;
  55. drawing[2].x = 0; drawing[2].y = 2;
  56. drawing[3].x = 2; drawing[3].y = 0;
  57. BOOST_REQUIRE(!is_straight_line_drawing(g,drawing));
  58. // K_4 arranged in a diamond pattern, so that edges intersect
  59. g = graph_t(4);
  60. add_edge(0,1,g);
  61. add_edge(0,2,g);
  62. add_edge(0,3,g);
  63. add_edge(1,2,g);
  64. add_edge(1,3,g);
  65. add_edge(2,3,g);
  66. drawing_storage = drawing_storage_t(num_vertices(g));
  67. drawing = drawing_t(drawing_storage.begin(), get(vertex_index,g));
  68. drawing[0].x = 1; drawing[0].y = 2;
  69. drawing[1].x = 2; drawing[1].y = 1;
  70. drawing[2].x = 1; drawing[2].y = 0;
  71. drawing[3].x = 0; drawing[3].y = 1;
  72. BOOST_REQUIRE(!is_straight_line_drawing(g, drawing));
  73. // K_4 arranged so that no edges intersect
  74. drawing[0].x = 0; drawing[0].y = 0;
  75. drawing[1].x = 1; drawing[1].y = 1;
  76. drawing[2].x = 1; drawing[2].y = 2;
  77. drawing[3].x = 2; drawing[3].y = 0;
  78. BOOST_REQUIRE(is_straight_line_drawing(g, drawing));
  79. // a slightly more complicated example - edges (0,1) and (4,5)
  80. // intersect
  81. g = graph_t(8);
  82. add_edge(0,1,g);
  83. add_edge(2,3,g);
  84. add_edge(4,5,g);
  85. add_edge(6,7,g);
  86. drawing_storage = drawing_storage_t(num_vertices(g));
  87. drawing = drawing_t(drawing_storage.begin(), get(vertex_index,g));
  88. drawing[0].x = 1; drawing[0].y = 1;
  89. drawing[1].x = 5; drawing[1].y = 4;
  90. drawing[2].x = 2; drawing[2].y = 5;
  91. drawing[3].x = 4; drawing[3].y = 4;
  92. drawing[4].x = 3; drawing[4].y = 4;
  93. drawing[5].x = 3; drawing[5].y = 2;
  94. drawing[6].x = 4; drawing[6].y = 2;
  95. drawing[7].x = 1; drawing[7].y = 1;
  96. BOOST_REQUIRE(!is_straight_line_drawing(g, drawing));
  97. // form a graph consisting of a bunch of parallel vertical edges,
  98. // then place an edge at various positions to intersect edges
  99. g = graph_t(22);
  100. for(int i = 0; i < 11; ++i)
  101. add_edge(2*i,2*i+1,g);
  102. drawing_storage = drawing_storage_t(num_vertices(g));
  103. drawing = drawing_t(drawing_storage.begin(), get(vertex_index,g));
  104. for(int i = 0; i < 10; ++i)
  105. {
  106. drawing[2*i].x = i; drawing[2*i].y = 0;
  107. drawing[2*i+1].x = i; drawing[2*i+1].y = 10;
  108. }
  109. // put the final edge as a horizontal edge intersecting one other edge
  110. drawing[20].x = 5; drawing[20].y = 5;
  111. drawing[21].x = 7; drawing[21].y = 5;
  112. BOOST_REQUIRE(!is_straight_line_drawing(g, drawing));
  113. // make the final edge a diagonal intersecting multiple edges
  114. drawing[20].x = 2; drawing[20].y = 4;
  115. drawing[21].x = 9; drawing[21].y = 7;
  116. BOOST_REQUIRE(!is_straight_line_drawing(g, drawing));
  117. // reverse the slope
  118. drawing[20].x = 2; drawing[20].y = 7;
  119. drawing[21].x = 9; drawing[21].y = 4;
  120. BOOST_REQUIRE(!is_straight_line_drawing(g, drawing));
  121. return 0;
  122. }