voronoi_structures_test.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // Boost.Polygon library voronoi_structures_test.cpp file
  2. // Copyright Andrii Sydorchuk 2010-2012.
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. // See http://www.boost.org for updates, documentation, and revision history.
  7. #include <boost/core/lightweight_test.hpp>
  8. #include <boost/polygon/detail/voronoi_structures.hpp>
  9. #include <boost/polygon/voronoi_geometry_type.hpp>
  10. #include <functional>
  11. #include <vector>
  12. using namespace boost::polygon::detail;
  13. using namespace boost::polygon;
  14. typedef point_2d<int> point_type;
  15. typedef site_event<int> site_type;
  16. typedef circle_event<int> circle_type;
  17. typedef ordered_queue<int, std::greater<int> > ordered_queue_type;
  18. typedef beach_line_node_key<int> node_key_type;
  19. typedef beach_line_node_data<int, int> node_data_type;
  20. void point_2d_test1()
  21. {
  22. point_type p(1, 2);
  23. BOOST_TEST_EQ(1, p.x());
  24. BOOST_TEST_EQ(2, p.y());
  25. p.x(3);
  26. BOOST_TEST_EQ(3, p.x());
  27. p.y(4);
  28. BOOST_TEST_EQ(4, p.y());
  29. }
  30. void site_event_test1()
  31. {
  32. site_type s(1, 2);
  33. s.sorted_index(1);
  34. s.initial_index(2);
  35. s.source_category(SOURCE_CATEGORY_SEGMENT_START_POINT);
  36. BOOST_TEST_EQ(1, s.x0());
  37. BOOST_TEST_EQ(1, s.x1());
  38. BOOST_TEST_EQ(2, s.y0());
  39. BOOST_TEST_EQ(2, s.y1());
  40. BOOST_TEST(s.is_point());
  41. BOOST_TEST(!s.is_segment());
  42. BOOST_TEST(!s.is_inverse());
  43. BOOST_TEST_EQ(1, s.sorted_index());
  44. BOOST_TEST_EQ(2, s.initial_index());
  45. BOOST_TEST_EQ(SOURCE_CATEGORY_SEGMENT_START_POINT, s.source_category());
  46. }
  47. void site_event_test2()
  48. {
  49. site_type s(1, 2, 3, 4);
  50. s.sorted_index(1);
  51. s.initial_index(2);
  52. s.source_category(SOURCE_CATEGORY_INITIAL_SEGMENT);
  53. BOOST_TEST_EQ(1, s.x0());
  54. BOOST_TEST_EQ(2, s.y0());
  55. BOOST_TEST_EQ(3, s.x1());
  56. BOOST_TEST_EQ(4, s.y1());
  57. BOOST_TEST(!s.is_point());
  58. BOOST_TEST(s.is_segment());
  59. BOOST_TEST(!s.is_inverse());
  60. BOOST_TEST_EQ(SOURCE_CATEGORY_INITIAL_SEGMENT, s.source_category());
  61. s.inverse();
  62. BOOST_TEST_EQ(3, s.x0());
  63. BOOST_TEST_EQ(4, s.y0());
  64. BOOST_TEST_EQ(1, s.x1());
  65. BOOST_TEST_EQ(2, s.y1());
  66. BOOST_TEST(s.is_inverse());
  67. BOOST_TEST_EQ(SOURCE_CATEGORY_INITIAL_SEGMENT, s.source_category());
  68. }
  69. void circle_event_test()
  70. {
  71. circle_type c(0, 1, 2);
  72. BOOST_TEST_EQ(0, c.x());
  73. BOOST_TEST_EQ(1, c.y());
  74. BOOST_TEST_EQ(2, c.lower_x());
  75. BOOST_TEST_EQ(1, c.lower_y());
  76. BOOST_TEST(c.is_active());
  77. c.x(3);
  78. c.y(4);
  79. c.lower_x(5);
  80. BOOST_TEST_EQ(3, c.x());
  81. BOOST_TEST_EQ(4, c.y());
  82. BOOST_TEST_EQ(5, c.lower_x());
  83. BOOST_TEST_EQ(4, c.lower_y());
  84. c.deactivate();
  85. BOOST_TEST(!c.is_active());
  86. }
  87. void ordered_queue_test()
  88. {
  89. ordered_queue_type q;
  90. BOOST_TEST(q.empty());
  91. std::vector<int*> vi;
  92. for (int i = 0; i < 20; ++i)
  93. vi.push_back(&q.push(i));
  94. for (int i = 0; i < 20; ++i)
  95. *vi[i] <<= 1;
  96. BOOST_TEST(!q.empty());
  97. for (int i = 0; i < 20; ++i, q.pop())
  98. BOOST_TEST_EQ(i << 1, q.top());
  99. BOOST_TEST(q.empty());
  100. }
  101. void beach_line_node_key_test()
  102. {
  103. node_key_type key(1);
  104. BOOST_TEST_EQ(1, key.left_site());
  105. BOOST_TEST_EQ(1, key.right_site());
  106. key.left_site(2);
  107. BOOST_TEST_EQ(2, key.left_site());
  108. BOOST_TEST_EQ(1, key.right_site());
  109. key.right_site(3);
  110. BOOST_TEST_EQ(2, key.left_site());
  111. BOOST_TEST_EQ(3, key.right_site());
  112. }
  113. void beach_line_node_data_test()
  114. {
  115. node_data_type node_data(NULL);
  116. BOOST_TEST(node_data.edge() == NULL);
  117. BOOST_TEST(node_data.circle_event() == NULL);
  118. int data = 4;
  119. node_data.circle_event(&data);
  120. BOOST_TEST(node_data.edge() == NULL);
  121. BOOST_TEST(node_data.circle_event() == &data);
  122. node_data.edge(&data);
  123. BOOST_TEST(node_data.edge() == &data);
  124. BOOST_TEST(node_data.circle_event() == &data);
  125. }
  126. int main()
  127. {
  128. point_2d_test1();
  129. site_event_test1();
  130. site_event_test2();
  131. circle_event_test();
  132. ordered_queue_test();
  133. beach_line_node_key_test();
  134. beach_line_node_data_test();
  135. return boost::report_errors();
  136. }