relate_areal_areal.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
  3. // This file was modified by Oracle on 2013, 2014, 2015.
  4. // Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
  5. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  6. // Use, modification and distribution is subject to the Boost Software License,
  7. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. #include "test_relate.hpp"
  10. //#include <to_svg.hpp>
  11. template <typename P>
  12. void test_polygon_polygon()
  13. {
  14. typedef bg::model::polygon<P> poly;
  15. typedef bg::model::ring<P> ring;
  16. // touching
  17. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  18. "POLYGON((10 0,10 10,20 10,20 0,10 0))",
  19. "FF2F11212");
  20. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  21. "POLYGON((0 -10,0 0,10 0,10 -10,0 -10))",
  22. "FF2F11212");
  23. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  24. "POLYGON((10 0,15 10,20 10,20 0,10 0))",
  25. "FF2F01212");
  26. // containing
  27. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  28. "POLYGON((5 5,5 10,6 10,6 5,5 5))",
  29. "212F11FF2");
  30. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  31. "POLYGON((5 5,5 10,6 5,5 5))",
  32. "212F01FF2");
  33. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  34. "POLYGON((5 5,5 6,6 6,6 5,5 5))",
  35. "212FF1FF2");
  36. // fully containing
  37. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  38. "POLYGON((5 5,5 9,6 9,6 5,5 5))",
  39. "212FF1FF2");
  40. // fully containing, with a hole
  41. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(3 3,7 3,7 7,3 7,3 3))",
  42. "POLYGON((1 1,1 9,9 9,9 1,1 1))",
  43. "2121F12F2");
  44. // fully containing, both with holes
  45. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(3 3,7 3,7 7,3 7,3 3))",
  46. "POLYGON((1 1,1 9,9 9,9 1,1 1),(2 2,8 2,8 8,2 8,2 2))",
  47. "212FF1FF2");
  48. // fully containing, both with holes
  49. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(3 3,7 3,7 7,3 7,3 3))",
  50. "POLYGON((1 1,1 9,9 9,9 1,1 1),(4 4,6 4,6 6,4 6,4 4))",
  51. "2121F1212");
  52. // overlapping
  53. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  54. "POLYGON((5 0,5 10,20 10,20 0,5 0))",
  55. "212111212");
  56. test_geometry<ring, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  57. "POLYGON((5 0,5 10,20 10,20 0,5 0))",
  58. "212111212");
  59. test_geometry<ring, ring>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  60. "POLYGON((5 0,5 10,20 10,20 0,5 0))",
  61. "212111212");
  62. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,15 5,10 0,0 0))",
  63. "POLYGON((10 0,5 5,10 10,20 10,20 0,10 0))",
  64. "212101212");
  65. // equal
  66. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  67. "POLYGON((10 10,10 5,10 0,5 0,0 0,0 10,5 10,10 10))",
  68. "2FFF1FFF2");
  69. // hole-sized
  70. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,6 5,6 6,5 6,5 5))",
  71. "POLYGON((5 5,5 6,6 6,6 5,5 5))",
  72. "FF2F112F2");
  73. // disjoint
  74. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  75. "POLYGON((0 20,0 30,10 30,10 20,0 20))",
  76. "FF2FF1212");
  77. // disjoint
  78. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(3 3,7 3,7 7,3 7,3 3))",
  79. "POLYGON((0 20,0 30,10 30,10 20,0 20))",
  80. "FF2FF1212");
  81. // equal non-simple / non-simple hole
  82. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,10 5,5 6,5 5))",
  83. "POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
  84. "2FFF1FFF2");
  85. // within non-simple / simple
  86. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
  87. "POLYGON((0 0,5 5,10 5,10 0,0 0))",
  88. "212F11FF2");
  89. // within non-simple hole / simple
  90. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,10 5,5 6,5 5))",
  91. "POLYGON((0 0,5 5,10 5,10 0,0 0))",
  92. "212F11FF2");
  93. // not within non-simple / simple
  94. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
  95. "POLYGON((0 0,0 10,10 10,10 0,0 0))",
  96. "2FF11F2F2");
  97. // not within non-simple hole / simple
  98. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,10 5,5 6,5 5))",
  99. "POLYGON((0 0,0 10,10 10,10 0,0 0))",
  100. "2FF11F2F2");
  101. // not within simple hole / simple
  102. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,9 5,5 6,5 5))",
  103. "POLYGON((0 0,0 10,10 10,9 5,10 0,0 0))",
  104. "2121112F2");
  105. // within non-simple fake hole / simple
  106. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
  107. "POLYGON((0 0,0 10,10 10,10 0,0 0))",
  108. "2FF11F2F2");
  109. // within non-simple fake hole / non-simple fake hole
  110. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
  111. "POLYGON((0 0,0 10,10 10,10 5,5 6,5 4,10 5,10 0,0 0))",
  112. "2FF11F212");
  113. // within non-simple fake hole / non-simple hole
  114. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
  115. "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,5 6,5 4,10 5))",
  116. "2FF11F212");
  117. // containing non-simple fake hole / non-simple hole
  118. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
  119. "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,3 8,3 2,10 5))",
  120. "212F11FF2");
  121. // within non-simple hole / simple
  122. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
  123. "POLYGON((0 0,0 10,10 10,10 0,0 0))",
  124. "2FF11F2F2");
  125. // within non-simple hole / non-simple fake hole
  126. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
  127. "POLYGON((0 0,0 10,10 10,10 5,5 6,5 4,10 5,10 0,0 0))",
  128. "2FF11F212");
  129. // containing non-simple hole / non-simple fake hole
  130. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
  131. "POLYGON((0 0,0 10,10 10,10 5,3 8,3 2,10 5,10 0,0 0))",
  132. "212F11FF2");
  133. // equal non-simple hole / non-simple fake hole
  134. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
  135. "POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
  136. "2FFF1FFF2");
  137. // within non-simple hole / non-simple hole
  138. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
  139. "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,5 6,5 4,10 5))",
  140. "2FF11F212");
  141. // containing non-simple hole / non-simple hole
  142. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
  143. "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,3 8,3 2,10 5))",
  144. "212F11FF2");
  145. // equal non-simple hole / non-simple hole
  146. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
  147. "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
  148. "2FFF1FFF2");
  149. // intersecting non-simple hole / non-simple hole - touching holes
  150. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,10 5,5 6,5 5))",
  151. "POLYGON((0 0,0 10,10 10,10 0,0 0),(0 5,5 4,5 5,0 5))",
  152. "21211F2F2");
  153. // intersecting non-simple fake hole / non-simple hole - touching holes
  154. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
  155. "POLYGON((0 0,0 10,10 10,10 0,0 0),(0 5,5 4,5 5,0 5))",
  156. "21211F2F2");
  157. // intersecting non-simple fake hole / non-simple fake hole - touching holes
  158. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
  159. "POLYGON((0 0,0 5,5 4,5 5,0 5,0 10,10 10,10 0,0 0))",
  160. "21211F2F2");
  161. // intersecting simple - i/i
  162. test_geometry<poly, poly>("POLYGON((0 0,0 10,4 10,6 8,5 5,6 2,4 0,0 0))",
  163. "POLYGON((5 5,4 8,6 10,10 10,10 0,6 0,4 2,5 5))",
  164. "212101212");
  165. // intersecting non-simple hole / non-simple hole - i/i
  166. test_geometry<poly, poly>("POLYGON((0 0,0 10,4 10,6 8,5 5,6 2,4 0,0 0),(5 5,2 6,2 4,5 5))",
  167. "POLYGON((5 5,4 8,6 10,10 10,10 0,6 0,4 2,5 5),(5 5,8 4,8 6,5 5))",
  168. "212101212");
  169. // intersecting non-simple hole / simple - i/i
  170. test_geometry<poly, poly>("POLYGON((0 0,0 10,4 10,6 8,5 5,6 2,4 0,0 0),(5 5,2 6,2 4,5 5))",
  171. "POLYGON((5 5,4 8,6 10,10 10,10 0,6 0,4 2,5 5))",
  172. "212101212");
  173. // no turns - disjoint inside a hole
  174. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,9 1,9 9,1 9,1 1))",
  175. "POLYGON((3 3,3 7,7 7,7 3,3 3))",
  176. "FF2FF1212");
  177. // no turns - within
  178. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,9 1,9 9,1 9,1 1))",
  179. "POLYGON((-1 -1,-1 11,11 11,11 -1,-1 -1))",
  180. "2FF1FF212");
  181. // no-turns - intersects
  182. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,8 2,8 8,2 8,2 2))",
  183. "POLYGON((1 1,1 9,9 9,9 1,1 1))",
  184. "2121F12F2");
  185. // no-turns - intersects, hole in a hole
  186. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,8 2,8 8,2 8,2 2))",
  187. "POLYGON((1 1,1 9,9 9,9 1,1 1),(3 3,7 3,7 7,3 7,3 3))",
  188. "2121F1212");
  189. // no-turns ring - for exteriors
  190. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,8 2,8 8,2 8,2 2))",
  191. "POLYGON((1 1,1 9,9 9,9 1,1 1),(2 2,8 2,8 8,2 8,2 2))",
  192. "212F11FF2");
  193. // no-turns ring - for interiors
  194. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(3 3,7 3,7 7,3 7,3 3))",
  195. "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,8 2,8 8,2 8,2 2))",
  196. "212F11FF2");
  197. {
  198. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  199. "POLYGON((5 5,5 10,6 10,6 5,5 5))",
  200. "212F11FF2");
  201. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  202. "POLYGON((10 0,10 10,20 10,20 0,10 0))",
  203. "FF2F11212");
  204. namespace bgdr = bg::detail::relate;
  205. poly p1, p2, p3;
  206. bg::read_wkt("POLYGON((0 0,0 10,10 10,10 0,0 0))", p1);
  207. bg::read_wkt("POLYGON((10 0,10 10,20 10,20 0,10 0))", p2);
  208. bg::read_wkt("POLYGON((5 5,5 10,6 10,6 5,5 5))", p3);
  209. BOOST_CHECK(bg::relate(p1, p2, bg::de9im::mask("FT*******")
  210. || bg::de9im::mask("F**T*****")
  211. || bg::de9im::mask("F***T****"))); // touches()
  212. BOOST_CHECK(bg::relate(p1, p3, bg::de9im::mask("T*****FF*"))); // contains()
  213. BOOST_CHECK(bg::relate(p2, p3, bg::de9im::mask("FF*FF****"))); // disjoint()
  214. BOOST_CHECK(bg::relate(p1, p2, bg::de9im::static_mask<'F','T'>()
  215. || bg::de9im::static_mask<'F','*','*','T'>()
  216. || bg::de9im::static_mask<'F','*','*','*','T'>()));
  217. }
  218. // CCW
  219. {
  220. typedef bg::model::polygon<P, false> poly;
  221. // within non-simple hole / simple
  222. test_geometry<poly, poly>("POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,5 6,10 5,5 5))",
  223. "POLYGON((0 0,10 0,10 5,5 5,0 0))",
  224. "212F11FF2");
  225. }
  226. // OPEN
  227. {
  228. typedef bg::model::polygon<P, true, false> poly;
  229. // within non-simple hole / simple
  230. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0),(5 5,10 5,5 6))",
  231. "POLYGON((0 0,5 5,10 5,10 0))",
  232. "212F11FF2");
  233. }
  234. // CCW, OPEN
  235. {
  236. typedef bg::model::polygon<P, false, false> poly;
  237. // within non-simple hole / simple
  238. test_geometry<poly, poly>("POLYGON((0 0,10 0,10 10,0 10),(5 5,5 6,10 5))",
  239. "POLYGON((0 0,10 0,10 5,5 5))",
  240. "212F11FF2");
  241. }
  242. // https://svn.boost.org/trac/boost/ticket/10912
  243. {
  244. // external rings touches and G2's hole is inside G1
  245. test_geometry<poly, poly>("POLYGON((0 0,0 5,5 5,5 0,0 0))",
  246. "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,4 2,4 4,2 4,2 2),(6 6,8 6,8 8,6 8,6 6))",
  247. "21211F212");
  248. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  249. "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,2 4,4 4,4 2,2 2))",
  250. "212F1FFF2");
  251. // extended
  252. // external rings touches and G1's hole is inside G2
  253. test_geometry<poly, poly>("POLYGON((0 0,0 9,9 9,9 0,0 0),(2 2,7 2,7 7,2 7,2 2))",
  254. "POLYGON((0 0,0 10,10 10,10 0,0 0))",
  255. "2FF11F212");
  256. // external rings touches, holes doesn't
  257. test_geometry<poly, poly>("POLYGON((0 0,0 9,9 9,9 0,0 0),(2 2,7 2,7 7,2 7,2 2))",
  258. "POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,8 1,8 8,1 8,1 1))",
  259. "212111212");
  260. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,7 2,7 7,2 7,2 2))",
  261. "POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,8 1,8 8,1 8,1 1))",
  262. "212F11FF2");
  263. // holes touches, external rings doesn't
  264. test_geometry<poly, poly>("POLYGON((1 1,1 9,9 9,9 1,1 1),(2 2,8 2,8 8,2 8,2 2))",
  265. "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,7 2,7 7,2 7,2 2))",
  266. "2FF11F212");
  267. test_geometry<poly, poly>("POLYGON((1 1,1 9,9 9,9 1,1 1),(2 2,7 2,7 7,2 7,2 2))",
  268. "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,8 2,8 8,2 8,2 2))",
  269. "212111212");
  270. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,8 2,8 8,2 8,2 2))",
  271. "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,7 2,7 7,2 7,2 2))",
  272. "2FF11F212");
  273. test_geometry<poly, poly>("POLYGON((3 3,3 9,9 9,9 3,3 3))",
  274. "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,4 2,4 4,2 4,2 2))",
  275. "212101212");
  276. }
  277. if ( BOOST_GEOMETRY_CONDITION((
  278. boost::is_same<typename bg::coordinate_type<P>::type, double>::value )) )
  279. {
  280. // original - assertion for CCW
  281. //"POLYGON((-0.593220338983050821113352 -8.05084745762711939676137,1.14285714285714279370154 -4,1.50731707317073171381594 1.10243902439024443751237,1.73758865248226967992196 1.37588652482269591104114,1.21739130434782616418943 -3.82608695652173924628414,2 -2,2 1.68750000000000044408921,2.35384615384615436539661 2.10769230769230775379697,2 2.16666666666666651863693,2 4,1.81967213114754100544701 2.1967213114754100544701,1.5882352941176469673934 2.2352941176470588757752,1.8148148148148146585612 5.4074074074074074403029,-0.538461538461538546940233 4.23076923076923083755219,-1.76510067114094004736558 2.89261744966443012927471,-1.64864864864864868465588 2.7567567567567570208098,-1.83962264150943455298659 2.81132075471698161805989,-1.84337349397590433142113 2.80722891566265086993326,-2.14285714285714279370154 2.85714285714285720629846,-2.11111111111111116045436 2.88888888888888883954564,-2.87234042553191448732264 3.10638297872340407579372,-2.91803278688524558859285 3.4262295081967208965068,-3.1733333333333324510761 3.26666666666666660745477,-2.99999999999999822364316 3.14285714285714234961233,-3.25490196078431326398572 3.21568627450980359938626,-3.47368421052631504153396 3.07894736842105265495206,-7.32000000000000028421709 3.72000000000000019539925,-7.54716981132075481752963 3.62264150943396234794136,-7.75 3.79166666666666651863693,-7.79999999999999982236432 3.79999999999999982236432,-7.59999999999999964472863 3.60000000000000008881784,-8.8556701030927822415606 3.06185567010309300783888,-8.82945736434108674473009 2.8914728682170549589614,-7.73333333333333339254523 2.193939393939393855959,-8 2,-5.94736842105263185942476 -1.42105263157894645686952,-5.32558139534883689947264 -0.488372093023255016142059,-5.85714285714285765038767 1.00000000000000066613381,-4.78723404255319184841255 0.319148936170212838003835,-5.32558139534883689947264 -0.488372093023255016142059,-4.74019607843137258385013 -2.12745098039215774221589,-3.17647058823529437887601 -0.705882352941176627325603,-2.93103448275862055183438 -0.862068965517241436735674,-3 -1,-4.57894736842105309904127 -2.57894736842105265495206,-4.47887323943661996850096 -2.85915492957746497637572,-7.58620689655172419918472 -5.18965517241379359347775,-7.52525252525252508206677 -5.5858585858585865224768,-4.18644067796610119813749 -3.67796610169491522412955,-3.44041450777202051369841 -5.76683937823834202873741,-3.73611111111111116045436 -6.56944444444444464181743,-2.8823529411764705621124 -7.7647058823529411242248,-2.88235294117647100620161 -7.7647058823529411242248,-0.593220338983050821113352 -8.05084745762711939676137),(1.66666666666666696272614 1.59999999999999875655021,1.43749999999999911182158 1.8750000000000002220446,0.0869565217391310429917439 2.26086956521739113057379,0.466666666666667118157363 2.60606060606060552231611,1.04878048780487764801705 2.34146341463414664474385,1.43749999999999911182158 1.8750000000000002220446,1.56756756756756754356275 1.83783783783783771781373,1.66666666666666696272614 1.59999999999999875655021))"
  282. //"POLYGON((-2.33333333333333303727386 -8.66666666666666607454772,-2.26315789473684203514381 -8.63157894736842123961651,-2.88235294117647100620161 -7.7647058823529411242248,-2.8823529411764705621124 -7.7647058823529411242248,-4.11949685534591125701809 -7.61006289308176064878353,-4.32530120481927671249878 -8.16867469879518104391991,-2.33333333333333303727386 -8.66666666666666607454772))"
  283. // assertion failure in 1.57
  284. test_geometry<poly, poly>("POLYGON((-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))",
  285. "POLYGON((-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))",
  286. "*********");
  287. // simpler case
  288. test_geometry<poly, poly>("POLYGON((0 0, -0.59322033898305082 -8.0508474576271194, -2.8823529411764710 -7.7647058823529411, -3.7361111111111112 -6.5694444444444446, 0 0))",
  289. "POLYGON((-10 -10, -4.1194968553459113 -7.6100628930817606, -2.8823529411764706 -7.7647058823529411, -2.2631578947368420 -8.6315789473684212, -10 -10))",
  290. "FF2F01212");
  291. // sanity check
  292. test_geometry<poly, poly>("POLYGON((0 0, -0.59322033898305082 -8.0508474576271194, -2.8823529411764710 -7.7647058823529411, -3.7361111111111112 -6.5694444444444446, 0 0))",
  293. "POLYGON((-10 -10, -4.1194968553459113 -7.6100628930817606, -2.8823529411764710 -7.7647058823529411, -2.2631578947368420 -8.6315789473684212, -10 -10))",
  294. "FF2F01212");
  295. // compatibility check
  296. /*test_geometry<poly, poly>("POLYGON((0 0,0 1,1 1,1 0,0 0))",
  297. "POLYGON((1 1,1 2,2 2,2 1,1 1))",
  298. "****0****");
  299. test_geometry<P, P>("POINT(0.9999999999999998 0.9999999999999998)",
  300. "POINT(1 1)",
  301. "0********");
  302. test_geometry<P, P>("POINT(0.9999999999999995 0.9999999999999995)",
  303. "POINT(1 1)",
  304. "F********");
  305. test_geometry<poly, poly>("POLYGON((0 0,0 1,0.9999999999999998 0.9999999999999998,1 0,0 0))",
  306. "POLYGON((1 1,1 2,2 2,2 1,1 1))",
  307. "****0****");
  308. test_geometry<poly, poly>("POLYGON((0 0,0 1,0.9999999999999995 0.9999999999999995,1 0,0 0))",
  309. "POLYGON((1 1,1 2,2 2,2 1,1 1))",
  310. "****F****");*/
  311. }
  312. // mysql 21872795 (overlaps)
  313. test_geometry<poly, poly>("POLYGON((2 2,2 8,8 8,8 2,2 2))",
  314. "POLYGON((0 0,0 10,10 10,10 0,0 0),(8 8,4 6,4 4,8 8))",
  315. "21210F212");
  316. test_geometry<poly, poly>("POLYGON((2 2,2 8,8 8,8 2,2 2))",
  317. "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,4 4,4 6,2 2))",
  318. "21210F212");
  319. // mysql 21873343 (touches)
  320. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0), (0 8, 8 5, 8 8, 0 8))",
  321. "POLYGON((0 8,-8 5,-8 8,0 8))",
  322. "FF2F01212");
  323. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0), (0 6, 6 3, 6 6, 0 6))",
  324. "POLYGON((0 6,-6 3,-6 6,0 6))",
  325. "FF2F01212");
  326. // similar but touching from the inside of the hole
  327. test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0), (0 8, 8 5, 8 8, 0 8))",
  328. "POLYGON((0 8,7 7, 7 6,0 8))",
  329. "FF2F01212");
  330. }
  331. template <typename P>
  332. void test_polygon_multi_polygon()
  333. {
  334. typedef bg::model::polygon<P> poly;
  335. typedef bg::model::ring<P> ring;
  336. typedef bg::model::multi_polygon<poly> mpoly;
  337. test_geometry<poly, mpoly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  338. "MULTIPOLYGON(((5 5,5 10,6 10,6 5,5 5)),((0 20,0 30,10 30,10 20,0 20)))",
  339. "212F11212");
  340. test_geometry<ring, mpoly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  341. "MULTIPOLYGON(((5 5,5 10,6 10,6 5,5 5)),((0 20,0 30,10 30,10 20,0 20)))",
  342. "212F11212");
  343. test_geometry<mpoly, poly>("MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
  344. "POLYGON((0 0,0 5,5 5,5 0,0 0))",
  345. "212F11FF2");
  346. test_geometry<poly, mpoly>("POLYGON((0 0,0 5,5 5,5 0,0 0))",
  347. "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
  348. "2FF11F212");
  349. test_geometry<poly, mpoly>("POLYGON((0 0,0 5,5 5,5 0,0 0))",
  350. "MULTIPOLYGON(((0 0,0 -10,-10 -10,-10 0,0 0)),((0 0,0 10,10 10,10 0,0 0)))",
  351. "2FF11F212");
  352. test_geometry<poly, mpoly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
  353. "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
  354. "2FFF1F212");
  355. }
  356. template <typename P>
  357. void test_multi_polygon_multi_polygon()
  358. {
  359. typedef bg::model::polygon<P> poly;
  360. typedef bg::model::multi_polygon<poly> mpoly;
  361. test_geometry<mpoly, mpoly>("MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))",
  362. "MULTIPOLYGON(((5 5,5 10,6 10,6 5,5 5)),((0 20,0 30,10 30,10 20,0 20)))",
  363. "212F11212");
  364. test_geometry<mpoly, mpoly>("MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 20,0 30,10 30,10 20,0 20)))",
  365. "MULTIPOLYGON(((5 5,5 10,6 10,6 5,5 5)))",
  366. "212F11FF2");
  367. test_geometry<mpoly, mpoly>("MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))",
  368. "MULTIPOLYGON(((5 5,5 6,6 6,6 5,5 5)),((0 20,0 30,10 30,10 20,0 20)))",
  369. "212FF1212");
  370. test_geometry<mpoly, mpoly>("MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 20,0 30,10 30,10 20,0 20)))",
  371. "MULTIPOLYGON(((5 5,5 6,6 6,6 5,5 5)))",
  372. "212FF1FF2");
  373. }
  374. template <typename P>
  375. void test_all()
  376. {
  377. test_polygon_polygon<P>();
  378. test_polygon_multi_polygon<P>();
  379. test_multi_polygon_multi_polygon<P>();
  380. }
  381. int test_main( int , char* [] )
  382. {
  383. test_all<bg::model::d2::point_xy<int> >();
  384. test_all<bg::model::d2::point_xy<double> >();
  385. #if defined(HAVE_TTMATH)
  386. test_all<bg::model::d2::point_xy<ttmath_big> >();
  387. #endif
  388. return 0;
  389. }