intersects_box_geometry.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
  3. // Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland.
  4. // This file was modified by Oracle on 2013, 2015, 2016.
  5. // Modifications copyright (c) 2013-2016, Oracle and/or its affiliates.
  6. // Use, modification and distribution is subject to the Boost Software License,
  7. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. #include "test_intersects.hpp"
  10. #include <boost/geometry/geometries/geometries.hpp>
  11. #include <boost/geometry/geometries/point_xy.hpp>
  12. #include <boost/geometry/util/rational.hpp>
  13. template <typename P1, typename P2>
  14. void test_all()
  15. {
  16. typedef bg::model::polygon<P1> polygon;
  17. typedef bg::model::ring<P1> ring;
  18. // intersect <=> ! disjoint (in most cases)
  19. // so most tests are done in disjoint test.
  20. // We only test compilation of a few cases.
  21. test_geometry<P1, bg::model::box<P2> >("POINT(1 1)", "BOX(0 0,2 2)", true);
  22. test_geometry<polygon, bg::model::box<P2> >(
  23. "POLYGON((1992 3240,1992 1440,3792 1800,3792 3240,1992 3240))",
  24. "BOX(1941 2066, 2055 2166)", true);
  25. test_geometry<ring, bg::model::box<P2> >(
  26. "POLYGON((1992 3240,1992 1440,3792 1800,3792 3240,1992 3240))",
  27. "BOX(1941 2066, 2055 2166)", true);
  28. test_geometry<polygon, bg::model::box<P2> >(
  29. "POLYGON((1941 2066,2055 2066,2055 2166,1941 2166))",
  30. "BOX(1941 2066, 2055 2166)", true);
  31. test_geometry<P1, bg::model::box<P2> >(
  32. "POINT(0 0)",
  33. "BOX(0 0,4 4)",
  34. true);
  35. }
  36. template <typename P>
  37. void test_all()
  38. {
  39. test_all<P, P>();
  40. }
  41. // Those tests won't pass for rational<> because numeric_limits<> isn't specialized for this type
  42. template <typename P>
  43. void test_additional()
  44. {
  45. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  46. "SEGMENT(0 0,3 3)",
  47. "BOX(1 2,3 5)",
  48. true);
  49. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  50. "SEGMENT(1 1,2 3)",
  51. "BOX(0 0,4 4)",
  52. true);
  53. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  54. "SEGMENT(1 1,1 1)",
  55. "BOX(1 0,3 5)",
  56. true);
  57. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  58. "SEGMENT(0 1,0 1)",
  59. "BOX(1 0,3 5)",
  60. false);
  61. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  62. "SEGMENT(2 1,2 1)",
  63. "BOX(1 0,3 5)",
  64. true);
  65. test_geometry<bg::model::linestring<P>, bg::model::box<P> >(
  66. "LINESTRING(0 0,1 0,10 10)",
  67. "BOX(1 2,3 5)",
  68. true);
  69. test_geometry<bg::model::linestring<P>, bg::model::box<P> >(
  70. "LINESTRING(1 2)",
  71. "BOX(0 0,3 5)",
  72. true);
  73. // http://stackoverflow.com/questions/32457920/boost-rtree-of-box-gives-wrong-intersection-with-segment
  74. // http://lists.boost.org/geometry/2015/09/3476.php
  75. typedef bg::model::point<typename bg::coordinate_type<P>::type, 3, bg::cs::cartesian> point3d_t;
  76. test_geometry<bg::model::segment<point3d_t>, bg::model::box<point3d_t> >(
  77. "SEGMENT(2 1 0,2 1 10)",
  78. "BOX(0 0 0,10 0 10)",
  79. false);
  80. test_geometry<bg::model::segment<point3d_t>, bg::model::box<point3d_t> >(
  81. "SEGMENT(2 1 0,2 1 10)",
  82. "BOX(0 -5 0,10 0 10)",
  83. false);
  84. // and derived from the cases above
  85. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  86. "SEGMENT(12 0,20 10)",
  87. "BOX(0 0,10 10)",
  88. false);
  89. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  90. "SEGMENT(2 0,8 6)",
  91. "BOX(0 0,10 10)",
  92. true);
  93. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  94. "SEGMENT(2 0,18 8)",
  95. "BOX(0 0,10 10)",
  96. true);
  97. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  98. "SEGMENT(1 0,1 10)",
  99. "BOX(0 0,0 10)",
  100. false);
  101. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  102. "SEGMENT(-1 0,-1 10)",
  103. "BOX(0 0,0 10)",
  104. false);
  105. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  106. "SEGMENT(2 1,2 1)",
  107. "BOX(0 0,10 0)",
  108. false);
  109. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  110. "SEGMENT(2 3,2 3)",
  111. "BOX(0 0,10 0)",
  112. false);
  113. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  114. "SEGMENT(0 0,10 0)",
  115. "BOX(0 0,10 0)",
  116. true);
  117. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  118. "SEGMENT(10 0,10 0)",
  119. "BOX(0 0,10 0)",
  120. true);
  121. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  122. "SEGMENT(1 0,1 0)",
  123. "BOX(0 0,10 0)",
  124. true);
  125. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  126. "SEGMENT(0 0,0 10)",
  127. "BOX(0 0,0 10)",
  128. true);
  129. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  130. "SEGMENT(0 10,0 10)",
  131. "BOX(0 0,0 10)",
  132. true);
  133. test_geometry<bg::model::segment<P>, bg::model::box<P> >(
  134. "SEGMENT(0 1,0 1)",
  135. "BOX(0 0,0 10)",
  136. true);
  137. }
  138. int test_main( int , char* [] )
  139. {
  140. test_all<bg::model::d2::point_xy<float>, bg::model::point<double, 2, bg::cs::cartesian> >();
  141. test_all<bg::model::d2::point_xy<double> >();
  142. test_additional<bg::model::d2::point_xy<double> >();
  143. #if ! defined(BOOST_GEOMETRY_RESCALE_TO_ROBUST)
  144. test_all<bg::model::d2::point_xy<boost::rational<int> > >();
  145. #endif
  146. #if defined(HAVE_TTMATH)
  147. test_all<bg::model::d2::point_xy<ttmath_big> >();
  148. #endif
  149. return 0;
  150. }