traverse_multi.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Unit Test
  3. // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
  4. // Use, modification and distribution is subject to the Boost Software License,
  5. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //#define BOOST_GEOMETRY_DEBUG_ENRICH
  8. //#define BOOST_GEOMETRY_DEBUG_RELATIVE_ORDER
  9. // Include the single-geometry version
  10. #define BOOST_GEOMETRY_TEST_MULTI
  11. #include <algorithms/overlay/traverse.cpp>
  12. #include <boost/geometry/core/closure.hpp>
  13. #include <boost/geometry/core/geometry_id.hpp>
  14. #include <boost/geometry/core/point_order.hpp>
  15. #include <boost/geometry/core/ring_type.hpp>
  16. #include <boost/geometry/algorithms/envelope.hpp>
  17. #include <boost/geometry/algorithms/num_points.hpp>
  18. #include <boost/geometry/algorithms/detail/overlay/copy_segments.hpp>
  19. #include <boost/geometry/algorithms/detail/overlay/copy_segment_point.hpp>
  20. #include <boost/geometry/algorithms/detail/sections/range_by_section.hpp>
  21. #include <boost/geometry/algorithms/detail/sections/sectionalize.hpp>
  22. #include <boost/geometry/views/detail/range_type.hpp>
  23. #include "multi_overlay_cases.hpp"
  24. template <typename MultiPolygon, bool Reverse>
  25. void test_geometries()
  26. {
  27. typedef test_traverse
  28. <
  29. MultiPolygon, MultiPolygon,
  30. bg::overlay_intersection, Reverse, Reverse
  31. > test_traverse_intersection;
  32. typedef test_traverse
  33. <
  34. MultiPolygon, MultiPolygon,
  35. bg::overlay_union, Reverse, Reverse
  36. > test_traverse_union;
  37. // Intersections:
  38. test_traverse_intersection::apply
  39. (
  40. "simplex", 2, 6.42,
  41. case_multi_simplex[0], case_multi_simplex[1]
  42. );
  43. test_traverse_intersection::apply
  44. (
  45. "case_58_multi_b4", 1, 12.666666667,
  46. case_58_multi[4], case_58_multi[2]
  47. );
  48. #ifdef BOOST_GEOMETRY_TEST_FAILURES
  49. test_traverse_intersection::apply
  50. (
  51. "case_58_multi_b5", 1, 1,
  52. case_58_multi[5], case_58_multi[2]
  53. );
  54. #endif
  55. test_traverse_intersection::apply
  56. (
  57. "case_58_multi_b6", 1, 13.25,
  58. case_58_multi[6], case_58_multi[2]
  59. );
  60. test_traverse_intersection::apply
  61. (
  62. "case_65_multi", 1, 1,
  63. case_65_multi[0], case_65_multi[1]
  64. );
  65. test_traverse_intersection::apply
  66. (
  67. "case_66_multi", 1, 1,
  68. case_66_multi[0], case_66_multi[1]
  69. );
  70. test_traverse_intersection::apply
  71. (
  72. "case_67_multi", 1, 1,
  73. case_67_multi[0], case_67_multi[1]
  74. );
  75. test_traverse_intersection::apply
  76. (
  77. "case_69_multi", 1, 1,
  78. case_69_multi[0], case_69_multi[1]
  79. );
  80. test_traverse_intersection::apply
  81. (
  82. "case_71_multi", 2, 2,
  83. case_71_multi[0], case_71_multi[1]
  84. );
  85. // #72, note that it intersects into 2 shapes,
  86. // the third one is done by assemble (see intersection #72)
  87. test_traverse_intersection::apply
  88. (
  89. "case_72_multi", 2, 1.35,
  90. case_72_multi[0], case_72_multi[1]
  91. );
  92. test_traverse_intersection::apply
  93. (
  94. "case_73_multi", 2, 2,
  95. case_73_multi[0], case_73_multi[1]
  96. );
  97. test_traverse_intersection::apply
  98. (
  99. "case_74_multi", 2, 3,
  100. case_74_multi[0], case_74_multi[1]
  101. );
  102. test_traverse_intersection::apply
  103. (
  104. "case_75_multi", 1, 1,
  105. case_75_multi[0], case_75_multi[1]
  106. );
  107. test_traverse_intersection::apply
  108. (
  109. "case_77_multi", 5, 9,
  110. case_77_multi[0], case_77_multi[1]
  111. );
  112. test_traverse_intersection::apply
  113. (
  114. "case_78_multi", 2, 22, // Went from 3 to 2 by get_turns / partition
  115. case_78_multi[0], case_78_multi[1]
  116. );
  117. test_traverse_intersection::apply
  118. (
  119. "case_80_multi", 1, 0.5,
  120. case_80_multi[0], case_80_multi[1]
  121. );
  122. test_traverse_intersection::apply
  123. (
  124. "case_81_multi", 1, 0.25,
  125. case_81_multi[0], case_81_multi[1]
  126. );
  127. test_traverse_intersection::apply
  128. (
  129. "case_83_multi", 3, 1.25,
  130. case_83_multi[0], case_83_multi[1]
  131. );
  132. test_traverse_intersection::apply
  133. (
  134. "case_91_multi", 2, 1.0,
  135. case_91_multi[0], case_91_multi[1]
  136. );
  137. test_traverse_intersection::apply
  138. (
  139. "case_92_multi", 3, 1.5,
  140. case_92_multi[0], case_92_multi[1]
  141. );
  142. test_traverse_intersection::apply
  143. (
  144. "case_93_multi", 2, 1.25,
  145. case_93_multi[0], case_93_multi[1]
  146. );
  147. test_traverse_intersection::apply
  148. (
  149. "case_96_multi", 1, 0.5,
  150. case_96_multi[0], case_96_multi[1]
  151. );
  152. test_traverse_intersection::apply
  153. (
  154. "case_98_multi", 4, 3.0,
  155. case_98_multi[0], case_98_multi[1]
  156. );
  157. test_traverse_intersection::apply
  158. (
  159. "case_99_multi", 3, 1.75,
  160. case_99_multi[0], case_99_multi[1]
  161. );
  162. test_traverse_intersection::apply
  163. (
  164. "case_100_multi", 2, 1.5,
  165. case_100_multi[0], case_100_multi[1]
  166. );
  167. test_traverse_intersection::apply
  168. (
  169. "case_108_multi", 7, 7.5,
  170. case_108_multi[0], case_108_multi[1]
  171. );
  172. test_traverse_intersection::apply
  173. (
  174. "case_recursive_boxes_2", 1, 91,
  175. case_recursive_boxes_2[0], case_recursive_boxes_2[1]
  176. );
  177. test_traverse_intersection::apply
  178. (
  179. "case_107_multi", 2, 1.5,
  180. case_107_multi[0], case_107_multi[1]
  181. );
  182. test_traverse_intersection::apply
  183. (
  184. "case_recursive_boxes_3", 19, 12.5,
  185. case_recursive_boxes_3[0], case_recursive_boxes_3[1]
  186. );
  187. // Unions
  188. test_traverse_union::apply
  189. (
  190. "simplex", 1, 14.58,
  191. case_multi_simplex[0], case_multi_simplex[1]
  192. );
  193. test_traverse_union::apply
  194. (
  195. "case_61_multi", 1, 4,
  196. case_61_multi[0], case_61_multi[1]
  197. );
  198. test_traverse_union::apply
  199. (
  200. "case_62_multi", 1, 1 /*UU 2, 2 */,
  201. case_62_multi[0], case_62_multi[1]
  202. );
  203. test_traverse_union::apply
  204. (
  205. "case_63_multi", 1, 1 /*UU 2, 2 */,
  206. case_63_multi[0], case_63_multi[1]
  207. );
  208. test_traverse_union::apply
  209. (
  210. "case_64_multi", 1, 3,
  211. case_64_multi[0], case_64_multi[1]
  212. );
  213. test_traverse_union::apply
  214. (
  215. "case_66_multi", 1, 4 /*UU 3, 7 */,
  216. case_66_multi[0], case_66_multi[1]
  217. );
  218. test_traverse_union::apply
  219. (
  220. "case_68_multi", 1, 4 /*UU 2, 5 */,
  221. case_68_multi[0], case_68_multi[1]
  222. );
  223. // 71: single-polygon generates 2 shapes, multi-polygon
  224. // generates 1 shape, both are self-tangent and OK
  225. test_traverse_union::apply
  226. (
  227. "case_71_multi", 1, 9,
  228. case_71_multi[0], case_71_multi[1]
  229. );
  230. test_traverse_union::apply
  231. (
  232. "case_72_multi", 1, 10.65,
  233. case_72_multi[0], case_72_multi[1]
  234. );
  235. test_traverse_union::apply
  236. (
  237. "case_73_multi", 1, 3,
  238. case_73_multi[0], case_73_multi[1]
  239. );
  240. test_traverse_union::apply
  241. (
  242. "case_74_multi", 2, 17,
  243. case_74_multi[0], case_74_multi[1]
  244. );
  245. test_traverse_union::apply
  246. (
  247. "case_75_multi", 1, 1 /*UU 5, 5 */,
  248. case_75_multi[0], case_75_multi[1]
  249. );
  250. test_traverse_union::apply
  251. (
  252. "case_76_multi", 2, 5 /*UU 6, 6 */,
  253. case_76_multi[0], case_76_multi[1]
  254. );
  255. test_traverse_union::apply
  256. (
  257. "case_80_multi", 1, 9.25,
  258. case_80_multi[0], case_80_multi[1]
  259. );
  260. test_traverse_union::apply
  261. (
  262. "case_81_multi", 1, 3.25,
  263. case_81_multi[0], case_81_multi[1]
  264. );
  265. test_traverse_union::apply
  266. (
  267. "case_82_multi", 3, 4,
  268. case_82_multi[0], case_82_multi[1]
  269. );
  270. test_traverse_union::apply
  271. (
  272. "case_84_multi", 1, 4,
  273. case_84_multi[0], case_84_multi[1]
  274. );
  275. test_traverse_union::apply
  276. (
  277. "case_85_multi", 1, 3.5,
  278. case_85_multi[0], case_85_multi[1]
  279. );
  280. test_traverse_union::apply
  281. (
  282. "case_86_multi", 1, 4,
  283. case_86_multi[0], case_86_multi[1]
  284. );
  285. test_traverse_union::apply
  286. (
  287. "case_87_multi", 1, 6,
  288. case_87_multi[0], case_87_multi[1]
  289. );
  290. test_traverse_union::apply
  291. (
  292. "case_88_multi", 2, 4,
  293. case_88_multi[0], case_88_multi[1]
  294. );
  295. test_traverse_union::apply
  296. (
  297. "case_89_multi", 1, 6,
  298. case_89_multi[0], case_89_multi[1]
  299. );
  300. test_traverse_union::apply
  301. (
  302. "case_90_multi", 1, 7.5,
  303. case_90_multi[0], case_90_multi[1]
  304. );
  305. test_traverse_union::apply
  306. (
  307. "case_92_multi", 2, 6.25,
  308. case_92_multi[0], case_92_multi[1]
  309. );
  310. test_traverse_union::apply
  311. (
  312. "case_94_multi", 1, 10.0,
  313. case_94_multi[0], case_94_multi[1]
  314. );
  315. test_traverse_union::apply
  316. (
  317. "case_95_multi", 2, 6.5,
  318. case_95_multi[0], case_95_multi[1]
  319. );
  320. test_traverse_union::apply
  321. (
  322. "case_96_multi", 1, 3.5,
  323. case_96_multi[0], case_96_multi[1]
  324. );
  325. test_traverse_union::apply
  326. (
  327. "case_97_multi", 1, 3.75,
  328. case_97_multi[0], case_97_multi[1]
  329. );
  330. test_traverse_union::apply
  331. (
  332. "case_101_multi", 1, 22.25,
  333. case_101_multi[0], case_101_multi[1]
  334. );
  335. test_traverse_union::apply
  336. (
  337. "case_102_multi", 3, 24.25,
  338. case_102_multi[0], case_102_multi[1]
  339. );
  340. test_traverse_union::apply
  341. (
  342. "case_103_multi", 1, 25,
  343. case_103_multi[0], case_103_multi[1]
  344. );
  345. test_traverse_union::apply
  346. (
  347. "case_104_multi", 1, 25,
  348. case_104_multi[0], case_104_multi[1]
  349. );
  350. test_traverse_union::apply
  351. (
  352. "case_105_multi", 1, 25,
  353. case_105_multi[0], case_105_multi[1]
  354. );
  355. test_traverse_union::apply
  356. (
  357. "case_106_multi", 1, 25,
  358. case_106_multi[0], case_106_multi[1]
  359. );
  360. test_traverse_union::apply
  361. (
  362. "case_recursive_boxes_1", 2, 97,
  363. case_recursive_boxes_1[0], case_recursive_boxes_1[1]
  364. );
  365. test_traverse_union::apply
  366. (
  367. "case_recursive_boxes_3", 7, 49.5,
  368. case_recursive_boxes_3[0], case_recursive_boxes_3[1]
  369. );
  370. test_traverse_intersection::apply
  371. (
  372. "pie_21_7_21_0_3", 2, 818824.56678,
  373. pie_21_7_21_0_3[0], pie_21_7_21_0_3[1]
  374. );
  375. test_traverse_intersection::apply
  376. (
  377. "pie_23_19_5_0_2", 2, 2948602.3911823,
  378. pie_23_19_5_0_2[0], pie_23_19_5_0_2[1]
  379. );
  380. test_traverse_intersection::apply
  381. (
  382. "pie_7_14_5_0_7", 2, 490804.56678,
  383. pie_7_14_5_0_7[0], pie_7_14_5_0_7[1]
  384. );
  385. test_traverse_intersection::apply
  386. (
  387. "pie_16_16_9_0_2", 2, 1146795,
  388. pie_16_16_9_0_2[0], pie_16_16_9_0_2[1]
  389. );
  390. test_traverse_intersection::apply
  391. (
  392. "pie_7_2_1_0_15", 2, 490585.5,
  393. pie_7_2_1_0_15[0], pie_7_2_1_0_15[1]
  394. );
  395. }
  396. template <typename T>
  397. void test_all()
  398. {
  399. typedef bg::model::point<T, 2, bg::cs::cartesian> point_type;
  400. typedef bg::model::multi_polygon
  401. <
  402. bg::model::polygon<point_type>
  403. > multi_polygon;
  404. typedef bg::model::multi_polygon
  405. <
  406. bg::model::polygon<point_type, false>
  407. > multi_polygon_ccw;
  408. test_geometries<multi_polygon, false>();
  409. test_geometries<multi_polygon_ccw, true>();
  410. }
  411. int test_main(int, char* [])
  412. {
  413. test_all<double>();
  414. return 0;
  415. }