test_get_turns_ll_invariance.hpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2014, 2019, Oracle and/or its affiliates.
  3. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
  4. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  5. // Licensed under the Boost Software License version 1.0.
  6. // http://www.boost.org/users/license.html
  7. #ifndef BOOST_GEOMETRY_TEST_GET_TURNS_LL_INVARIANCE_HPP
  8. #define BOOST_GEOMETRY_TEST_GET_TURNS_LL_INVARIANCE_HPP
  9. #include <vector>
  10. #include <boost/geometry/algorithms/reverse.hpp>
  11. #include <boost/geometry/algorithms/detail/signed_size_type.hpp>
  12. #include <boost/geometry/algorithms/detail/relate/turns.hpp>
  13. #include <boost/geometry/algorithms/detail/turns/compare_turns.hpp>
  14. #include <boost/geometry/algorithms/detail/turns/print_turns.hpp>
  15. #include <boost/geometry/algorithms/detail/turns/filter_continue_turns.hpp>
  16. #include <boost/geometry/algorithms/detail/turns/remove_duplicate_turns.hpp>
  17. #include <boost/geometry/io/wkt/write.hpp>
  18. namespace bg = ::boost::geometry;
  19. namespace bg_detail = ::boost::geometry::detail;
  20. namespace bg_turns = bg_detail::turns;
  21. template
  22. <
  23. bool Enable = true,
  24. bool EnableRemoveDuplicateTurns = true,
  25. bool EnableDegenerateTurns = true
  26. >
  27. class test_get_turns_ll_invariance
  28. {
  29. private:
  30. struct assign_policy
  31. {
  32. static bool const include_no_turn = false;
  33. static bool const include_degenerate = EnableDegenerateTurns;
  34. static bool const include_opposite = false;
  35. template
  36. <
  37. typename Info,
  38. typename Point1,
  39. typename Point2,
  40. typename IntersectionInfo
  41. >
  42. static inline void apply(Info& , Point1 const& , Point2 const& ,
  43. IntersectionInfo const&)
  44. {
  45. }
  46. };
  47. template
  48. <
  49. typename Turns,
  50. typename LinearGeometry1,
  51. typename LinearGeometry2
  52. >
  53. static inline void compute_turns(Turns& turns,
  54. LinearGeometry1 const& linear1,
  55. LinearGeometry2 const& linear2)
  56. {
  57. turns.clear();
  58. bg_detail::relate::turns::get_turns
  59. <
  60. LinearGeometry1,
  61. LinearGeometry2,
  62. bg_detail::get_turns::get_turn_info_type
  63. <
  64. LinearGeometry1,
  65. LinearGeometry2,
  66. assign_policy
  67. >
  68. >::apply(turns, linear1, linear2);
  69. }
  70. public:
  71. template <typename Linear1, typename Linear2>
  72. static inline void apply(Linear1 const& lineargeometry1,
  73. Linear2 const& lineargeometry2)
  74. {
  75. typedef typename bg::strategy::relate::services::default_strategy
  76. <
  77. Linear1, Linear2
  78. >::type strategy_type;
  79. typedef typename bg_detail::relate::turns::get_turns
  80. <
  81. Linear1, Linear2
  82. >::template turn_info_type<strategy_type>::type turn_info;
  83. typedef std::vector<turn_info> turns_container;
  84. typedef bg_turns::filter_continue_turns
  85. <
  86. turns_container, true
  87. > filter_continue_turns;
  88. typedef bg_turns::remove_duplicate_turns
  89. <
  90. turns_container, EnableRemoveDuplicateTurns
  91. > remove_duplicate_turns;
  92. turns_container turns;
  93. Linear1 linear1(lineargeometry1);
  94. Linear2 linear2(lineargeometry2);
  95. Linear2 linear2_reverse(linear2);
  96. boost::geometry::reverse(linear2_reverse);
  97. turns_container turns_all, rturns_all;
  98. compute_turns(turns_all, linear1, linear2);
  99. compute_turns(rturns_all, linear1, linear2_reverse);
  100. turns_container turns_wo_cont(turns_all);
  101. turns_container rturns_wo_cont(rturns_all);
  102. filter_continue_turns::apply(turns_wo_cont);
  103. filter_continue_turns::apply(rturns_wo_cont);
  104. std::sort(boost::begin(turns_all), boost::end(turns_all),
  105. bg_turns::less_seg_fraction_other_op<>());
  106. std::sort(boost::begin(turns_wo_cont), boost::end(turns_wo_cont),
  107. bg_turns::less_seg_fraction_other_op<>());
  108. std::sort(boost::begin(rturns_all), boost::end(rturns_all),
  109. bg_turns::less_seg_fraction_other_op<std::greater<boost::geometry::signed_size_type> >());
  110. std::sort(boost::begin(rturns_wo_cont), boost::end(rturns_wo_cont),
  111. bg_turns::less_seg_fraction_other_op<std::greater<boost::geometry::signed_size_type> >());
  112. remove_duplicate_turns::apply(turns_all);
  113. remove_duplicate_turns::apply(turns_wo_cont);
  114. remove_duplicate_turns::apply(rturns_all);
  115. remove_duplicate_turns::apply(rturns_wo_cont);
  116. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  117. std::cout << std::endl << std::endl;
  118. std::cout << "### ORIGINAL TURNS ###" << std::endl;
  119. bg_turns::print_turns(linear1, linear2, turns_all);
  120. std::cout << std::endl << std::endl;
  121. std::cout << "### ORIGINAL REVERSE TURNS ###" << std::endl;
  122. bg_turns::print_turns(linear1, linear2_reverse, rturns_all);
  123. std::cout << std::endl << std::endl;
  124. std::cout << "### TURNS W/O CONTINUE TURNS ###" << std::endl;
  125. bg_turns::print_turns(linear1, linear2, turns_wo_cont);
  126. std::cout << std::endl << std::endl;
  127. std::cout << "### REVERSE TURNS W/O CONTINUE TURNS ###" << std::endl;
  128. bg_turns::print_turns(linear1, linear2_reverse, rturns_wo_cont);
  129. std::cout << std::endl << std::endl;
  130. #endif
  131. BOOST_CHECK_MESSAGE(boost::size(turns_wo_cont) == boost::size(rturns_wo_cont),
  132. "Incompatible turns count: " << boost::size(turns_wo_cont) <<
  133. " and " << boost::size(rturns_wo_cont) <<
  134. " for L1: " << bg::wkt(lineargeometry1) <<
  135. ", L2: " << bg::wkt(lineargeometry2));
  136. }
  137. };
  138. template <bool EnableRemoveDuplicateTurns, bool EnableDegenerateTurns>
  139. class test_get_turns_ll_invariance
  140. <
  141. false, EnableRemoveDuplicateTurns, EnableDegenerateTurns
  142. >
  143. {
  144. public:
  145. template <typename Linear1, typename Linear2>
  146. static inline void apply(Linear1 const&, Linear2 const&)
  147. {
  148. }
  149. };
  150. #endif // BOOST_GEOMETRY_TEST_GET_TURNS_LL_INVARIANCE_HPP