relate_linear_linear_sph.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. // Boost.Geometry
  2. // Unit Test
  3. // Copyright (c) 2016, Oracle and/or its affiliates.
  4. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  5. // Use, modification and distribution is subject to the Boost Software License,
  6. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  7. // http://www.boost.org/LICENSE_1_0.txt)
  8. #include "test_relate.hpp"
  9. template <typename P>
  10. void test_linestring_linestring()
  11. {
  12. typedef bg::model::linestring<P> ls;
  13. test_geometry<ls, ls>("LINESTRING(0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 3 2)", "1FFF0FFF2");
  14. test_geometry<ls, ls>("LINESTRING(0 0,3 2)", "LINESTRING(0 0, 2 2, 3 2)", "FF1F0F1F2");
  15. test_geometry<ls, ls>("LINESTRING(1 0,2 2,2 3)", "LINESTRING(0 0, 2 2, 3 2)", "0F1FF0102");
  16. test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(0 0,1 1,2 0,2 -1)", "0F1F00102");
  17. test_geometry<ls, ls>("LINESTRING(0 0, 1 1.0004570537241206, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 3 2)", "1FFF0FFF2");
  18. test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(0 0, 2 2, 3 2)", "1FFF0FFF2");
  19. test_geometry<ls, ls>("LINESTRING(0 0, 1 1.0004570537241206, 2 2, 3 2)", "LINESTRING(3 2, 2 2, 0 0)", "1FFF0FFF2");
  20. test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(3 2, 2 2, 0 0)", "1FFF0FFF2");
  21. test_geometry<ls, ls>("LINESTRING(3 1, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(0 0, 2 2, 3 2)", "1F1F00102");
  22. test_geometry<ls, ls>("LINESTRING(3 3, 2 2.0015234344160047, 1 1.0012195839797347, 0 0)", "LINESTRING(0 0, 2 2.0015234344160047, 3 2)", "1F1F00102");
  23. test_geometry<ls, ls>("LINESTRING(0 0, 1 1.0004570537241206, 2 2, 2 3)", "LINESTRING(0 0, 2 2, 2 3)", "1FFF0FFF2");
  24. test_geometry<ls, ls>("LINESTRING(2 3, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(0 0, 2 2, 2 3)", "1FFF0FFF2");
  25. test_geometry<ls, ls>("LINESTRING(0 0, 1 1.0004570537241206, 2 2, 2 3)", "LINESTRING(2 3, 2 2, 0 0)", "1FFF0FFF2");
  26. test_geometry<ls, ls>("LINESTRING(2 3, 2 2, 1 1.0004570537241206, 0 0)", "LINESTRING(2 3, 2 2, 0 0)", "1FFF0FFF2");
  27. test_geometry<ls, ls>("LINESTRING(1 1.0004570537241206, 2 2, 3 2.0003044086155000)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
  28. test_geometry<ls, ls>("LINESTRING(3 2.0003044086155000, 2 2, 1 1.0004570537241206)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
  29. test_geometry<ls, ls>("LINESTRING(1 1.0004570537241206, 2 2, 3 2.0003044086155000)", "LINESTRING(4 2, 2 2, 0 0)", "1FF0FF102");
  30. test_geometry<ls, ls>("LINESTRING(3 2.0003044086155000, 2 2, 1 1.0004570537241206)", "LINESTRING(4 2, 2 2, 0 0)", "1FF0FF102");
  31. // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", true);
  32. // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 3)", "LINESTRING(0 0, 2 2, 4 2)", false);
  33. // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2, 3 3)", "LINESTRING(0 0, 2 2, 4 2)", false);
  34. // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 1)", "LINESTRING(0 0, 2 2, 4 2)", false);
  35. // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2, 3 1)", "LINESTRING(0 0, 2 2, 4 2)", false);
  36. // test_geometry<ls, ls>("LINESTRING(0 1, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
  37. // test_geometry<ls, ls>("LINESTRING(0 1, 0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
  38. // test_geometry<ls, ls>("LINESTRING(1 0, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
  39. // test_geometry<ls, ls>("LINESTRING(1 0, 0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
  40. // test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0)", false);
  41. // test_geometry<ls, ls>("LINESTRING(1 1)", "LINESTRING(0 0, 2 2)", true);
  42. // test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0, 2 2)", false);
  43. // test_geometry<ls, ls>("LINESTRING(0 0, 1 1)", "LINESTRING(0 0)", false);
  44. // test_geometry<ls, ls>("LINESTRING(0 0,5 0,3 0,6 0)", "LINESTRING(0 0,6 0)", true);
  45. // test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1)", "LINESTRING(0 0,3 3,6 3)", true);
  46. // SPIKES!
  47. test_geometry<ls, ls>("LINESTRING(0 0,2 2.0015234344160047,3 3,1 1.0012195839797347,5 3.0009124369434743)", "LINESTRING(0 0,3 3,6 3)", "1F100F102");
  48. test_geometry<ls, ls>("LINESTRING(5 3.0009124369434743,1 1.0012195839797347,3 3,2 2.0015234344160047,0 0)", "LINESTRING(0 0,3 3,6 3)", "1F100F102");
  49. test_geometry<ls, ls>("LINESTRING(0 0,2 2.0015234344160047,3 3,1 1.0012195839797347,5 3.0009124369434743)", "LINESTRING(6 3,3 3,0 0)", "1F100F102");
  50. test_geometry<ls, ls>("LINESTRING(5 3.0009124369434743,1 1.0012195839797347,3 3,2 2.0015234344160047,0 0)", "LINESTRING(6 3,3 3,0 0)", "1F100F102");
  51. test_geometry<ls, ls>("LINESTRING(6 3,3 3,0 0)", "LINESTRING(0 0,2 2.0015234344160047,3 3,1 1.0012195839797347,5 3.0009124369434743)", "101F001F2");
  52. test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(1 0,9 0,2 0)", "101FF0FF2");
  53. test_geometry<ls, ls>("LINESTRING(0 0,2 2.0015234344160047,3 3,1 1.0012195839797347)", "LINESTRING(0 0,3 3,6 3)", "1FF00F102");
  54. // TODO: REWRITE MATRICES
  55. // BEGIN
  56. /*test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1)", "LINESTRING(0 0,4 4,6 3)", "1FF00F102");
  57. test_geometry<ls, ls>("LINESTRING(0 0,2 0,1 0)", "LINESTRING(0 1,0 0,2 0)", "1FF00F102");
  58. test_geometry<ls, ls>("LINESTRING(2 0,0 0,1 0)", "LINESTRING(0 1,0 0,2 0)", "1FF00F102");
  59. test_geometry<ls, ls>("LINESTRING(0 0,3 3,1 1)", "LINESTRING(3 0,3 3,3 1)", "0F1FF0102");
  60. test_geometry<ls, ls>("LINESTRING(0 0,3 3,1 1)", "LINESTRING(2 0,2 3,2 1)", "0F1FF0102");
  61. test_geometry<ls, ls>("LINESTRING(0 0,3 3,1 1)", "LINESTRING(2 0,2 2,2 1)", "0F1FF0102");
  62. test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,4 4)", "LINESTRING(0 0,1 1,4 4)", "1FFF0FFF2");*/
  63. // END
  64. test_geometry<ls, ls>("LINESTRING(0 0,2 2.0036594926050868,3 3.0031983963093536,4 4)", "LINESTRING(0 0,1 1.0022887548647632,4 4)", "1FFF0FFF2");
  65. // loop i/i i/i u/u u/u
  66. test_geometry<ls, ls>("LINESTRING(0 0,10 0)",
  67. "LINESTRING(1 1,1 0,6 0,6 1,4 1,4 0,9 0,9 1)", "1F1FF0102");
  68. // self-intersecting and self-touching equal
  69. test_geometry<ls, ls>("LINESTRING(0 5,5 5,10 5,10 10,5 10,5 5,5 0)",
  70. "LINESTRING(0 5,5 5,5 10,10 10,10 5,5 5,5 0)", "1FFF0FFF2");
  71. // self-intersecting loop and self-touching equal
  72. test_geometry<ls, ls>("LINESTRING(0 5,5 5,10 5,10 10,5 10,5 5,10 5,10 10,5 10,5 5,5 0)",
  73. "LINESTRING(0 5,5 5,5 10,10 10,10 5,5 5,5 0)", "1FFF0FFF2");
  74. test_geometry<ls, ls>("LINESTRING(0 0,1 1)", "LINESTRING(0 1,1 0)", "0F1FF0102");
  75. test_geometry<ls, ls>("LINESTRING(0 0,1 1)", "LINESTRING(1 1,2 0)", "FF1F00102");
  76. test_geometry<ls, ls>("LINESTRING(0 0,1 1)", "LINESTRING(2 0,1 1)", "FF1F00102");
  77. test_geometry<ls, ls>("LINESTRING(0 0,1 0,2 1,3 5,4 0)", "LINESTRING(1 0,2 1,3 5)", "101FF0FF2");
  78. test_geometry<ls, ls>("LINESTRING(0 0,1 0,2 1,3 5,4 0)", "LINESTRING(3 5,2 1,1 0)", "101FF0FF2");
  79. test_geometry<ls, ls>("LINESTRING(1 0,2 1,3 5)", "LINESTRING(4 0,3 5,2 1,1 0,0 0)", "1FF0FF102");
  80. test_geometry<ls, ls>("LINESTRING(3 5,2 1,1 0)", "LINESTRING(4 0,3 5,2 1,1 0,0 0)", "1FF0FF102");
  81. test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(-1 -1,1 0,10 0,20 -1)", "1F10F0102");
  82. test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(20 -1,10 0,1 0,-1 -1)", "1F10F0102");
  83. test_geometry<ls, ls>("LINESTRING(-1 1,0 0,1 0,5 0,5 5,10 5,15 0,31 0)",
  84. "LINESTRING(-1 -1,0 0,1 0,2 0,3 1,4 0,30 0)",
  85. "101FF0102");
  86. test_geometry<ls, ls>("LINESTRING(-1 1,0 0,1 0,5 0,5 5,10 5,15 0,31 0)",
  87. "LINESTRING(30 0,4 0,3 1,2 0,1 0,0 0,-1 -1)",
  88. "101FF0102");
  89. test_geometry<ls, ls>("LINESTRING(31 0,15 0,10 5,5 5,5 0,1 0,0 0,-1 1)",
  90. "LINESTRING(-1 -1,0 0,1 0,2 0,3 1,4 0,30 0)",
  91. "101FF0102");
  92. test_geometry<ls, ls>("LINESTRING(31 0,15 0,10 5,5 5,5 0,1 0,0 0,-1 1)",
  93. "LINESTRING(30 0,4 0,3 1,2 0,1 0,0 0,-1 -1)",
  94. "101FF0102");
  95. // self-IP
  96. test_geometry<ls, ls>("LINESTRING(1 0,9 0)",
  97. "LINESTRING(0 0,10 0,10 10,5 0,0 10)",
  98. "1FF0FF102");
  99. test_geometry<ls, ls>("LINESTRING(1 0,5 0,9 0)",
  100. "LINESTRING(0 0,10 0,10 10,5 0,0 10)",
  101. "1FF0FF102");
  102. test_geometry<ls, ls>("LINESTRING(1 0,9 0)",
  103. "LINESTRING(0 0,10 0,10 10,5 10,5 -1)",
  104. "1FF0FF102");
  105. test_geometry<ls, ls>("LINESTRING(1 0,9 0)",
  106. "LINESTRING(0 0,10 0,5 0,5 5)",
  107. "1FF0FF102");
  108. test_geometry<ls, ls>("LINESTRING(1 0,7 0)", "LINESTRING(0 0,10 0,10 10,4 -1)",
  109. "1FF0FF102");
  110. test_geometry<ls, ls>("LINESTRING(1 0,5 0,7 0)", "LINESTRING(0 0,10 0,10 10,4 -1)",
  111. "1FF0FF102");
  112. test_geometry<ls, ls>("LINESTRING(1 0,7 0,8 1)", "LINESTRING(0 0,10 0,10 10,4 -1)",
  113. "1F10F0102");
  114. test_geometry<ls, ls>("LINESTRING(1 0,5 0,7 0,8 1)", "LINESTRING(0 0,10 0,10 10,4 -1)",
  115. "1F10F0102");
  116. // self-IP going out and in on the same point
  117. test_geometry<ls, ls>("LINESTRING(2 0,5 0,5 5,6 5,5 0,8 0)", "LINESTRING(1 0,9 0)",
  118. "1F10FF102");
  119. // duplicated points
  120. test_geometry<ls, ls>("LINESTRING(1 1.0004570537241206, 2 2, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
  121. test_geometry<ls, ls>("LINESTRING(1 1.0004570537241206, 1 1.0004570537241206, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
  122. // linear ring
  123. test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(5 0,9 0,5 5,1 0,5 0)", "1F1FF01F2");
  124. test_geometry<ls, ls>("LINESTRING(0 0,5 0,10 0)", "LINESTRING(5 0,9 0,5 5,1 0,5 0)", "1F1FF01F2");
  125. test_geometry<ls, ls>("LINESTRING(0 0,5 0,10 0)", "LINESTRING(5 0,10 0,5 5,1 0,5 0)", "1F10F01F2");
  126. test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(5 0,10 0,5 5,0 0,5 0)", "1FF0FF1F2");
  127. test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(5 0,10 0,5 5,5 0)", "FF10F01F2");
  128. test_geometry<ls, ls>("LINESTRING(1 0,1 6)", "LINESTRING(0 0,5 0,5 5,0 5)", "0F10F0102");
  129. // point-size Linestring
  130. test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(0 0,5 0)", "0FFFFF102");
  131. test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(1 0,5 0)", "F0FFFF102");
  132. test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(0 0,1 0)", "F0FFFF102");
  133. test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(1 0,1 0)", "0FFFFFFF2");
  134. test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(0 0,0 0)", "FF0FFF0F2");
  135. //to_svg<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(5 0,10 0,5 5,5 0)", "test_relate_00.svg");
  136. // INVALID LINESTRINGS
  137. // 1-point LS (a Point) NOT disjoint
  138. //test_geometry<ls, ls>("LINESTRING(1 0)", "LINESTRING(0 0,5 0)", "0FFFFF102");
  139. //test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(1 0)", "0F1FF0FF2");
  140. //test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(1 0,1 0,1 0)", "0F1FF0FF2");
  141. // Point/Point
  142. //test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0)", "0FFFFFFF2");
  143. if ( BOOST_GEOMETRY_CONDITION(
  144. boost::is_floating_point<typename bg::coordinate_type<ls>::type>::value ) )
  145. {
  146. // https://svn.boost.org/trac/boost/ticket/10904
  147. // very small segments
  148. test_geometry<ls, ls>("LINESTRING(5.6956521739130430148634331999347 -0.60869565217391330413931882503675,5.5 -0.50000000000000066613381477509392)",
  149. "LINESTRING(5.5 -0.50000000000000066613381477509392,5.5 -0.5)",
  150. "*********"); // TODO: be more specific with the result
  151. test_geometry<ls, ls>("LINESTRING(-3.2333333333333333925452279800083 5.5999999999999978683717927196994,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
  152. "LINESTRING(-3.2333333333333325043668082798831 5.5999999999999996447286321199499,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
  153. "*********"); // TODO: be more specific with the result
  154. }
  155. if ( BOOST_GEOMETRY_CONDITION((
  156. boost::is_same<typename bg::coordinate_type<ls>::type, double>::value )) )
  157. {
  158. // detected as collinear
  159. test_geometry<ls, ls>("LINESTRING(1 -10, 3.069359e+307 3.069359e+307)",
  160. "LINESTRING(1 6, 1 0)",
  161. "*********"); // TODO: be more specific with the result
  162. }
  163. // OTHER MASKS
  164. {
  165. namespace bgdr = bg::detail::relate;
  166. ls ls1, ls2, ls3, ls4;
  167. bg::read_wkt("LINESTRING(0 0,2 0)", ls1);
  168. bg::read_wkt("LINESTRING(2 0,4 0)", ls2);
  169. bg::read_wkt("LINESTRING(1 0,1 1)", ls3);
  170. bg::read_wkt("LINESTRING(1 0,4 0)", ls4);
  171. BOOST_CHECK(bg::relate(ls1, ls2, bg::de9im::mask("FT*******")
  172. || bg::de9im::mask("F**T*****")
  173. || bg::de9im::mask("F***T****")));
  174. BOOST_CHECK(bg::relate(ls1, ls3, bg::de9im::mask("FT*******")
  175. || bg::de9im::mask("F**T*****")
  176. || bg::de9im::mask("F***T****")));
  177. BOOST_CHECK(bg::relate(ls3, ls1, bg::de9im::mask("FT*******")
  178. || bg::de9im::mask("F**T*****")
  179. || bg::de9im::mask("F***T****")));
  180. BOOST_CHECK(bg::relate(ls2, ls4, bg::de9im::mask("T*F**F***"))); // within
  181. BOOST_CHECK(bg::relate(ls1, ls2, bg::de9im::static_mask<'F','T'>()
  182. || bg::de9im::static_mask<'F','*','*','T'>()
  183. || bg::de9im::static_mask<'F','*','*','*','T'>()));
  184. BOOST_CHECK(bg::relate(ls1, ls2, bg::de9im::mask("FT")
  185. || bg::de9im::mask("F**T")
  186. || bg::de9im::mask("F***T**************")));
  187. BOOST_CHECK_THROW(bg::relate(ls1, ls2, bg::de9im::mask("A")), bg::invalid_input_exception);
  188. }
  189. // spike - boundary and interior on the same point
  190. test_geometry<ls, ls>("LINESTRING(3 7.0222344894505291, 8 8, 2 6.0297078652914440)", "LINESTRING(5 7.0264720782244758, 10 7, 0 7)", "0010F0102");
  191. // 22.01.2015
  192. test_geometry<ls, ls>("LINESTRING(5 5.0276084891434261,10 10)", "LINESTRING(6 6.0348911579043349,3 3)", "1010F0102");
  193. test_geometry<ls, ls>("LINESTRING(5 5.0146631750126396,2 8)", "LINESTRING(4 6.0155438000959975,7 3)", "1010F0102");
  194. }
  195. template <typename P>
  196. void test_linestring_multi_linestring()
  197. {
  198. typedef bg::model::linestring<P> ls;
  199. typedef bg::model::multi_linestring<ls> mls;
  200. // LS disjoint
  201. test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,2 1))", "101FF0102");
  202. // linear ring disjoint
  203. test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,2 1,2 2,1 1))", "101FF01F2");
  204. // 2xLS forming non-simple linear ring disjoint
  205. test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,2 1,2 2),(1 1,2 2))", "101FF01F2");
  206. test_geometry<ls, mls>("LINESTRING(0 0,10 0)",
  207. "MULTILINESTRING((1 0,9 0),(9 0,2 0))",
  208. "101FF0FF2");
  209. // rings
  210. test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
  211. "MULTILINESTRING((5 5,0 5,0 0),(0 0,5 0,5 5))",
  212. "1FFFFFFF2");
  213. test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
  214. "MULTILINESTRING((5 5,5 0,0 0),(0 0,0 5,5 5))",
  215. "1FFFFFFF2");
  216. // overlapping rings
  217. test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
  218. "MULTILINESTRING((5 5,0 5,0 0),(0 0,5 0,5 5,0 5))",
  219. "10FFFFFF2");
  220. test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
  221. "MULTILINESTRING((5 5,5 0,0 0),(0 0,0 5,5 5,5 0))",
  222. "10FFFFFF2");
  223. // INVALID LINESTRINGS
  224. // 1-point LS (a Point) disjoint
  225. //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1))", "101FF00F2");
  226. //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,1 1))", "101FF00F2");
  227. //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,1 1,1 1))", "101FF00F2");
  228. // 1-point LS (a Point) NOT disjoint
  229. //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,9 0),(2 0))", "101FF0FF2");
  230. //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,9 0),(2 0,2 0))", "101FF0FF2");
  231. //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,9 0),(2 0,2 0,2 0))", "101FF0FF2");
  232. // point-like
  233. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  234. "MULTILINESTRING((0 0, 1 0),(2 0, 2 0))", // |------| *
  235. "101F00FF2");
  236. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  237. "MULTILINESTRING((0 0, 1 0),(1 0, 1 0))", // |------*
  238. "101F00FF2");
  239. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  240. "MULTILINESTRING((5 0, 1 0),(1 0, 1 0))", // *-------|
  241. "101F00FF2");
  242. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  243. "MULTILINESTRING((0 0, 1 0),(5 0, 5 0))", // |------| *
  244. "10100FFF2");
  245. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  246. "MULTILINESTRING((0 0, 1 0),(0 0, 0 0))", // *------|
  247. "101000FF2");
  248. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  249. "MULTILINESTRING((4 0, 5 0),(5 0, 5 0))", // |------*
  250. "101000FF2");
  251. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  252. "MULTILINESTRING((1 0, 2 0),(0 0, 0 0))", // * |------|
  253. "1010F0FF2");
  254. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  255. "MULTILINESTRING((2 0, 2 0),(2 0, 2 2))", // *
  256. "001FF0102"); // |
  257. // for consistency
  258. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  259. "MULTILINESTRING((0 0, 5 0),(0 0, 2 0))", // |--------------|
  260. "10F00FFF2"); // |------|
  261. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  262. "MULTILINESTRING((0 0, 5 0),(3 0, 5 0))", // |--------------|
  263. "10F00FFF2"); // |------|
  264. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  265. "MULTILINESTRING((0 0, 5 0),(0 0, 6 0))", // |--------------|
  266. "1FF00F102"); // |----------------|
  267. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  268. "MULTILINESTRING((0 0, 5 0),(-1 0, 5 0))", // |--------------|
  269. "1FF00F102"); // |----------------|
  270. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  271. "MULTILINESTRING((0 0, 5 0),(-1 0, 6 0))", // |--------------|
  272. "1FF00F102"); // |------------------|
  273. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  274. "MULTILINESTRING((0 0, 5 0),(-1 0, 2 0))", // |--------------|
  275. "10F00F102"); // |-------|
  276. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  277. "MULTILINESTRING((0 0, 5 0),(2 0, 6 0))", // |--------------|
  278. "10F00F102"); // |-------|
  279. test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
  280. "MULTILINESTRING((0 0, 5 0),(2 0, 2 2))", // |--------------|
  281. "10FF0F102"); // |
  282. // |
  283. if ( BOOST_GEOMETRY_CONDITION(boost::is_floating_point<typename bg::coordinate_type<ls>::type>::value) )
  284. {
  285. // related to https://svn.boost.org/trac/boost/ticket/10904
  286. test_geometry<ls, mls>("LINESTRING(-2305843009213693956 4611686018427387906, -33 -92, 78 83)",
  287. "MULTILINESTRING((20 100, 31 -97, -46 57, -20 -4),(-71 -4))",
  288. "*********"); // TODO: be more specific with the result
  289. }
  290. // 22.01.2015
  291. // inspired by L/A and A/A
  292. test_geometry<ls, mls>("LINESTRING(1 1.0012195839797347,2 2.0015234344160047)",
  293. "MULTILINESTRING((0 0,1 1.0012195839797347),(1 1.0012195839797347,3 3))",
  294. "1FF0FF102");
  295. // for floats this is considered as collinear due to a special check in spherical intersection strategy
  296. test_geometry<ls, mls>("LINESTRING(1 1,2 2)",
  297. "MULTILINESTRING((0 0,1 1),(1 1,3 3))",
  298. "FF10F0102", "1FF0FF102");
  299. // 25.01.2015
  300. test_geometry<ls, mls>("LINESTRING(1 1.0152687848942923, 5 5.0575148968282102, 4 4.0516408785782314)",
  301. "MULTILINESTRING((2 5.1322576184978592, 7 5, 8 3, 6 3, 4 0),(0 0,10 10))",
  302. "1FF0FF102");
  303. test_geometry<ls, mls>("LINESTRING(4 1, 4 5, 4 4)",
  304. "MULTILINESTRING((2 5.1322576184978592, 7 5, 8 3, 6 3, 4 0),(4 0, 4 8, 0 4))",
  305. "1FF0FF102");
  306. test_geometry<ls, mls>("LINESTRING(1 1.0152687848942923,5 5.0575148968282102,4 4.0516408785782314)",
  307. "MULTILINESTRING((5 0,5 5.0575148968282102,5 10),(0 0,10 10))",
  308. "1FF0FF102");
  309. test_geometry<ls, mls>("LINESTRING(1 1.0036662021874625,5 5,1 0)",
  310. "MULTILINESTRING((5 0,5 5,5 10),(0 0,5 5,1 0))",
  311. "1FF00F102");
  312. test_geometry<ls, mls>("LINESTRING(5 5.0575148968282102,4 4.0516408785782314)",
  313. "MULTILINESTRING((5 0,5 5.0575148968282102,5 10),(0 0,10 10))",
  314. "1FF0FF102");
  315. test_geometry<ls, mls>("LINESTRING(6 6.0587459045645184,5 5.0575148968282102,4 4.0516408785782314)",
  316. "MULTILINESTRING((5 0,5 5.0575148968282102,5 10),(0 0,10 10))",
  317. "1FF0FF102");
  318. test_geometry<ls, mls>("LINESTRING(5 5,4 4)",
  319. "MULTILINESTRING((5 0,5 5,5 10))",
  320. "FF10F0102");
  321. }
  322. template <typename P>
  323. void test_multi_linestring_multi_linestring()
  324. {
  325. typedef bg::model::linestring<P> ls;
  326. typedef bg::model::multi_linestring<ls> mls;
  327. test_geometry<mls, mls>("MULTILINESTRING((0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0))",
  328. "MULTILINESTRING((0 10,5 0,20 0,20 0,30 0))",
  329. "1F1F00102");
  330. test_geometry<mls, mls>("MULTILINESTRING((0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0))",
  331. //"MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),(1 10,1 10,1 0,1 0,1 -10),(2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),(30 0,30 0,31 0,31 0))",
  332. "MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),(1 10,1 10,1 0,1 0,1 -10),(0 0,0 0,0 10,0 10),(30 0,30 0,31 0,31 0))",
  333. "1F100F102");
  334. test_geometry<mls, mls>("MULTILINESTRING((0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0))",
  335. "MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),(0 0,0 0,0 10,0 10))",
  336. "1F1F0F1F2");
  337. // point-like
  338. test_geometry<mls, mls>("MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
  339. "MULTILINESTRING((0 0, 0 0))",
  340. "0F0FFFFF2");
  341. test_geometry<mls, mls>("MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
  342. "MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
  343. "0FFFFFFF2");
  344. test_geometry<mls, mls>("MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
  345. "MULTILINESTRING((2 2, 2 2),(3 3, 3 3))",
  346. "FF0FFF0F2");
  347. test_geometry<mls, mls>("MULTILINESTRING((0 5,10 5,10 10,5 10),(5 10,5 0,5 2),(5 2,5 5.0190018174896416,0 5))",
  348. "MULTILINESTRING((5 5.0190018174896416,0 5),(5 5.0190018174896416,5 0),(10 10,10 5,5 5.0190018174896416,5 10,10 10))",
  349. "10FFFFFF2");
  350. if ( BOOST_GEOMETRY_CONDITION((
  351. boost::is_same<typename bg::coordinate_type<P>::type, double>::value )) )
  352. {
  353. // assertion failure in 1.57
  354. test_geometry<mls, mls>("MULTILINESTRING((-0.59322033898305082 -8.0508474576271194,-2.882352941176471 -7.7647058823529411,-2.8823529411764706 -7.7647058823529411,-3.7361111111111112 -6.5694444444444446,-3.4404145077720205 -5.766839378238342,-4.1864406779661012 -3.6779661016949152,-7.5252525252525251 -5.5858585858585865,-7.5862068965517242 -5.1896551724137936,-4.47887323943662 -2.859154929577465,-4.5789473684210531 -2.5789473684210527,-3 -1,-2.9310344827586206 -0.86206896551724144,-3.1764705882352944 -0.70588235294117663,-4.7401960784313726 -2.1274509803921577,-5.3255813953488369 -0.48837209302325502,-4.7872340425531918 0.31914893617021284,-5.8571428571428577 1.0000000000000007,-5.3255813953488369 -0.48837209302325502,-5.9473684210526319 -1.4210526315789465,-8 2,-7.7333333333333334 2.1939393939393939,-8.8294573643410867 2.891472868217055,-8.8556701030927822 3.061855670103093,-7.5999999999999996 3.6000000000000001,-7.7999999999999998 3.7999999999999998,-7.75 3.7916666666666665,-7.5471698113207548 3.6226415094339623,-7.3200000000000003 3.7200000000000002,-3.473684210526315 3.0789473684210527,-3.2549019607843133 3.2156862745098036,-2.9999999999999982 3.1428571428571423,-3.1733333333333325 3.2666666666666666,-2.9180327868852456 3.4262295081967209,-2.8723404255319145 3.1063829787234041,-2.1111111111111112 2.8888888888888888,-2.1428571428571428 2.8571428571428572,-1.8433734939759043 2.8072289156626509,-1.8396226415094346 2.8113207547169816,-1.6486486486486487 2.756756756756757,-1.76510067114094 2.8926174496644301,-0.53846153846153855 4.2307692307692308,1.8148148148148147 5.4074074074074074,1.588235294117647 2.2352941176470589,1.819672131147541 2.1967213114754101,2 4,2 2.1666666666666665,2.3538461538461544 2.1076923076923078,2 1.6875000000000004,2 -2,1.2173913043478262 -3.8260869565217392,1.7375886524822697 1.3758865248226959,1.5073170731707317 1.1024390243902444,1.1428571428571428 -4,-0.59322033898305082 -8.0508474576271194),(1.666666666666667 1.5999999999999988,1.5675675675675675 1.8378378378378377,1.4374999999999991 1.8750000000000002,1.0487804878048776 2.3414634146341466,0.46666666666666712 2.6060606060606055,0.086956521739131043 2.2608695652173911,1.4374999999999991 1.8750000000000002,1.666666666666667 1.5999999999999988))",
  355. "MULTILINESTRING((-2.333333333333333 -8.6666666666666661,-4.3253012048192767 -8.168674698795181,-4.1194968553459113 -7.6100628930817606,-2.8823529411764706 -7.7647058823529411,-2.882352941176471 -7.7647058823529411,-2.263157894736842 -8.6315789473684212,-2.333333333333333 -8.6666666666666661))",
  356. "*********");
  357. }
  358. }
  359. template <typename P>
  360. void test_all()
  361. {
  362. test_linestring_linestring<P>();
  363. test_linestring_multi_linestring<P>();
  364. test_multi_linestring_multi_linestring<P>();
  365. }
  366. int test_main( int , char* [] )
  367. {
  368. typedef bg::cs::spherical_equatorial<bg::degree> cs_t;
  369. test_all<bg::model::point<float, 2, cs_t> >();
  370. test_all<bg::model::point<double, 2, cs_t> >();
  371. #if defined(HAVE_TTMATH)
  372. test_all<bg::model::point<ttmath_big, 2, cs_t> >();
  373. #endif
  374. return 0;
  375. }