test_difference_linear_linear.hpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2014-2017, 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_DIFFERENCE_LINEAR_LINEAR_HPP
  8. #define BOOST_GEOMETRY_TEST_DIFFERENCE_LINEAR_LINEAR_HPP
  9. #include <limits>
  10. #include <boost/geometry/geometry.hpp>
  11. #include "../test_set_ops_linear_linear.hpp"
  12. #include "../check_turn_less.hpp"
  13. #include <from_wkt.hpp>
  14. #include <to_svg.hpp>
  15. //==================================================================
  16. //==================================================================
  17. // difference of (linear) geometries
  18. //==================================================================
  19. //==================================================================
  20. template <typename Geometry1, typename Geometry2, typename MultiLineString>
  21. inline void check_result(Geometry1 const& geometry1,
  22. Geometry2 const& geometry2,
  23. MultiLineString const& mls_output,
  24. MultiLineString const& mls_diff,
  25. std::string const& case_id,
  26. double tolerance = std::numeric_limits<double>::epsilon())
  27. {
  28. BOOST_CHECK_MESSAGE( equals::apply(mls_diff, mls_output, tolerance),
  29. "case id: " << case_id
  30. << ", difference L/L: " << bg::wkt(geometry1)
  31. << " " << bg::wkt(geometry2)
  32. << " -> Expected: " << bg::wkt(mls_diff)
  33. << std::setprecision(20)
  34. << " computed: " << bg::wkt(mls_output) );
  35. }
  36. template
  37. <
  38. typename Geometry1, typename Geometry2,
  39. typename MultiLineString
  40. >
  41. class test_difference_of_geometries
  42. {
  43. private:
  44. static inline void base_test(Geometry1 const& geometry1,
  45. Geometry2 const& geometry2,
  46. MultiLineString const& mls_diff,
  47. std::string const& case_id,
  48. double tolerance,
  49. bool test_vector_and_deque = true,
  50. bool reverse_output_for_checking = false)
  51. {
  52. static bool vector_deque_already_tested = false;
  53. typedef typename boost::range_value<MultiLineString>::type LineString;
  54. typedef std::vector<LineString> linestring_vector;
  55. typedef std::deque<LineString> linestring_deque;
  56. MultiLineString mls_output;
  57. linestring_vector ls_vector_output;
  58. linestring_deque ls_deque_output;
  59. // Check strategy passed explicitly
  60. typedef typename bg::strategy::relate::services::default_strategy
  61. <
  62. Geometry1, Geometry2
  63. >::type strategy_type;
  64. bg::difference(geometry1, geometry2, mls_output, strategy_type());
  65. if (reverse_output_for_checking)
  66. {
  67. bg::reverse(mls_output);
  68. }
  69. check_result(geometry1, geometry2, mls_output, mls_diff, case_id, tolerance);
  70. // Check normal behaviour
  71. bg::clear(mls_output);
  72. bg::difference(geometry1, geometry2, mls_output);
  73. if ( reverse_output_for_checking )
  74. {
  75. bg::reverse(mls_output);
  76. }
  77. check_result(geometry1, geometry2, mls_output, mls_diff, case_id, tolerance);
  78. set_operation_output("difference", case_id,
  79. geometry1, geometry2, mls_output);
  80. if ( !vector_deque_already_tested && test_vector_and_deque )
  81. {
  82. vector_deque_already_tested = true;
  83. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  84. std::cout << std::endl;
  85. std::cout << "Testing with vector and deque as output container..."
  86. << std::endl;
  87. #endif
  88. bg::difference(geometry1, geometry2, ls_vector_output);
  89. bg::difference(geometry1, geometry2, ls_deque_output);
  90. BOOST_CHECK(multilinestring_equals
  91. <
  92. false
  93. >::apply(mls_diff, ls_vector_output, tolerance));
  94. BOOST_CHECK(multilinestring_equals
  95. <
  96. false
  97. >::apply(mls_diff, ls_deque_output, tolerance));
  98. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  99. std::cout << "Done!" << std::endl << std::endl;
  100. #endif
  101. }
  102. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  103. std::cout << "Geometry #1: " << bg::wkt(geometry1) << std::endl;
  104. std::cout << "Geometry #2: " << bg::wkt(geometry2) << std::endl;
  105. std::cout << "difference : " << bg::wkt(mls_output) << std::endl;
  106. std::cout << "expected difference : " << bg::wkt(mls_diff) << std::endl;
  107. std::cout << std::endl;
  108. std::cout << "************************************" << std::endl;
  109. std::cout << std::endl;
  110. std::cout << std::endl;
  111. #endif
  112. check_turn_less::apply(geometry1, geometry2);
  113. }
  114. public:
  115. static inline void apply(Geometry1 const& geometry1,
  116. Geometry2 const& geometry2,
  117. MultiLineString const& mls_diff,
  118. std::string const& case_id,
  119. double tolerance
  120. = std::numeric_limits<double>::epsilon())
  121. {
  122. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  123. std::cout << "test case: " << case_id << std::endl;
  124. std::stringstream sstr;
  125. sstr << "svgs/" << case_id << ".svg";
  126. #ifdef TEST_WITH_SVG
  127. to_svg(geometry1, geometry2, sstr.str());
  128. #endif
  129. #endif
  130. Geometry1 rg1(geometry1);
  131. bg::reverse<Geometry1>(rg1);
  132. Geometry2 rg2(geometry2);
  133. bg::reverse<Geometry2>(rg2);
  134. test_get_turns_ll_invariance<>::apply(geometry1, geometry2);
  135. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  136. std::cout << std::endl
  137. << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
  138. << std::endl << std::endl;
  139. #endif
  140. test_get_turns_ll_invariance<>::apply(rg1, geometry2);
  141. base_test(geometry1, geometry2, mls_diff, case_id, tolerance);
  142. base_test(geometry1, rg2, mls_diff, case_id, tolerance, false);
  143. base_test(rg1, geometry2, mls_diff, case_id, tolerance, false, true);
  144. base_test(rg1, rg2, mls_diff, case_id, tolerance, false, true);
  145. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  146. std::cout << std::endl;
  147. std::cout << std::endl;
  148. #endif
  149. }
  150. };
  151. #endif // BOOST_GEOMETRY_TEST_DIFFERENCE_LINEAR_LINEAR_HPP