intersection_linear_linear.cpp 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2014-2015, Oracle and/or its affiliates.
  3. // Licensed under the Boost Software License version 1.0.
  4. // http://www.boost.org/users/license.html
  5. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
  6. #include <iostream>
  7. #ifndef BOOST_TEST_MODULE
  8. #define BOOST_TEST_MODULE test_intersection_linear_linear
  9. #endif
  10. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  11. #define BOOST_GEOMETRY_DEBUG_TURNS
  12. #define BOOST_GEOMETRY_DEBUG_SEGMENT_IDENTIFIER
  13. #endif
  14. #include <boost/test/included/unit_test.hpp>
  15. #include "test_intersection_linear_linear.hpp"
  16. #include <boost/geometry/geometries/linestring.hpp>
  17. #include <boost/geometry/geometries/multi_linestring.hpp>
  18. #include <boost/geometry/algorithms/intersection.hpp>
  19. typedef bg::model::point<double,2,bg::cs::cartesian> point_type;
  20. typedef bg::model::segment<point_type> segment_type;
  21. typedef bg::model::linestring<point_type> linestring_type;
  22. typedef bg::model::multi_linestring<linestring_type> multi_linestring_type;
  23. //===========================================================================
  24. //===========================================================================
  25. //===========================================================================
  26. BOOST_AUTO_TEST_CASE( test_intersection_linestring_linestring )
  27. {
  28. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  29. std::cout << std::endl << std::endl << std::endl;
  30. std::cout << "*** LINESTRING / LINESTRING INTERSECTION ***" << std::endl;
  31. std::cout << std::endl;
  32. #endif
  33. typedef linestring_type L;
  34. typedef multi_linestring_type ML;
  35. typedef test_intersection_of_geometries<L, L, ML> tester;
  36. tester::apply
  37. (from_wkt<L>("LINESTRING(0 0,1 1,2 1,3 2)"),
  38. from_wkt<L>("LINESTRING(0 2,1 1,2 1,3 0)"),
  39. from_wkt<ML>("MULTILINESTRING((1 1,2 1))"),
  40. "lli00");
  41. tester::apply
  42. (from_wkt<L>("LINESTRING(0 0,5 0)"),
  43. from_wkt<L>("LINESTRING(3 0,4 0)"),
  44. from_wkt<ML>("MULTILINESTRING((3 0,4 0))"),
  45. "lli01");
  46. tester::apply
  47. (from_wkt<L>("LINESTRING(0 0,4 0)"),
  48. from_wkt<L>("LINESTRING(3 0,6 0)"),
  49. from_wkt<ML>("MULTILINESTRING((3 0,4 0))"),
  50. "lli01-2");
  51. tester::apply
  52. (from_wkt<L>("LINESTRING(0 0,6 0)"),
  53. from_wkt<L>("LINESTRING(0 0,4 0)"),
  54. from_wkt<ML>("MULTILINESTRING((0 0,4 0))"),
  55. "lli01-4");
  56. tester::apply
  57. (from_wkt<L>("LINESTRING(0 0,20 0)"),
  58. from_wkt<L>("LINESTRING(0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0)"),
  59. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  60. from_wkt<ML>("MULTILINESTRING((4 0,5 0))"),
  61. #else
  62. from_wkt<ML>("MULTILINESTRING((0 0),(2 0),(4 0,5 0),(6.5 0),(8 0))"),
  63. #endif
  64. "lli01-6");
  65. tester::apply
  66. (from_wkt<L>("LINESTRING(-20 0,20 0)"),
  67. from_wkt<L>("LINESTRING(0 0,1 1,2 0,3 1,4 0,5 0,6 1,7 -1,8 0)"),
  68. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  69. from_wkt<ML>("MULTILINESTRING((4 0,5 0))"),
  70. #else
  71. from_wkt<ML>("MULTILINESTRING((0 0),(2 0),(4 0,5 0),(6.5 0),(8 0))"),
  72. #endif
  73. "lli01-7");
  74. tester::apply
  75. (from_wkt<L>("LINESTRING(0 0,4 0)"),
  76. from_wkt<L>("LINESTRING(2 0,4 0)"),
  77. from_wkt<ML>("MULTILINESTRING((2 0,4 0))"),
  78. "lli01-8");
  79. tester::apply
  80. (from_wkt<L>("LINESTRING(0 0,2 0)"),
  81. from_wkt<L>("LINESTRING(4 0,5 0)"),
  82. from_wkt<ML>("MULTILINESTRING()"),
  83. "lli01-10");
  84. tester::apply
  85. (from_wkt<L>("LINESTRING(0 0,2 0)"),
  86. from_wkt<L>("LINESTRING(2 0,5 0)"),
  87. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  88. from_wkt<ML>("MULTILINESTRING()"),
  89. #else
  90. from_wkt<ML>("MULTILINESTRING((2 0))"),
  91. #endif
  92. "lli01-11");
  93. tester::apply
  94. (from_wkt<L>("LINESTRING(0 0,1 0,4 0)"),
  95. from_wkt<L>("LINESTRING(3 0,5 0)"),
  96. from_wkt<ML>("MULTILINESTRING((3 0,4 0))"),
  97. "lli01-11a");
  98. tester::apply
  99. (from_wkt<L>("LINESTRING(0 0,1 0,4 0)"),
  100. from_wkt<L>("LINESTRING(3 0,4 0,5 0)"),
  101. from_wkt<ML>("MULTILINESTRING((3 0,4 0))"),
  102. "lli01-11b");
  103. tester::apply
  104. (from_wkt<L>("LINESTRING(0 0,5 0,10 0)"),
  105. from_wkt<L>("LINESTRING(2 0,6 0,8 0)"),
  106. from_wkt<ML>("MULTILINESTRING((2 0,5 0,8 0))"),
  107. from_wkt<ML>("MULTILINESTRING((2 0,6 0,8 0))"),
  108. "lli01-11c");
  109. tester::apply
  110. (from_wkt<L>("LINESTRING(0 0,6 0)"),
  111. from_wkt<L>("LINESTRING(2 0,4 0,5 0)"),
  112. from_wkt<ML>("MULTILINESTRING((2 0,5 0))"),
  113. from_wkt<ML>("MULTILINESTRING((2 0,4 0,5 0))"),
  114. "lli01-12");
  115. tester::apply
  116. (from_wkt<L>("LINESTRING(0 0,1 0,5 5,10 5,15 0)"),
  117. from_wkt<L>("LINESTRING(-1 6,0 5,15 5)"),
  118. from_wkt<ML>("MULTILINESTRING((5 5,10 5))"),
  119. "lli02");
  120. tester::apply
  121. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0)"),
  122. from_wkt<L>("LINESTRING(-1 0,30 0)"),
  123. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,20 0))"),
  124. "lli03");
  125. tester::apply
  126. (from_wkt<L>("LINESTRING(0 0,1 0,5 5,10 5,15 0,20 0)"),
  127. from_wkt<L>("LINESTRING(-1 0,30 0)"),
  128. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,20 0))"),
  129. "lli04");
  130. tester::apply
  131. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,25 1)"),
  132. from_wkt<L>("LINESTRING(-1 0,30 0)"),
  133. from_wkt<ML>("MULTILINESTRING((0 0,1 0)(15 0,20 0))"),
  134. "lli05");
  135. tester::apply
  136. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0)"),
  137. from_wkt<L>("LINESTRING(-1 0,30 0)"),
  138. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,20 0,30 0))"),
  139. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,30 0))"),
  140. "lli05-1");
  141. tester::apply
  142. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"),
  143. from_wkt<L>("LINESTRING(-1 0,30 0)"),
  144. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,20 0,30 0))"),
  145. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,30 0))"),
  146. "lli06");
  147. tester::apply
  148. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"),
  149. from_wkt<L>("LINESTRING(-1 0,25 0,30 0)"),
  150. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,20 0,30 0))"),
  151. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,25 0,30 0))"),
  152. "lli07");
  153. tester::apply
  154. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,31 0)"),
  155. from_wkt<L>("LINESTRING(-1 0,19 0,30 0)"),
  156. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,20 0,30 0))"),
  157. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,19 0,30 0))"),
  158. "lli08");
  159. tester::apply
  160. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0,31 1)"),
  161. from_wkt<L>("LINESTRING(-1 0,30 0)"),
  162. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,20 0,30 0))"),
  163. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,30 0))"),
  164. "lli09");
  165. tester::apply
  166. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,5 5,10 5,15 0,20 0,30 0,31 1)"),
  167. from_wkt<L>("LINESTRING(-1 -1,0 0,1 0,2 1,3 0,30 0)"),
  168. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,20 0,30 0))"),
  169. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(15 0,30 0))"),
  170. "lli10");
  171. tester::apply
  172. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,4 0,5 5,10 5,15 0,20 0,\
  173. 30 0,31 1)"),
  174. from_wkt<L>("LINESTRING(-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0)"),
  175. from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 0),(3 0,4 0),\
  176. (15 0,20 0,30 0))"),
  177. from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 0),(3 0,4 0),\
  178. (15 0,30 0))"),
  179. "lli11");
  180. tester::apply
  181. (from_wkt<L>("LINESTRING(-1 1,0 0,1 0,4 0,5 5,10 5,15 0,31 0)"),
  182. from_wkt<L>("LINESTRING(-1 -1,0 0,1 0,2 0,2.5 1,3 0,30 0)"),
  183. from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 0),\
  184. (3 0,4 0),(15 0,30 0))"),
  185. "lli11-1");
  186. tester::apply
  187. (from_wkt<L>("LINESTRING(0 0,2 0,3 1)"),
  188. from_wkt<L>("LINESTRING(0 0,2 0,3 1)"),
  189. from_wkt<ML>("MULTILINESTRING((0 0,2 0,3 1))"),
  190. "lli12");
  191. tester::apply
  192. (from_wkt<L>("LINESTRING(0 0,2 0,3 1)"),
  193. from_wkt<L>("LINESTRING(3 1,2 0,0 0)"),
  194. from_wkt<ML>("MULTILINESTRING((0 0,2 0,3 1))"),
  195. from_wkt<ML>("MULTILINESTRING((3 1,2 0,0 0))"),
  196. "lli12-1");
  197. tester::apply
  198. (from_wkt<L>("LINESTRING(0 0,1 0,2 1,3 5,4 0)"),
  199. from_wkt<L>("LINESTRING(1 0,2 1,3 5,4 0,5 10)"),
  200. from_wkt<ML>("MULTILINESTRING((1 0,2 1,3 5,4 0))"),
  201. "lli13");
  202. tester::apply
  203. (from_wkt<L>("LINESTRING(0 0,1 0,2 0,2.5 0,3 1)"),
  204. from_wkt<L>("LINESTRING(0 0,2 0,2.5 0,3 1)"),
  205. from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 0,2.5 0,3 1))"),
  206. from_wkt<ML>("MULTILINESTRING((0 0,2 0,2.5 0,3 1))"),
  207. "lli14");
  208. tester::apply
  209. (from_wkt<L>("LINESTRING(0 0,1 0,2 1,3 5,4 0)"),
  210. from_wkt<L>("LINESTRING(1 0,2 1,3 5)"),
  211. from_wkt<ML>("MULTILINESTRING((1 0,2 1,3 5))"),
  212. "lli15");
  213. tester::apply
  214. (from_wkt<L>("LINESTRING(0 0,1 0,2 1,3 2)"),
  215. from_wkt<L>("LINESTRING(0.5 0,1 0,3 2,4 5)"),
  216. from_wkt<ML>("MULTILINESTRING((0.5 0,1 0,2 1,3 2))"),
  217. from_wkt<ML>("MULTILINESTRING((0.5 0,1 0,3 2))"),
  218. "lli16");
  219. tester::apply
  220. (from_wkt<L>("LINESTRING(0 0,1 0,2 1,3 2)"),
  221. from_wkt<L>("LINESTRING(4 5,3 2,1 0,0.5 0)"),
  222. from_wkt<ML>("MULTILINESTRING((0.5 0,1 0,2 1,3 2))"),
  223. from_wkt<ML>("MULTILINESTRING((0.5 0,1 0,3 2))"),
  224. "lli16-r");
  225. tester::apply
  226. (from_wkt<L>("LINESTRING(0 0,10 0,20 1,30 1)"),
  227. from_wkt<L>("LINESTRING(1 1,2 0,3 1,20 1,25 1)"),
  228. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  229. from_wkt<ML>("MULTILINESTRING((20 1,25 1))"),
  230. #else
  231. from_wkt<ML>("MULTILINESTRING((2 0),(20 1,25 1))"),
  232. #endif
  233. "lli17");
  234. tester::apply
  235. (from_wkt<L>("LINESTRING(0 0,10 0,20 1,21 0,30 0)"),
  236. from_wkt<L>("LINESTRING(1 1,2 0,3 1,20 1,25 0)"),
  237. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  238. from_wkt<ML>("MULTILINESTRING()"),
  239. #else
  240. from_wkt<ML>("MULTILINESTRING((2 0),(20 1),(25 0))"),
  241. #endif
  242. "lli18");
  243. tester::apply
  244. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  245. from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 1)"),
  246. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  247. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  248. #else
  249. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  250. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(4 0))"),
  251. #endif
  252. "lli19");
  253. tester::apply
  254. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  255. from_wkt<L>("LINESTRING(5 1,4 0,4 1,20 1,5 0,1 0)"),
  256. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  257. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  258. #else
  259. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  260. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(4 0))"),
  261. #endif
  262. "lli19-r");
  263. tester::apply
  264. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  265. from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0)"),
  266. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  267. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  268. #else
  269. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  270. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(4 0))"),
  271. #endif
  272. "lli19a");
  273. tester::apply
  274. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  275. from_wkt<L>("LINESTRING(4 0,4 1,20 1,5 0,1 0)"),
  276. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  277. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  278. #else
  279. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  280. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(4 0))"),
  281. #endif
  282. "lli19a-r");
  283. tester::apply
  284. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  285. from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0)"),
  286. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  287. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(4 0,5 0))"),
  288. "lli19b");
  289. tester::apply
  290. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  291. from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0,6 1)"),
  292. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  293. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(4 0,5 0))"),
  294. "lli19c");
  295. tester::apply
  296. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  297. from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,3 0)"),
  298. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  299. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(4 0,3 0))"),
  300. "lli19d");
  301. tester::apply
  302. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  303. from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,3 0,3 1)"),
  304. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  305. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(4 0,3 0))"),
  306. "lli19e");
  307. tester::apply
  308. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  309. from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,4 0,5 0,5 1)"),
  310. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  311. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(4 0,5 0))"),
  312. "lli19f");
  313. tester::apply
  314. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  315. from_wkt<L>("LINESTRING(5 1,5 0,4 0,4 1,20 1,5 0,1 0)"),
  316. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  317. from_wkt<ML>("MULTILINESTRING((5 0,4 0),(5 0,1 0))"),
  318. "lli19f-r");
  319. tester::apply
  320. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  321. from_wkt<L>("LINESTRING(1 0,5 0,20 1,4 1,5 0,5 1)"),
  322. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  323. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  324. #else
  325. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  326. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(5 0))"),
  327. #endif
  328. "lli19g");
  329. tester::apply
  330. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  331. from_wkt<L>("LINESTRING(5 1,5 0,4 1,20 1,5 0,1 0)"),
  332. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  333. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  334. #else
  335. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  336. from_wkt<ML>("MULTILINESTRING((1 0,5 0),(5 0))"),
  337. #endif
  338. "lli19g-r");
  339. tester::apply
  340. (from_wkt<L>("LINESTRING(0 0,30 0,30 30,10 30,10 -10,15 0,40 0)"),
  341. from_wkt<L>("LINESTRING(5 5,10 0,10 30,20 0,25 0,25 25,50 0,35 0)"),
  342. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  343. from_wkt<ML>("MULTILINESTRING((20 0,25 0),(10 30,10 0),\
  344. (35 0,40 0),(20 0,25 0))"),
  345. from_wkt<ML>("MULTILINESTRING((20 0,25 0),(10 0,10 30),\
  346. (40 0,35 0))"),
  347. #else
  348. from_wkt<ML>("MULTILINESTRING((10 0),(20 0,25 0),(10 30,10 0),\
  349. (30 20),(35 0,40 0),(20 0,25 0))"),
  350. from_wkt<ML>("MULTILINESTRING((10 0),(20 0,25 0),(10 0,10 30),\
  351. (30 20),(40 0,35 0))"),
  352. #endif
  353. "lli20");
  354. tester::apply
  355. (from_wkt<L>("LINESTRING(0 0,30 0,30 30,10 30,10 -10,15 0,40 0)"),
  356. from_wkt<L>("LINESTRING(5 5,10 0,10 30,20 0,25 0,25 25,50 0,15 0)"),
  357. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  358. from_wkt<ML>("MULTILINESTRING((15 0,30 0),(10 30,10 0),\
  359. (15 0,40 0))"),
  360. from_wkt<ML>("MULTILINESTRING((10 0,10 30),(20 0,25 0),(40 0,15 0))"),
  361. #else
  362. from_wkt<ML>("MULTILINESTRING((10 0),(15 0,30 0),(10 30,10 0),\
  363. (30 20),(15 0,40 0))"),
  364. from_wkt<ML>("MULTILINESTRING((10 0),(10 0,10 30),(20 0,25 0),\
  365. (30 20),(40 0,15 0))"),
  366. #endif
  367. "lli20a");
  368. tester::apply
  369. (from_wkt<L>("LINESTRING(0 0,18 0,19 0,30 0)"),
  370. from_wkt<L>("LINESTRING(2 2,5 -1,15 2,18 0,20 0)"),
  371. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  372. from_wkt<ML>("MULTILINESTRING((18 0,19 0,20 0))"),
  373. from_wkt<ML>("MULTILINESTRING((18 0,20 0))"),
  374. #else
  375. from_wkt<ML>("MULTILINESTRING((4 0),(8.33333333333333333 0),\
  376. (18 0,19 0,20 0))"),
  377. from_wkt<ML>("MULTILINESTRING((4 0),(8.33333333333333333 0),\
  378. (18 0,20 0))"),
  379. #endif
  380. "lli21"
  381. );
  382. tester::apply
  383. (from_wkt<L>("LINESTRING(0 0,10 0)"),
  384. from_wkt<L>("LINESTRING(1 0,4 0,2 1,5 1,4 0,8 0)"),
  385. from_wkt<ML>("MULTILINESTRING((1 0,4 0),(4 0,8 0))"),
  386. "lli22"
  387. );
  388. tester::apply
  389. (from_wkt<L>("LINESTRING(0 0,10 0)"),
  390. from_wkt<L>("LINESTRING(4 0,5 0,5 1,1 1,1 0,4 0)"),
  391. from_wkt<ML>("MULTILINESTRING((1 0,5 0))"),
  392. from_wkt<ML>("MULTILINESTRING((1 0,4 0),(4 0,5 0))"),
  393. "lli23"
  394. );
  395. // the following two tests have been discussed with by Adam
  396. tester::apply
  397. (from_wkt<L>("LINESTRING(1 0,1 1,2 1)"),
  398. from_wkt<L>("LINESTRING(2 1,1 1,1 0)"),
  399. from_wkt<ML>("MULTILINESTRING((1 0,1 1,2 1))"),
  400. "lli24"
  401. );
  402. tester::apply
  403. (from_wkt<L>("LINESTRING(1 0,1 1,2 1)"),
  404. from_wkt<L>("LINESTRING(1 2,1 1,1 0)"),
  405. from_wkt<ML>("MULTILINESTRING((1 0,1 1))"),
  406. "lli25"
  407. );
  408. }
  409. BOOST_AUTO_TEST_CASE( test_intersection_linestring_multilinestring )
  410. {
  411. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  412. std::cout << std::endl << std::endl << std::endl;
  413. std::cout << "*** LINESTRING / MULTILINESTRING INTERSECTION ***"
  414. << std::endl;
  415. std::cout << std::endl;
  416. #endif
  417. typedef linestring_type L;
  418. typedef multi_linestring_type ML;
  419. typedef test_intersection_of_geometries<L, ML, ML> tester;
  420. // the inertsection code automatically reverses the order of the
  421. // geometries according to the geometry IDs.
  422. // all calls below are actually reversed, and internally the
  423. // intersection of the linestring with the multi-linestring is
  424. // computed.
  425. // disjoint linestrings
  426. tester::apply
  427. (from_wkt<L>("LINESTRING(0 0,10 0,20 1)"),
  428. from_wkt<ML>("MULTILINESTRING((1 1,2 2,4 3),(1 1,2 2,5 3))"),
  429. from_wkt<ML>("MULTILINESTRING()"),
  430. "lmli01"
  431. );
  432. tester::apply
  433. (from_wkt<L>("LINESTRING(0 0,10 0,20 1)"),
  434. from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,4 0))"),
  435. from_wkt<ML>("MULTILINESTRING((2 0,4 0))"),
  436. "lmli02"
  437. );
  438. tester::apply
  439. (from_wkt<L>("LINESTRING(0 0,10 0,20 1)"),
  440. from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,5 0))"),
  441. from_wkt<ML>("MULTILINESTRING((2 0,5 0))"),
  442. "lmli03"
  443. );
  444. tester::apply
  445. (from_wkt<L>("LINESTRING(0 0,10 0,20 1)"),
  446. from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0))"),
  447. from_wkt<ML>("MULTILINESTRING((2 0,4 0))"),
  448. "lmli04"
  449. );
  450. tester::apply
  451. (from_wkt<L>("LINESTRING(0 0,101 0)"),
  452. from_wkt<ML>("MULTILINESTRING((-1 -1,1 0,101 0,200 -1))"),
  453. from_wkt<ML>("MULTILINESTRING((1 0,101 0))"),
  454. "lmli07"
  455. );
  456. tester::apply
  457. (from_wkt<L>("LINESTRING(-1 1,0 0,101 0)"),
  458. from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
  459. (19 -1,20 0,101 0,200 -1))"),
  460. from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
  461. "lmli07a"
  462. );
  463. tester::apply
  464. (from_wkt<L>("LINESTRING(0 0,101 0)"),
  465. from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
  466. (19 -1,20 0,101 0,200 -1))"),
  467. from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
  468. "lmli07b"
  469. );
  470. tester::apply
  471. (from_wkt<L>("LINESTRING(0 0,101 0)"),
  472. from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0),\
  473. (-1 -1,1 0,101 0,200 -1))"),
  474. from_wkt<ML>("MULTILINESTRING((1 0,101 0))"),
  475. "lmli08"
  476. );
  477. tester::apply
  478. (from_wkt<L>("LINESTRING(0 0,1 0,2 0.5,3 0,101 0)"),
  479. from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0.5),\
  480. (-1 -1,1 0,101 0,200 -1))"),
  481. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  482. from_wkt<ML>("MULTILINESTRING((3 0,101 0))"),
  483. #else
  484. from_wkt<ML>("MULTILINESTRING((1 0),(2 0.5),(3 0,101 0))"),
  485. #endif
  486. "lmli09"
  487. );
  488. tester::apply
  489. (from_wkt<L>("LINESTRING(0 0,1 0,1.5 0,2 0.5,3 0,101 0)"),
  490. from_wkt<ML>("MULTILINESTRING((0 1,1 1,1 0,2 0.5),\
  491. (-1 -1,1 0,101 0,200 -1))"),
  492. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  493. from_wkt<ML>("MULTILINESTRING((1 0,1.5 0),(3 0,101 0))"),
  494. #else
  495. from_wkt<ML>("MULTILINESTRING((1 0),(2 0.5),(1 0,1.5 0),(3 0,101 0))"),
  496. #endif
  497. "lmli10"
  498. );
  499. tester::apply
  500. (from_wkt<L>("LINESTRING(0 0,20 0)"),
  501. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  502. (1 1,2 0,18 0,19 1),(2 1,3 0,17 0,18 1),\
  503. (3 1,4 0,16 0,17 1))"),
  504. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  505. "lmli12"
  506. );
  507. tester::apply
  508. (from_wkt<L>("LINESTRING(0 0,20 0)"),
  509. from_wkt<ML>("MULTILINESTRING((1 0,19 0,20 1),\
  510. (2 0,18 0,19 1),(3 0,17 0,18 1),\
  511. (4 0,16 0,17 1))"),
  512. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  513. "lmli13"
  514. );
  515. tester::apply
  516. (from_wkt<L>("LINESTRING(0 0,20 0)"),
  517. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\
  518. 1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1))"),
  519. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  520. "lmli14"
  521. );
  522. tester::apply
  523. (from_wkt<L>("LINESTRING(0 0,20 0)"),
  524. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  525. (2 2,4 2,6 0))"),
  526. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  527. "lmli15"
  528. );
  529. tester::apply
  530. (from_wkt<L>("LINESTRING(0 0,20 0)"),
  531. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  532. (6 0,4 2,2 2))"),
  533. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  534. "lmli15a"
  535. );
  536. tester::apply
  537. (from_wkt<L>("LINESTRING(0 0,20 0)"),
  538. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  539. (2 2,4 2,5 0,6 0))"),
  540. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  541. "lmli16"
  542. );
  543. tester::apply
  544. (from_wkt<L>("LINESTRING(0 0,20 0)"),
  545. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  546. (6 0,5 0,4 2,2 2))"),
  547. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  548. "lmli16a"
  549. );
  550. tester::apply
  551. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  552. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  553. (2 2,4 0,5 2,20 2,25 0))"),
  554. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  555. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  556. #else
  557. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(25 0))"),
  558. #endif
  559. "lmli17"
  560. );
  561. tester::apply
  562. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  563. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  564. (2 2,4 0,5 2,20 2,25 0,26 2))"),
  565. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  566. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  567. #else
  568. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(25 0))"),
  569. #endif
  570. "lmli17a"
  571. );
  572. tester::apply
  573. (from_wkt<L>("LINESTRING(0 0,30 0)"),
  574. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  575. (2 2,5 -1,15 2,18 0))"),
  576. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  577. "lmli18"
  578. );
  579. tester::apply
  580. (from_wkt<L>("LINESTRING(0 0,18 0,19 0,30 0)"),
  581. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  582. (2 2,5 -1,15 2,18 0))"),
  583. from_wkt<ML>("MULTILINESTRING((1 0,18 0,19 0))"),
  584. "lmli18a"
  585. );
  586. }
  587. #ifndef BOOST_GEOMETRY_TEST_NO_DEGENERATE
  588. BOOST_AUTO_TEST_CASE( test_intersection_l_ml_degenerate )
  589. {
  590. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  591. std::cout << std::endl << std::endl << std::endl;
  592. std::cout << "*** LINESTRING / MULTILINESTRING INTERSECTION"
  593. << " (DEGENERATE) ***"
  594. << std::endl;
  595. std::cout << std::endl;
  596. #endif
  597. typedef linestring_type L;
  598. typedef multi_linestring_type ML;
  599. typedef test_intersection_of_geometries<L, ML, ML> tester;
  600. // the following test cases concern linestrings with duplicate
  601. // points and possibly linestrings with zero length.
  602. // no unique: (3 0) appears twice
  603. tester::apply
  604. (from_wkt<L>("LINESTRING(0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0)"),
  605. from_wkt<ML>("MULTILINESTRING((-10 0,-9 0),(0 10,5 0,20 0,20 0,30 10),\
  606. (1 1,1 1,2 2,2 2),(1 10,1 10,1 0,1 0,1 -10),\
  607. (2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),\
  608. (4 0,4 10,4 10))"),
  609. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  610. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,20 0))"),
  611. #else
  612. from_wkt<ML>("MULTILINESTRING((0 0),(1 0),(2 0),(3 0),(4 0),\
  613. (5 0,18 0,19 0,20 0))"),
  614. #endif
  615. "lmli20a"
  616. );
  617. // no unique: (3 0) appears twice
  618. tester::apply
  619. (from_wkt<L>("LINESTRING(0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0)"),
  620. from_wkt<ML>("MULTILINESTRING((-10 0,-9 0),(0 10,5 0,20 0,20 0,30 10),\
  621. (1 1,1 1,2 2,2 2),(1 10,1 10,1 0,1 0,1 -10),\
  622. (2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),\
  623. (4 0,4 0,4 10,4 10))"),
  624. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  625. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,20 0))"),
  626. #else
  627. from_wkt<ML>("MULTILINESTRING((0 0),(1 0),(2 0),(3 0),(4 0),\
  628. (5 0,18 0,19 0,20 0))"),
  629. #endif
  630. "lmli20b"
  631. );
  632. // no unique: (3 0) appears twice
  633. tester::apply
  634. (from_wkt<L>("LINESTRING(0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0)"),
  635. from_wkt<ML>("MULTILINESTRING((-10 0,-9 0),(0 10,5 0,20 0,20 0,30 10),\
  636. (1 1,1 1,2 2,2 2),(1 10,1 10,1 0,1 0,1 -10),\
  637. (2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),\
  638. (30 0,30 0,30 0))"),
  639. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  640. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,20 0))"),
  641. #else
  642. from_wkt<ML>("MULTILINESTRING((0 0),(1 0),(2 0),(3 0),\
  643. (5 0,18 0,19 0,20 0),(30 0))"),
  644. #endif
  645. "lmli20c"
  646. );
  647. // no unique: (3 0) appears twice
  648. tester::apply
  649. (from_wkt<L>("LINESTRING(0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0)"),
  650. from_wkt<ML>("MULTILINESTRING((-10 0,-9 0),(0 10,5 0,20 0,20 0,30 10),\
  651. (1 1,1 1,2 2,2 2),(1 10,1 10,1 0,1 0,1 -10),\
  652. (2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),\
  653. (30 0,30 0,31 0))"),
  654. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  655. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,20 0))"),
  656. #else
  657. from_wkt<ML>("MULTILINESTRING((0 0),(1 0),(2 0),(3 0),\
  658. (5 0,18 0,19 0,20 0),(30 0))"),
  659. #endif
  660. "lmli20d"
  661. );
  662. }
  663. #endif // BOOST_GEOMETRY_TEST_NO_DEGENERATE
  664. BOOST_AUTO_TEST_CASE( test_intersection_multilinestring_linestring )
  665. {
  666. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  667. std::cout << std::endl << std::endl << std::endl;
  668. std::cout << "*** MULTILINESTRING / LINESTRING INTERSECTION ***"
  669. << std::endl;
  670. std::cout << std::endl;
  671. #endif
  672. typedef linestring_type L;
  673. typedef multi_linestring_type ML;
  674. typedef test_intersection_of_geometries<ML, L, ML> tester;
  675. // the intersection code automatically reverses the order of the
  676. // geometries according to the geometry IDs.
  677. // all calls below are actually reversed, and internally the
  678. // intersection of the linestring with the multi-linestring is
  679. // computed.
  680. // disjoint linestrings
  681. tester::apply
  682. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
  683. from_wkt<L>("LINESTRING(1 1,2 2,4 3)"),
  684. from_wkt<ML>("MULTILINESTRING()"),
  685. "mlli01"
  686. );
  687. tester::apply
  688. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
  689. from_wkt<L>("LINESTRING(1 1,2 0,4 0)"),
  690. from_wkt<ML>("MULTILINESTRING((2 0,4 0))"),
  691. "mlli02"
  692. );
  693. tester::apply
  694. (from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
  695. from_wkt<L>("LINESTRING(-1 -1,1 0,101 0,200 -1)"),
  696. from_wkt<ML>("MULTILINESTRING((1 0,101 0))"),
  697. "mlli03"
  698. );
  699. tester::apply
  700. (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
  701. from_wkt<L>("LINESTRING(0 1,1 0,19 0,20 1,19 1,18 0,2 0,\
  702. 1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1)"),
  703. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(18 0,2 0),\
  704. (3 0,17 0),(16 0,4 0))"),
  705. "mlli04"
  706. );
  707. }
  708. BOOST_AUTO_TEST_CASE( test_intersection_multilinestring_multilinestring )
  709. {
  710. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  711. std::cout << std::endl << std::endl << std::endl;
  712. std::cout << "*** MULTILINESTRING / MULTILINESTRING INTERSECTION ***"
  713. << std::endl;
  714. std::cout << std::endl;
  715. #endif
  716. typedef multi_linestring_type ML;
  717. typedef test_intersection_of_geometries<ML, ML, ML> tester;
  718. // disjoint linestrings
  719. tester::apply
  720. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
  721. from_wkt<ML>("MULTILINESTRING((1 1,2 2,4 3),(1 1,2 2,5 3))"),
  722. from_wkt<ML>("MULTILINESTRING()"),
  723. "mlmli01"
  724. );
  725. tester::apply
  726. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
  727. from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,4 0))"),
  728. from_wkt<ML>("MULTILINESTRING((2 0,4 0),(2 0,4 0))"),
  729. from_wkt<ML>("MULTILINESTRING((2 0,4 0),(3 0,4 0))"),
  730. "mlmli02"
  731. );
  732. tester::apply
  733. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
  734. from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),(1 1,3 0,5 0))"),
  735. from_wkt<ML>("MULTILINESTRING((2 0,5 0),(2 0,5 0))"),
  736. from_wkt<ML>("MULTILINESTRING((2 0,4 0),(3 0,5 0))"),
  737. "mlmli03"
  738. );
  739. tester::apply
  740. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0))"),
  741. from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0))"),
  742. from_wkt<ML>("MULTILINESTRING((2 0,4 0),(2 0,4 0))"),
  743. from_wkt<ML>("MULTILINESTRING((2 0,4 0))"),
  744. "mlmli04"
  745. );
  746. tester::apply
  747. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 1),(1 0,7 0),\
  748. (10 10,20 10,30 20))"),
  749. from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),\
  750. (10 20,15 10,25 10,30 15))"),
  751. from_wkt<ML>("MULTILINESTRING((2 0,4 0),(2 0,4 0),(15 10,20 10))"),
  752. from_wkt<ML>("MULTILINESTRING((2 0,4 0),(15 10,20 10))"),
  753. "mlmli05"
  754. );
  755. tester::apply
  756. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,20 10),(1 0,7 0),\
  757. (10 10,20 10,30 20))"),
  758. from_wkt<ML>("MULTILINESTRING((1 1,2 0,4 0),\
  759. (-1 -1,0 0,9 0,11 10,12 10,13 3,14 4,15 5),\
  760. (10 20,15 10,25 10,30 15))"),
  761. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  762. from_wkt<ML>("MULTILINESTRING((0 0,9 0),(13 3,15 5),\
  763. (1 0,7 0),(11 10,12 10),(15 10,20 10))"),
  764. from_wkt<ML>("MULTILINESTRING((2 0,4 0),(0 0,9 0),(13 3,14 4,15 5),\
  765. (11 10,12 10),(15 10,20 10))"),
  766. #else
  767. from_wkt<ML>("MULTILINESTRING((0 0,9 0),(13 3,15 5),(20 10),\
  768. (1 0,7 0),(11 10,12 10),(15 10,20 10))"),
  769. from_wkt<ML>("MULTILINESTRING((2 0,4 0),(0 0,9 0),(13 3,14 4,15 5),\
  770. (11 10,12 10),(15 10,20 10))"),
  771. #endif
  772. "mlmli06"
  773. );
  774. tester::apply
  775. (from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
  776. from_wkt<ML>("MULTILINESTRING((-1 -1,1 0,101 0,200 -1))"),
  777. from_wkt<ML>("MULTILINESTRING((1 0,101 0))"),
  778. "mlmli07"
  779. );
  780. tester::apply
  781. (from_wkt<ML>("MULTILINESTRING((-1 1,0 0,101 0))"),
  782. from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
  783. (19 -1,20 0,101 0,200 -1))"),
  784. from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
  785. from_wkt<ML>("MULTILINESTRING((0 0,50 0),(20 0,101 0))"),
  786. "mlmli07a"
  787. );
  788. tester::apply
  789. (from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
  790. from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,50 0),\
  791. (19 -1,20 0,101 0,200 -1))"),
  792. from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
  793. from_wkt<ML>("MULTILINESTRING((0 0,50 0),(20 0,101 0))"),
  794. "mlmli07b"
  795. );
  796. tester::apply
  797. (from_wkt<ML>("MULTILINESTRING((0 0,101 0))"),
  798. from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0),\
  799. (-1 -1,1 0,101 0,200 -1))"),
  800. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  801. from_wkt<ML>("MULTILINESTRING((1 0,101 0))"),
  802. #else
  803. from_wkt<ML>("MULTILINESTRING((1 0,101 0))"),
  804. from_wkt<ML>("MULTILINESTRING((2 0),(1 0,101 0))"),
  805. #endif
  806. "mlmli08"
  807. );
  808. tester::apply
  809. (from_wkt<ML>("MULTILINESTRING((0 0,1 0,2 0.5,3 0,101 0))"),
  810. from_wkt<ML>("MULTILINESTRING((0 1,1 1,2 0.5),\
  811. (-1 -1,1 0,101 0,200 -1))"),
  812. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  813. from_wkt<ML>("MULTILINESTRING((3 0,101 0))"),
  814. #else
  815. from_wkt<ML>("MULTILINESTRING((1 0),(2 0.5),(3 0,101 0))"),
  816. #endif
  817. "mlmli09"
  818. );
  819. tester::apply
  820. (from_wkt<ML>("MULTILINESTRING((0 0,1 0,1.5 0,2 0.5,3 0,101 0))"),
  821. from_wkt<ML>("MULTILINESTRING((0 1,1 1,1 0,2 0.5),\
  822. (-1 -1,1 0,101 0,200 -1))"),
  823. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  824. from_wkt<ML>("MULTILINESTRING((1 0,1.5 0),(3 0,101 0))"),
  825. #else
  826. from_wkt<ML>("MULTILINESTRING((1 0,1.5 0),(2 0.5),(3 0,101 0))"),
  827. from_wkt<ML>("MULTILINESTRING((1 0),(1 0,1.5 0),(2 0.5),(3 0,101 0))"),
  828. #endif
  829. "mlmli10"
  830. );
  831. tester::apply
  832. (from_wkt<ML>("MULTILINESTRING((0 0,1 1,100 1,101 0),\
  833. (0 0,101 0))"),
  834. from_wkt<ML>("MULTILINESTRING((1 0,1 1,2 1,3 0,4 0,5 1,6 1,\
  835. 7 0,8 0,9 1,10 1,11 0,12 0,13 1,14 1,15 0),\
  836. (-1 -1,1 0,101 0,200 -1))"),
  837. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  838. from_wkt<ML>("MULTILINESTRING((1 1,2 1),(5 1,6 1),(9 1,10 1),\
  839. (13 1,14 1),(1 0,101 0))"),
  840. from_wkt<ML>("MULTILINESTRING((1 1,2 1),(5 1,6 1),(9 1,10 1),\
  841. (13 1,14 1),(3 0,4 0),(7 0,8 0),(11 0,12 0),\
  842. (1 0,101 0))"),
  843. #else
  844. from_wkt<ML>("MULTILINESTRING((1 1,2 1),(5 1,6 1),(9 1,10 1),\
  845. (13 1,14 1),(101 0),(1 0),(1 0,101 0))"),
  846. from_wkt<ML>("MULTILINESTRING((1 0),(1 1,2 1),(5 1,6 1),(9 1,10 1),\
  847. (13 1,14 1),(3 0,4 0),(7 0,8 0),(11 0,12 0),(15 0),\
  848. (1 0,101 0))"),
  849. #endif
  850. "mlmli11"
  851. );
  852. tester::apply
  853. (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
  854. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  855. (1 1,2 0,18 0,19 1),(2 1,3 0,17 0,18 1),\
  856. (3 1,4 0,16 0,17 1))"),
  857. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  858. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(2 0,18 0),(3 0,17 0),\
  859. (4 0,16 0))"),
  860. "mlmli12"
  861. );
  862. tester::apply
  863. (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
  864. from_wkt<ML>("MULTILINESTRING((1 0,19 0,20 1),\
  865. (2 0,18 0,19 1),(3 0,17 0,18 1),\
  866. (4 0,16 0,17 1))"),
  867. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  868. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(2 0,18 0),(3 0,17 0),\
  869. (4 0,16 0))"),
  870. "mlmli13"
  871. );
  872. tester::apply
  873. (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
  874. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1,19 1,18 0,2 0,\
  875. 1 1,2 1,3 0,17 0,18 1,17 1,16 0,4 0,3 1))"),
  876. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  877. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(18 0,2 0),\
  878. (3 0,17 0),(16 0,4 0))"),
  879. "mlmli14"
  880. );
  881. tester::apply
  882. (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
  883. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  884. (2 2,4 2,6 0))"),
  885. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  886. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  887. #else
  888. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  889. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(6 0))"),
  890. #endif
  891. "mlmli15"
  892. );
  893. tester::apply
  894. (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
  895. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  896. (6 0,4 2,2 2))"),
  897. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  898. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  899. #else
  900. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  901. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(6 0))"),
  902. #endif
  903. "mlmli15a"
  904. );
  905. tester::apply
  906. (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
  907. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  908. (2 2,4 2,5 0,6 0))"),
  909. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  910. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(5 0,6 0))"),
  911. "mlmli16"
  912. );
  913. tester::apply
  914. (from_wkt<ML>("MULTILINESTRING((0 0,20 0))"),
  915. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  916. (6 0,5 0,4 2,2 2))"),
  917. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  918. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(6 0,5 0))"),
  919. "mlmli16a"
  920. );
  921. tester::apply
  922. (from_wkt<ML>("MULTILINESTRING((0 0,30 0))"),
  923. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  924. (2 2,4 0,5 2,20 2,25 0))"),
  925. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  926. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  927. #else
  928. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(25 0))"),
  929. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(4 0),(25 0))"),
  930. #endif
  931. "mlmli17"
  932. );
  933. tester::apply
  934. (from_wkt<ML>("MULTILINESTRING((0 0,30 0))"),
  935. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  936. (2 2,4 0,5 2,20 2,25 0,26 2))"),
  937. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  938. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  939. #else
  940. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(25 0))"),
  941. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(4 0),(25 0))"),
  942. #endif
  943. "mlmli17a"
  944. );
  945. tester::apply
  946. (from_wkt<ML>("MULTILINESTRING((0 0,30 0))"),
  947. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  948. (2 2,5 -1,15 2,18 0))"),
  949. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  950. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  951. #else
  952. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  953. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(4 0),\
  954. (8.3333333333333333333 0),(18 0))"),
  955. #endif
  956. "mlmli18"
  957. );
  958. tester::apply
  959. (from_wkt<ML>("MULTILINESTRING((0 0,18 0,19 0,30 0))"),
  960. from_wkt<ML>("MULTILINESTRING((0 1,1 0,19 0,20 1),\
  961. (2 2,5 -1,15 2,18 0))"),
  962. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  963. from_wkt<ML>("MULTILINESTRING((1 0,18 0,19 0))"),
  964. from_wkt<ML>("MULTILINESTRING((1 0,19 0))"),
  965. #else
  966. from_wkt<ML>("MULTILINESTRING((1 0,18 0,19 0))"),
  967. from_wkt<ML>("MULTILINESTRING((1 0,19 0),(4 0),\
  968. (8.3333333333333333333 0),(18 0))"),
  969. #endif
  970. "mlmli18a"
  971. );
  972. }
  973. #ifndef BOOST_GEOMETRY_TEST_NO_DEGENERATE
  974. BOOST_AUTO_TEST_CASE( test_intersection_ml_ml_degenerate )
  975. {
  976. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  977. std::cout << std::endl << std::endl << std::endl;
  978. std::cout << "*** MULTILINESTRING / MULTILINESTRING INTERSECTION"
  979. << " (DEGENERATE) ***"
  980. << std::endl;
  981. std::cout << std::endl;
  982. #endif
  983. typedef multi_linestring_type ML;
  984. typedef test_intersection_of_geometries<ML, ML, ML> tester;
  985. // the following test cases concern linestrings with duplicate
  986. // points and possibly linestrings with zero length.
  987. // no unique: (3 0) appears twice
  988. tester::apply
  989. (from_wkt<ML>("MULTILINESTRING((5 5,5 5),(0 0,18 0,18 0,\
  990. 19 0,19 0,19 0,30 0),(2 0,2 0),(4 10,4 10))"),
  991. from_wkt<ML>("MULTILINESTRING((-10 0,-9 0),(0 10,5 0,20 0,20 0,30 10),\
  992. (1 1,2 2),(1 10,1 10,1 0,1 0,1 -10),\
  993. (2 0,2 0),(3 0,3 0,3 0),(0 0,0 10),\
  994. (4 0,4 10),(5 5,5 5))"),
  995. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  996. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,20 0))"),
  997. from_wkt<ML>("MULTILINESTRING((5 0,20 0))"),
  998. #else
  999. from_wkt<ML>("MULTILINESTRING((5 5),(0 0),(1 0),(2 0),(3 0),\
  1000. (4 0),(5 0,18 0,19 0,20 0),(2 0),(4 10))"),
  1001. from_wkt<ML>("MULTILINESTRING((5 0,20 0),(1 0),(2 0),(2 0),(3 0),\
  1002. (0 0),(4 0),(4 10),(5 5))"),
  1003. #endif
  1004. "mlmli20a"
  1005. );
  1006. // no unique: (3 0) appears three times
  1007. tester::apply
  1008. (from_wkt<ML>("MULTILINESTRING((5 5,5 5),(0 0,0 0,18 0,18 0,\
  1009. 19 0,19 0,19 0,30 0,30 0),(2 0,2 0),(4 10,4 10))"),
  1010. from_wkt<ML>("MULTILINESTRING((-10 0,-9 0),(0 10,5 0,20 0,20 0,30 10),\
  1011. (1 1,1 1,2 2,2 2),(1 10,1 10,1 0,1 0,1 -10),\
  1012. (2 0,2 0),(3 0,3 0,3 0,3 0),(0 0,0 0,0 10,0 10),\
  1013. (4 0,4 10,4 10),(5 5,5 5))"),
  1014. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1015. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,20 0))"),
  1016. from_wkt<ML>("MULTILINESTRING((5 0,20 0))"),
  1017. #else
  1018. from_wkt<ML>("MULTILINESTRING((5 5),(0 0),(1 0),(2 0),(3 0),(4 0),\
  1019. (5 0,18 0,19 0,20 0),(2 0),(4 10))"),
  1020. from_wkt<ML>("MULTILINESTRING((5 0,20 0),(1 0),(2 0),(2 0),\
  1021. (3 0),(0 0),(4 0),(4 10),(5 5))"),
  1022. #endif
  1023. "mlmli20aa"
  1024. );
  1025. // no unique: (3 0) appears twice
  1026. tester::apply
  1027. (from_wkt<ML>("MULTILINESTRING((5 5,5 5),(0 0,0 0,18 0,18 0,\
  1028. 19 0,19 0,19 0,30 0,30 0))"),
  1029. from_wkt<ML>("MULTILINESTRING((-10 0,-9 0),(0 10,5 0,20 0,20 0,30 10),\
  1030. (1 1,1 1,2 2,2 2),(1 10,1 10,1 0,1 0,1 -10),\
  1031. (2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),\
  1032. (4 0,4 0,4 10,4 10),(0 5,15 5))"),
  1033. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1034. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,20 0))"),
  1035. from_wkt<ML>("MULTILINESTRING((5 0,20 0))"),
  1036. #else
  1037. from_wkt<ML>("MULTILINESTRING((5 5),(0 0),(1 0),(2 0),(3 0),(4 0),\
  1038. (5 0,18 0,19 0,20 0))"),
  1039. from_wkt<ML>("MULTILINESTRING((5 0,20 0),(1 0),(2 0),(3 0),\
  1040. (0 0),(4 0),(5 5))"),
  1041. #endif
  1042. "mlmli20b"
  1043. );
  1044. // no unique: (3 0) and (30 0) appear twice
  1045. tester::apply
  1046. (from_wkt<ML>("MULTILINESTRING((0 0,0 0,18 0,18 0,\
  1047. 19 0,19 0,19 0,30 0,30 0))"),
  1048. from_wkt<ML>("MULTILINESTRING((-10 0,-9 0),(0 10,5 0,20 0,20 0,30 10),\
  1049. (1 1,1 1,2 2,2 2),(1 10,1 10,1 0,1 0,1 -10),\
  1050. (2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),\
  1051. (30 0,30 0,30 0))"),
  1052. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1053. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,20 0))"),
  1054. from_wkt<ML>("MULTILINESTRING((5 0,20 0))"),
  1055. #else
  1056. from_wkt<ML>("MULTILINESTRING((0 0),(1 0),(2 0),(3 0),\
  1057. (5 0,18 0,19 0,20 0),(30 0))"),
  1058. from_wkt<ML>("MULTILINESTRING((5 0,20 0),(1 0),(2 0),(3 0),\
  1059. (0 0),(30 0))"),
  1060. #endif
  1061. "mlmli20c"
  1062. );
  1063. // no unique: (3 0) appears twice
  1064. tester::apply
  1065. (from_wkt<ML>("MULTILINESTRING((0 0,0 0,18 0,18 0,\
  1066. 19 0,19 0,19 0,30 0,30 0))"),
  1067. from_wkt<ML>("MULTILINESTRING((-10 0,-9 0),(0 10,5 0,20 0,20 0,30 10),\
  1068. (1 1,1 1,2 2,2 2),(1 10,1 10,1 0,1 0,1 -10),\
  1069. (2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),\
  1070. (30 0,30 0,31 0))"),
  1071. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1072. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,20 0))"),
  1073. from_wkt<ML>("MULTILINESTRING((5 0,20 0))"),
  1074. #else
  1075. from_wkt<ML>("MULTILINESTRING((0 0),(1 0),(2 0),(3 0),\
  1076. (5 0,18 0,19 0,20 0),(30 0))"),
  1077. from_wkt<ML>("MULTILINESTRING((5 0,20 0),(1 0),(2 0),(3 0),\
  1078. (0 0),(30 0))"),
  1079. #endif
  1080. "mlmli20d"
  1081. );
  1082. tester::apply
  1083. (from_wkt<ML>("MULTILINESTRING((0 0,0 0,18 0,18 0,\
  1084. 19 0,19 0,19 0,30 0,30 0))"),
  1085. from_wkt<ML>("MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),\
  1086. (1 10,1 10,1 0,1 0,1 -10),\
  1087. (2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),\
  1088. (30 0,30 0,31 0,31 0))"),
  1089. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1090. from_wkt<ML>("MULTILINESTRING((5 0,18 0,19 0,30 0))"),
  1091. from_wkt<ML>("MULTILINESTRING((5 0,20 0,30 0))"),
  1092. #else
  1093. from_wkt<ML>("MULTILINESTRING((0 0),(1 0),(2 0),(3 0),\
  1094. (5 0,18 0,19 0,30 0),(30 0))"),
  1095. from_wkt<ML>("MULTILINESTRING((5 0,20 0,30 0),(1 0),(2 0),(3 0),\
  1096. (0 0),(30 0))"),
  1097. #endif
  1098. "mlmli20e"
  1099. );
  1100. tester::apply
  1101. (from_wkt<ML>("MULTILINESTRING((1 5, -4.3 -.1), (0 6, 8.6 6, 189.7654 5, 1 3, 6 3, 3 5, 6 2.232432, 0 4), (-6 5, 1 2.232432), (3 -1032.34324, 9 0, 189.7654 1, -1.4 3, 3 189.7654, +.3 10.0002, 1 5, 6 3, 5 1, 9 1, 10.0002 -1032.34324, -0.7654 0, 5 3, 3 4), (2.232432 2.232432, 8.6 +.4, 0.0 2.232432, 4 0, -8.8 10.0002), (1 0, 6 6, 7 2, -0 8.4), (-0.7654 3, +.6 8, 4 -1032.34324, 1 6, 0 4), (0 7, 2 1, 8 -7, 7 -.7, -1032.34324 9), (5 0, 10.0002 4, 8 7, 3 3, -8.1 5))"),
  1102. from_wkt<ML>("MULTILINESTRING((5 10.0002, 2 7, -0.7654 0, 5 3), (0 -0.7654, 4 10.0002, 4 +.1, -.8 3, -.1 8, 10.0002 2, +.9 -1032.34324))"),
  1103. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1104. from_wkt<ML>("MULTILINESTRING((-0.7654 8.88178e-16,-0.7654 0,5 3))"),
  1105. #else
  1106. from_wkt<ML>("MULTILINESTRING((-0.756651 3.30964),(1.60494 6),\
  1107. (2.51371 6),(3.26673 6),(4 6),(8.18862 3.07616),\
  1108. (4 3.03179),(1.40063 3.00424),(1.39905 3),\
  1109. (4 3),(5 3),(4 4.33333),(4 4.07748),\
  1110. (4.41962 2.698),(4 2.82162),(1.59592 3.52985),\
  1111. (0.729883 3.78498),(-0.532243 2.83823),\
  1112. (0.235887 2.53454),(7.08745 -329.0674155),\
  1113. (9.98265 0.00543606),(8.49103 2.89652),\
  1114. (4.87386 2.93436),(4 2.9435),(1.38821 2.97083)\
  1115. (0.412281 2.98104),(-0.789427 2.99361),\
  1116. (0.641699 7.5594),(1.18124 4.9275),\
  1117. (1.99437 4.60225),(4 3.8),(9.09826 -100.515944),\
  1118. (5.06428 -559.024344),\
  1119. (4 3.5),(3.06464 1.99294),(4 1.72377),\
  1120. (4 1.38014),(2.50083 1.69957),(1.03214 2.01251),\
  1121. (0.72677 2.07758),(0.10749 2.20953),\
  1122. (0.0954852 2.17914),(0.92255 1.71755),\
  1123. (1.70073 1.28324),(3.43534 0.441146),\
  1124. (2.09493 1.48836),(1.12031 2.2498),\
  1125. (0.358522 2.84496),(-0.705343 3.67612),\
  1126. (2.06005 1.27206),(2.3516 1.62191),(4 3.6),\
  1127. (5.09496 4.91395),(6.47672 4.09311),(4 4.74286),\
  1128. (2.54193 6.07595),(1.87562 6.68515),\
  1129. (1.43457 7.08839),(0.502294 7.64221),\
  1130. (0.601362 7.58336),(0.614728 3.49349),\
  1131. (0.619143 2.1426),(0.623165 0.911787),\
  1132. (0.623783 0.722855),(3.16036 -775.427199),\
  1133. (3.23365 -767.0972558),(1.01466 0.926246),\
  1134. (1.01183 1.90535),(1.01168 1.95744),\
  1135. (1.00439 4.47984),(0.91526 4.25422),\
  1136. (1.36441 2.90677),(1.8713 1.38609),\
  1137. (1.87531 1.37408),(0.0484053 -0.635122),\
  1138. (8.5655 2.85228),(5.26567 4.81254),(4 3.8),\
  1139. (1.4995 3.27036),(0.591231 3.43401),\
  1140. (-0.706503 3.66784),\
  1141. (-0.7654 8.88178e-16,-0.7654 0,5 3))"),
  1142. from_wkt<ML>("MULTILINESTRING((1.87562 6.68515),(1.60494 6),\
  1143. (1.18124 4.9275),(1.00439 4.47984),(0.91526 4.25422),\
  1144. (0.729883 3.78498),(0.614728 3.49349),\
  1145. (0.591231 3.43401),(0.412281 2.98104),\
  1146. (0.358522 2.84496),(0.235887 2.53454),\
  1147. (0.10749 2.20953),(0.0954852 2.17914),\
  1148. (5 3),(0.0484053 -0.635122),(0.535994 0.677175),\
  1149. (0.623165 0.911787),(0.92255 1.71755),\
  1150. (1.01168 1.95744),(1.03214 2.01251),\
  1151. (1.12031 2.2498),(1.36441 2.90677),\
  1152. (1.38821 2.97083),(1.39905 3),(1.40063 3.00424),\
  1153. (1.4995 3.27036),(1.59592 3.52985),\
  1154. (1.99437 4.60225),(2.51371 6),(2.54193 6.07595),\
  1155. (4 6),(4 4.74286),(4 4.33333),(4 4.07748),(4 3.8),\
  1156. (4 3.8),(4 3.6),(4 3.5),(4 3.03179),(4 3),\
  1157. (4 2.9435),(4 2.82162),(4 2.47965),(4 1.72377),\
  1158. (4 1.38014),(3.43534 0.441146),(2.06005 1.27206),\
  1159. (1.88383 1.37852),(1.8713 1.38609),\
  1160. (1.01183 1.90535),(0.72677 2.07758),\
  1161. (0.619143 2.1426),(-0.532243 2.83823),\
  1162. (-0.789427 2.99361),(-0.756651 3.30964),\
  1163. (-0.706503 3.66784),(-0.705343 3.67612),\
  1164. (0.502294 7.64221),(0.601362 7.58336),\
  1165. (0.641699 7.5594),(1.43457 7.08839),\
  1166. (3.26673 6),(5.09496 4.91395),(5.26567 4.81254),\
  1167. (6.47672 4.09311),(8.18862 3.07616),\
  1168. (8.49103 2.89652),(8.5655 2.85228),\
  1169. (9.98265 0.00543606),(9.09826 -100.515944),\
  1170. (7.08745 -329.0674155),(5.06428 -559.024344),\
  1171. (3.23365 -767.0972558),(3.16036 -775.427199),\
  1172. (-0.7654 8.88178e-16,-0.7654 0,5 3))"),
  1173. #endif
  1174. "mlmli21",
  1175. 1e-4
  1176. );
  1177. }
  1178. #endif // BOOST_GEOMETRY_TEST_NO_DEGENERATE
  1179. BOOST_AUTO_TEST_CASE( test_intersection_ml_ml_spikes )
  1180. {
  1181. #ifdef BOOST_GEOMETRY_TEST_DEBUG
  1182. std::cout << std::endl << std::endl << std::endl;
  1183. std::cout << "*** MULTILINESTRING / MULTILINESTRING INTERSECTION"
  1184. << " (WITH SPIKES) ***"
  1185. << std::endl;
  1186. std::cout << std::endl;
  1187. #endif
  1188. typedef multi_linestring_type ML;
  1189. typedef test_intersection_of_geometries<ML, ML, ML> tester;
  1190. // the following test cases concern linestrings with spikes
  1191. tester::apply
  1192. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1193. from_wkt<ML>("MULTILINESTRING((1 0,9 0,5 0))"),
  1194. from_wkt<ML>("MULTILINESTRING((1 0,9 0))"),
  1195. from_wkt<ML>("MULTILINESTRING((1 0,9 0,5 0))"),
  1196. "mlmli-spikes-01"
  1197. );
  1198. tester::apply
  1199. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1200. from_wkt<ML>("MULTILINESTRING((9 0,1 0,5 0))"),
  1201. from_wkt<ML>("MULTILINESTRING((1 0,9 0))"),
  1202. from_wkt<ML>("MULTILINESTRING((9 0,1 0,5 0))"),
  1203. "mlmli-spikes-02"
  1204. );
  1205. tester::apply
  1206. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1207. from_wkt<ML>("MULTILINESTRING((1 0,9 0,2 0,8 0,3 0,7 0,4 0,5 0))"),
  1208. from_wkt<ML>("MULTILINESTRING((1 0,9 0))"),
  1209. from_wkt<ML>("MULTILINESTRING((1 0,9 0,2 0,8 0,3 0,7 0,4 0,5 0))"),
  1210. "mlmli-spikes-03"
  1211. );
  1212. tester::apply
  1213. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1214. from_wkt<ML>("MULTILINESTRING((1 0,3 0,2 0,4 0,3 0,5 0,4 0,6 0,\
  1215. 5 0,7 0,6 0,8 0,7 0,9 0))"),
  1216. from_wkt<ML>("MULTILINESTRING((1 0,9 0))"),
  1217. from_wkt<ML>("MULTILINESTRING((1 0,3 0,2 0,4 0,3 0,5 0,4 0,6 0,\
  1218. 5 0,7 0,6 0,8 0,7 0,9 0))"),
  1219. "mlmli-spikes-04"
  1220. );
  1221. tester::apply
  1222. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1223. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(7 0,8 0,7 0),\
  1224. (9 1,9 0,9 2))"),
  1225. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1226. from_wkt<ML>("MULTILINESTRING((1 0,6 0),(7 0,8 0))"),
  1227. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(7 0,8 0,7 0))"),
  1228. #else
  1229. from_wkt<ML>("MULTILINESTRING((1 0,6 0),(7 0,8 0),(9 0))"),
  1230. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(7 0,8 0,7 0),(9 0))"),
  1231. #endif
  1232. "mlmli-spikes-05"
  1233. );
  1234. tester::apply
  1235. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1236. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(7 0,8 0,7 0),\
  1237. (9 0,9 2,9 1))"),
  1238. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1239. from_wkt<ML>("MULTILINESTRING((1 0,6 0),(7 0,8 0))"),
  1240. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(7 0,8 0,7 0))"),
  1241. #else
  1242. from_wkt<ML>("MULTILINESTRING((1 0,6 0),(7 0,8 0),(9 0))"),
  1243. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(7 0,8 0,7 0),(9 0))"),
  1244. #endif
  1245. "mlmli-spikes-05a"
  1246. );
  1247. tester::apply
  1248. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1249. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(9 0,6 0,8 0),\
  1250. (11 0,8 0,12 0))"),
  1251. from_wkt<ML>("MULTILINESTRING((1 0,6 0),(6 0,10 0))"),
  1252. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(9 0,6 0,8 0),\
  1253. (10 0,8 0,10 0))"),
  1254. "mlmli-spikes-06"
  1255. );
  1256. tester::apply
  1257. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1258. from_wkt<ML>("MULTILINESTRING((-1 0,0 0,-2 0),(11 0,10 0,12 0))"),
  1259. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1260. from_wkt<ML>("MULTILINESTRING()"),
  1261. #else
  1262. from_wkt<ML>("MULTILINESTRING((0 0),(10 0))"),
  1263. #endif
  1264. "mlmli-spikes-07"
  1265. );
  1266. tester::apply
  1267. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1268. from_wkt<ML>("MULTILINESTRING((-1 -1,0 0,-2 -2),(11 1,10 0,12 2))"),
  1269. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1270. from_wkt<ML>("MULTILINESTRING()"),
  1271. #else
  1272. from_wkt<ML>("MULTILINESTRING((0 0),(10 0))"),
  1273. #endif
  1274. "mlmli-spikes-07a"
  1275. );
  1276. tester::apply
  1277. (from_wkt<ML>("MULTILINESTRING((0 0,10 0))"),
  1278. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(11 0,10 0,12 0),\
  1279. (7 5,7 0,8 0,6.5 0,8.5 0,8.5 5))"),
  1280. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1281. from_wkt<ML>("MULTILINESTRING((1 0,6 0),(6.5 0,8.5 0))"),
  1282. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(7 0,8 0,6.5 0,8.5 0))"),
  1283. #else
  1284. from_wkt<ML>("MULTILINESTRING((1 0,6 0),(6.5 0,8.5 0),(10 0))"),
  1285. from_wkt<ML>("MULTILINESTRING((1 0,6 0,5 0),(7 0,8 0,6.5 0,8.5 0),(10 0))"),
  1286. #endif
  1287. "mlmli-spikes-08"
  1288. );
  1289. // now the first geometry has a spike
  1290. tester::apply
  1291. (from_wkt<ML>("MULTILINESTRING((0 0,7 0,4 0,10 0))"),
  1292. from_wkt<ML>("MULTILINESTRING((1 0,8 0))"),
  1293. from_wkt<ML>("MULTILINESTRING((1 0,7 0,4 0,8 0))"),
  1294. from_wkt<ML>("MULTILINESTRING((1 0,8 0))"),
  1295. "mlmli-spikes-09"
  1296. );
  1297. tester::apply
  1298. (from_wkt<ML>("MULTILINESTRING((0 0,7 0,4 0,10 0))"),
  1299. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(9 0,10 0))"),
  1300. from_wkt<ML>("MULTILINESTRING((0 0,1 0),(9 0,10 0))"),
  1301. "mlmli-spikes-09a"
  1302. );
  1303. tester::apply
  1304. (from_wkt<ML>("MULTILINESTRING((0 0,7 0,4 0,10 0))"),
  1305. from_wkt<ML>("MULTILINESTRING((0 0,5 0),(9 0,10 0))"),
  1306. from_wkt<ML>("MULTILINESTRING((0 0,5 0),(5 0,4 0,5 0),(9 0,10 0))"),
  1307. from_wkt<ML>("MULTILINESTRING((0 0,5 0),(9 0,10 0))"),
  1308. "mlmli-spikes-09b"
  1309. );
  1310. tester::apply
  1311. (from_wkt<ML>("MULTILINESTRING((0 0,7 0,4 0,10 0))"),
  1312. from_wkt<ML>("MULTILINESTRING((0 0,5 0),(6 0,10 0))"),
  1313. from_wkt<ML>("MULTILINESTRING((0 0,5 0),(6 0,7 0,6 0),(5 0,4 0,5 0),\
  1314. (6 0,10 0))"),
  1315. from_wkt<ML>("MULTILINESTRING((0 0,5 0),(6 0,10 0))"),
  1316. "mlmli-spikes-09c"
  1317. );
  1318. tester::apply
  1319. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,5 0))"),
  1320. from_wkt<ML>("MULTILINESTRING((1 0,8 0))"),
  1321. from_wkt<ML>("MULTILINESTRING((1 0,8 0),(8 0,5 0))"),
  1322. from_wkt<ML>("MULTILINESTRING((1 0,8 0))"),
  1323. "mlmli-spikes-10"
  1324. );
  1325. tester::apply
  1326. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,5 0))"),
  1327. from_wkt<ML>("MULTILINESTRING((1 0,8 0,4 0),(2 0,9 0,5 0))"),
  1328. from_wkt<ML>("MULTILINESTRING((1 0,9 0),(9 0,5 0))"),
  1329. from_wkt<ML>("MULTILINESTRING((1 0,8 0,4 0),(2 0,9 0,5 0))"),
  1330. "mlmli-spikes-11"
  1331. );
  1332. tester::apply
  1333. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,5 0))"),
  1334. from_wkt<ML>("MULTILINESTRING((11 1,10 0,12 2))"),
  1335. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1336. from_wkt<ML>("MULTILINESTRING()"),
  1337. #else
  1338. from_wkt<ML>("MULTILINESTRING((10 0))"),
  1339. #endif
  1340. "mlmli-spikes-12"
  1341. );
  1342. tester::apply
  1343. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,5 0))"),
  1344. from_wkt<ML>("MULTILINESTRING((11 -1,10 0,12 -2))"),
  1345. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1346. from_wkt<ML>("MULTILINESTRING()"),
  1347. #else
  1348. from_wkt<ML>("MULTILINESTRING((10 0))"),
  1349. #endif
  1350. "mlmli-spikes-12a"
  1351. );
  1352. tester::apply
  1353. (from_wkt<ML>("MULTILINESTRING((0 0,10 0,5 0))"),
  1354. from_wkt<ML>("MULTILINESTRING((11 0,10 0,12 0))"),
  1355. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1356. from_wkt<ML>("MULTILINESTRING()"),
  1357. #else
  1358. from_wkt<ML>("MULTILINESTRING((10 0))"),
  1359. #endif
  1360. "mlmli-spikes-13"
  1361. );
  1362. // the following three tests have been discussed with Adam
  1363. tester::apply
  1364. (from_wkt<ML>("MULTILINESTRING((1 0,1 1,2 1))"),
  1365. from_wkt<ML>("MULTILINESTRING((1 2,1 1,1 2))"),
  1366. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1367. from_wkt<ML>("MULTILINESTRING()"),
  1368. #else
  1369. from_wkt<ML>("MULTILINESTRING((1 1))"),
  1370. #endif
  1371. "mlmli-spikes-14"
  1372. );
  1373. tester::apply
  1374. (from_wkt<ML>("MULTILINESTRING((0 0,1 0,0 0))"),
  1375. from_wkt<ML>("MULTILINESTRING((2 0,1 0,2 0))"),
  1376. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1377. from_wkt<ML>("MULTILINESTRING()"),
  1378. #else
  1379. from_wkt<ML>("MULTILINESTRING((1 0))"),
  1380. #endif
  1381. "mlmli-spikes-15"
  1382. );
  1383. tester::apply
  1384. (from_wkt<ML>("MULTILINESTRING((1 0,1 1,2 1))"),
  1385. from_wkt<ML>("MULTILINESTRING((2 0,1 1,2 0))"),
  1386. #ifdef BOOST_GEOMETRY_INTERSECTION_DO_NOT_INCLUDE_ISOLATED_POINTS
  1387. from_wkt<ML>("MULTILINESTRING()"),
  1388. #else
  1389. from_wkt<ML>("MULTILINESTRING((1 1))"),
  1390. #endif
  1391. "mlmli-spikes-16"
  1392. );
  1393. tester::apply
  1394. (from_wkt<ML>("MULTILINESTRING((1 0,1 1,2 1))"),
  1395. from_wkt<ML>("MULTILINESTRING((2 1,1 1,2 1))"),
  1396. from_wkt<ML>("MULTILINESTRING((1 1,2 1))"),
  1397. from_wkt<ML>("MULTILINESTRING((2 1,1 1,2 1))"),
  1398. "mlmli-spikes-17"
  1399. );
  1400. // test cases sent by Adam on the mailing list (equal slikes)
  1401. tester::apply
  1402. (from_wkt<ML>("MULTILINESTRING((0 0,1 1,0 0))"),
  1403. from_wkt<ML>("MULTILINESTRING((0 0,1 1,0 0))"),
  1404. from_wkt<ML>("MULTILINESTRING((0 0,1 1,0 0))"),
  1405. "mlmli-spikes-18"
  1406. );
  1407. tester::apply
  1408. (from_wkt<ML>("MULTILINESTRING((0 0,1 1,0 0))"),
  1409. from_wkt<ML>("MULTILINESTRING((1 1,0 0,1 1))"),
  1410. from_wkt<ML>("MULTILINESTRING((0 0,1 1,0 0))"),
  1411. from_wkt<ML>("MULTILINESTRING((1 1,0 0,1 1))"),
  1412. "mlmli-spikes-19"
  1413. );
  1414. }