polygon_interval_test.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. // Boost.Polygon library polygon_interval_test.cpp file
  2. // Copyright Andrii Sydorchuk 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/interval_concept.hpp>
  9. #include <boost/polygon/interval_data.hpp>
  10. #include <boost/polygon/interval_traits.hpp>
  11. using namespace boost::polygon;
  12. void interval_data_test()
  13. {
  14. typedef interval_data<int> interval_type;
  15. interval_type interval1(1, 2);
  16. interval_type interval2;
  17. interval2 = interval1;
  18. BOOST_TEST_EQ(interval1.low(), 1);
  19. BOOST_TEST_EQ(interval1.high(), 2);
  20. BOOST_TEST_EQ(interval1.get(LOW), 1);
  21. BOOST_TEST_EQ(interval1.get(HIGH), 2);
  22. BOOST_TEST(interval1 == interval2);
  23. BOOST_TEST(!(interval1 != interval2));
  24. BOOST_TEST(!(interval1 < interval2));
  25. BOOST_TEST(!(interval1 > interval2));
  26. BOOST_TEST(interval1 <= interval2);
  27. BOOST_TEST(interval1 >= interval2);
  28. interval1.low(2);
  29. interval1.high(1);
  30. BOOST_TEST_EQ(interval1.low(), 2);
  31. BOOST_TEST_EQ(interval1.high(), 1);
  32. BOOST_TEST(!(interval1 == interval2));
  33. BOOST_TEST(interval1 != interval2);
  34. interval2.set(LOW, 2);
  35. interval2.set(HIGH, 1);
  36. BOOST_TEST(interval1 == interval2);
  37. }
  38. void interval_traits_test()
  39. {
  40. typedef interval_data<int> interval_type;
  41. interval_type interval = interval_mutable_traits<interval_type>::construct(1, 2);
  42. BOOST_TEST_EQ(interval_traits<interval_type>::get(interval, LOW), 1);
  43. BOOST_TEST_EQ(interval_traits<interval_type>::get(interval, HIGH), 2);
  44. interval_mutable_traits<interval_type>::set(interval, LOW, 3);
  45. interval_mutable_traits<interval_type>::set(interval, HIGH, 4);
  46. BOOST_TEST_EQ(interval_traits<interval_type>::get(interval, LOW), 3);
  47. BOOST_TEST_EQ(interval_traits<interval_type>::get(interval, HIGH), 4);
  48. }
  49. template <typename T>
  50. struct Interval {
  51. T left;
  52. T right;
  53. };
  54. namespace boost {
  55. namespace polygon {
  56. template <typename T>
  57. struct geometry_concept< Interval<T> > {
  58. typedef interval_concept type;
  59. };
  60. template <typename T>
  61. struct interval_traits< Interval<T> > {
  62. typedef T coordinate_type;
  63. static coordinate_type get(const Interval<T>& interval, direction_1d dir) {
  64. return (dir == LOW) ? interval.left : interval.right;
  65. }
  66. };
  67. template <typename T>
  68. struct interval_mutable_traits< Interval<T> > {
  69. typedef T coordinate_type;
  70. static void set(Interval<T>& interval, direction_1d dir, T value) {
  71. (dir == LOW) ? interval.left = value : interval.right = value;
  72. }
  73. static Interval<T> construct(coordinate_type left, coordinate_type right) {
  74. Interval<T> interval;
  75. interval.left = left;
  76. interval.right = right;
  77. return interval;
  78. }
  79. };
  80. } // polygon
  81. } // boost
  82. void interval_concept_test1()
  83. {
  84. typedef Interval<int> interval_type;
  85. interval_type interval1 = construct<interval_type>(2, 1);
  86. BOOST_TEST_EQ(interval1.left, 1);
  87. BOOST_TEST_EQ(interval1.right, 2);
  88. set(interval1, LOW, 3);
  89. set(interval1, HIGH, 4);
  90. BOOST_TEST_EQ(get(interval1, LOW), 3);
  91. BOOST_TEST_EQ(get(interval1, HIGH), 4);
  92. interval_type interval2 = copy_construct<interval_type>(interval1);
  93. BOOST_TEST(equivalence(interval1, interval2));
  94. low(interval2, 1);
  95. high(interval2, 2);
  96. BOOST_TEST_EQ(low(interval2), 1);
  97. BOOST_TEST_EQ(high(interval2), 2);
  98. assign(interval1, interval2);
  99. BOOST_TEST(equivalence(interval1, interval2));
  100. }
  101. void interval_concept_test2()
  102. {
  103. typedef Interval<int> interval_type;
  104. interval_type interval1 = construct<interval_type>(1, 3);
  105. BOOST_TEST_EQ(center(interval1), 2);
  106. BOOST_TEST_EQ(delta(interval1), 2);
  107. flip(interval1, -1);
  108. BOOST_TEST_EQ(low(interval1), -5);
  109. BOOST_TEST_EQ(high(interval1), -3);
  110. scale_up(interval1, 2);
  111. BOOST_TEST_EQ(low(interval1), -10);
  112. BOOST_TEST_EQ(high(interval1), -6);
  113. scale_down(interval1, 2);
  114. BOOST_TEST_EQ(low(interval1), -5);
  115. BOOST_TEST_EQ(high(interval1), -3);
  116. move(interval1, 5);
  117. BOOST_TEST_EQ(low(interval1), 0);
  118. BOOST_TEST_EQ(high(interval1), 2);
  119. convolve(interval1, 1);
  120. BOOST_TEST_EQ(low(interval1), 1);
  121. BOOST_TEST_EQ(high(interval1), 3);
  122. deconvolve(interval1, 2);
  123. BOOST_TEST_EQ(low(interval1), -1);
  124. BOOST_TEST_EQ(high(interval1), 1);
  125. interval_type interval2 = construct<interval_type>(-1, 2);
  126. convolve(interval1, interval2);
  127. BOOST_TEST_EQ(low(interval1), -2);
  128. BOOST_TEST_EQ(high(interval1), 3);
  129. deconvolve(interval1, interval2);
  130. BOOST_TEST_EQ(low(interval1), -1);
  131. BOOST_TEST_EQ(high(interval1), 1);
  132. reflected_convolve(interval1, interval2);
  133. BOOST_TEST_EQ(low(interval1), -3);
  134. BOOST_TEST_EQ(high(interval1), 2);
  135. reflected_deconvolve(interval1, interval2);
  136. BOOST_TEST_EQ(low(interval1), -1);
  137. BOOST_TEST_EQ(high(interval1), 1);
  138. }
  139. void interval_concept_test3()
  140. {
  141. typedef Interval<int> interval_type;
  142. interval_type interval1 = construct<interval_type>(1, 3);
  143. BOOST_TEST_EQ(euclidean_distance(interval1, -2), 3);
  144. BOOST_TEST_EQ(euclidean_distance(interval1, 2), 0);
  145. BOOST_TEST_EQ(euclidean_distance(interval1, 4), 1);
  146. interval_type interval2 = construct<interval_type>(-1, 0);
  147. BOOST_TEST_EQ(euclidean_distance(interval1, interval2), 1);
  148. BOOST_TEST(!intersects(interval1, interval2));
  149. BOOST_TEST(!boundaries_intersect(interval1, interval2));
  150. BOOST_TEST(!intersect(interval2, interval1));
  151. BOOST_TEST_EQ(low(interval2), -1);
  152. BOOST_TEST_EQ(high(interval2), 0);
  153. interval_type interval3 = construct<interval_type>(-1, 6);
  154. BOOST_TEST_EQ(euclidean_distance(interval1, interval3), 0);
  155. BOOST_TEST(intersects(interval1, interval3));
  156. BOOST_TEST(!boundaries_intersect(interval1, interval3));
  157. BOOST_TEST(intersect(interval3, interval1));
  158. BOOST_TEST_EQ(low(interval3), 1);
  159. BOOST_TEST_EQ(high(interval3), 3);
  160. interval_type interval4 = construct<interval_type>(5, 6);
  161. BOOST_TEST_EQ(euclidean_distance(interval1, interval4), 2);
  162. BOOST_TEST(!intersects(interval1, interval4));
  163. BOOST_TEST(!boundaries_intersect(interval1, interval4));
  164. BOOST_TEST(!intersect(interval4, interval1));
  165. BOOST_TEST_EQ(low(interval4), 5);
  166. BOOST_TEST_EQ(high(interval4), 6);
  167. interval_type interval5 = construct<interval_type>(3, 5);
  168. BOOST_TEST_EQ(euclidean_distance(interval1, interval5), 0);
  169. BOOST_TEST(!intersects(interval1, interval5, false));
  170. BOOST_TEST(boundaries_intersect(interval1, interval5));
  171. BOOST_TEST(intersect(interval5, interval1));
  172. BOOST_TEST_EQ(low(interval5), 3);
  173. BOOST_TEST_EQ(high(interval5), 3);
  174. }
  175. void interval_concept_test4()
  176. {
  177. typedef Interval<int> interval_type;
  178. interval_type interval1 = construct<interval_type>(1, 3);
  179. interval_type interval2 = construct<interval_type>(3, 5);
  180. BOOST_TEST(!abuts(interval1, interval2, LOW));
  181. BOOST_TEST(abuts(interval1, interval2, HIGH));
  182. BOOST_TEST(abuts(interval1, interval2));
  183. bloat(interval1, 1);
  184. BOOST_TEST_EQ(low(interval1), 0);
  185. BOOST_TEST_EQ(high(interval1), 4);
  186. BOOST_TEST(!abuts(interval1, interval2));
  187. bloat(interval1, LOW, 1);
  188. BOOST_TEST_EQ(low(interval1), -1);
  189. BOOST_TEST_EQ(high(interval1), 4);
  190. shrink(interval1, LOW, 1);
  191. BOOST_TEST_EQ(low(interval1), 0);
  192. BOOST_TEST_EQ(high(interval1), 4);
  193. shrink(interval1, 1);
  194. BOOST_TEST_EQ(low(interval1), 1);
  195. BOOST_TEST_EQ(high(interval1), 3);
  196. BOOST_TEST(encompass(interval1, 4));
  197. BOOST_TEST_EQ(low(interval1), 1);
  198. BOOST_TEST_EQ(high(interval1), 4);
  199. BOOST_TEST(encompass(interval1, interval2));
  200. BOOST_TEST_EQ(low(interval1), 1);
  201. BOOST_TEST_EQ(high(interval1), 5);
  202. interval1 = get_half(interval1, LOW);
  203. BOOST_TEST_EQ(low(interval1), 1);
  204. BOOST_TEST_EQ(high(interval1), 3);
  205. BOOST_TEST(join_with(interval1, interval2));
  206. BOOST_TEST_EQ(low(interval1), 1);
  207. BOOST_TEST_EQ(high(interval1), 5);
  208. }
  209. int main()
  210. {
  211. interval_data_test();
  212. interval_traits_test();
  213. interval_concept_test1();
  214. interval_concept_test2();
  215. interval_concept_test3();
  216. interval_concept_test4();
  217. return boost::report_errors();
  218. }