• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 
3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
4 
5 // This file was modified by Oracle on 2013, 2014, 2015.
6 // Modifications copyright (c) 2013-2015 Oracle and/or its affiliates.
7 
8 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
9 
10 // Use, modification and distribution is subject to the Boost Software License,
11 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
12 // http://www.boost.org/LICENSE_1_0.txt)
13 
14 
15 #include "test_relate.hpp"
16 
17 //#include <to_svg.hpp>
18 
19 template <typename P>
test_polygon_polygon()20 void test_polygon_polygon()
21 {
22     typedef bg::model::polygon<P> poly;
23     typedef bg::model::ring<P> ring;
24 
25     // touching
26     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
27                               "POLYGON((10 0,10 10,20 10,20 0,10 0))",
28                               "FF2F11212");
29     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
30                               "POLYGON((0 -10,0 0,10 0,10 -10,0 -10))",
31                               "FF2F11212");
32     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
33                               "POLYGON((10 0,15 10,20 10,20 0,10 0))",
34                               "FF2F01212");
35 
36     // containing
37     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
38                               "POLYGON((5 5,5 10,6 10,6 5,5 5))",
39                               "212F11FF2");
40     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
41                               "POLYGON((5 5,5 10,6 5,5 5))",
42                               "212F01FF2");
43     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
44                               "POLYGON((5 5,5 6,6 6,6 5,5 5))",
45                               "212FF1FF2");
46 
47     // fully containing
48     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
49                               "POLYGON((5 5,5 9,6 9,6 5,5 5))",
50                               "212FF1FF2");
51     // fully containing, with a hole
52     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))",
53                               "POLYGON((1 1,1 9,9 9,9 1,1 1))",
54                               "2121F12F2");
55     // fully containing, both with holes
56     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))",
57                               "POLYGON((1 1,1 9,9 9,9 1,1 1),(2 2,8 2,8 8,2 8,2 2))",
58                               "212FF1FF2");
59     // fully containing, both with holes
60     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))",
61                               "POLYGON((1 1,1 9,9 9,9 1,1 1),(4 4,6 4,6 6,4 6,4 4))",
62                               "2121F1212");
63 
64     // overlapping
65     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
66                               "POLYGON((5 0,5 10,20 10,20 0,5 0))",
67                               "212111212");
68     test_geometry<ring, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
69                               "POLYGON((5 0,5 10,20 10,20 0,5 0))",
70                               "212111212");
71     test_geometry<ring, ring>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
72                               "POLYGON((5 0,5 10,20 10,20 0,5 0))",
73                               "212111212");
74     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,15 5,10 0,0 0))",
75                               "POLYGON((10 0,5 5,10 10,20 10,20 0,10 0))",
76                               "212101212");
77 
78     // equal
79     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
80                               "POLYGON((10 10,10 5,10 0,5 0,0 0,0 10,5 10,10 10))",
81                               "2FFF1FFF2");
82     // hole-sized
83     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))",
84                               "POLYGON((5 5,5 6,6 6,6 5,5 5))",
85                               "FF2F112F2");
86 
87     // disjoint
88     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
89                               "POLYGON((0 20,0 30,10 30,10 20,0 20))",
90                               "FF2FF1212");
91     // disjoint
92     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))",
93                               "POLYGON((0 20,0 30,10 30,10 20,0 20))",
94                               "FF2FF1212");
95 
96     // equal non-simple / non-simple hole
97     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,10 5,5 6,5 5))",
98                               "POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
99                               "2FFF1FFF2");
100 
101     // within non-simple / simple
102     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
103                               "POLYGON((0 0,5 5,10 5,10 0,0 0))",
104                               "212F11FF2");
105     // within non-simple hole / simple
106     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,10 5,5 6,5 5))",
107                               "POLYGON((0 0,5 5,10 5,10 0,0 0))",
108                               "212F11FF2");
109 
110 
111     // not within non-simple / simple
112     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
113                               "POLYGON((0 0,0 10,10 10,10 0,0 0))",
114                               "2FF11F2F2");
115     // not within non-simple hole / simple
116     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,10 5,5 6,5 5))",
117                               "POLYGON((0 0,0 10,10 10,10 0,0 0))",
118                               "2FF11F2F2");
119     // not within simple hole / simple
120     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,9 5,5 6,5 5))",
121                               "POLYGON((0 0,0 10,10 10,9 5,10 0,0 0))",
122                               "2121112F2");
123 
124     // within non-simple fake hole / simple
125     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
126                               "POLYGON((0 0,0 10,10 10,10 0,0 0))",
127                               "2FF11F2F2");
128     // within non-simple fake hole / non-simple fake hole
129     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
130                               "POLYGON((0 0,0 10,10 10,10 5,5 6,5 4,10 5,10 0,0 0))",
131                               "2FF11F212");
132     // within non-simple fake hole / non-simple hole
133     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
134                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,5 6,5 4,10 5))",
135                               "2FF11F212");
136     // containing non-simple fake hole / non-simple hole
137     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
138                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,3 8,3 2,10 5))",
139                               "212F11FF2");
140 
141     // within non-simple hole / simple
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))",
144                               "2FF11F2F2");
145     // within non-simple hole / non-simple fake 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 5,5 6,5 4,10 5,10 0,0 0))",
148                               "2FF11F212");
149     // containing non-simple hole / non-simple fake hole
150     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
151                               "POLYGON((0 0,0 10,10 10,10 5,3 8,3 2,10 5,10 0,0 0))",
152                               "212F11FF2");
153     // equal non-simple hole / non-simple fake hole
154     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
155                               "POLYGON((0 0,0 10,10 10,10 5,4 7,4 3,10 5,10 0,0 0))",
156                               "2FFF1FFF2");
157     // within non-simple hole / non-simple hole
158     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
159                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,5 6,5 4,10 5))",
160                               "2FF11F212");
161     // containing non-simple hole / non-simple hole
162     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
163                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,3 8,3 2,10 5))",
164                               "212F11FF2");
165     // equal non-simple hole / non-simple hole
166     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
167                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(10 5,4 7,4 3,10 5))",
168                               "2FFF1FFF2");
169 
170     // intersecting non-simple hole / non-simple hole - touching holes
171     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0),(5 5,10 5,5 6,5 5))",
172                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(0 5,5 4,5 5,0 5))",
173                               "21211F2F2");
174     // intersecting non-simple fake hole / non-simple hole - touching holes
175     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
176                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(0 5,5 4,5 5,0 5))",
177                               "21211F2F2");
178     // intersecting non-simple fake hole / non-simple fake hole - touching holes
179     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 5,5 6,5 5,10 5,10 0,0 0))",
180                               "POLYGON((0 0,0 5,5 4,5 5,0 5,0 10,10 10,10 0,0 0))",
181                               "21211F2F2");
182 
183     // intersecting simple - i/i
184     test_geometry<poly, poly>("POLYGON((0 0,0 10,4 10,6 8,5 5,6 2,4 0,0 0))",
185                               "POLYGON((5 5,4 8,6 10,10 10,10 0,6 0,4 2,5 5))",
186                               "212101212");
187     // intersecting non-simple hole / non-simple hole - i/i
188     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))",
189                               "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))",
190                               "212101212");
191     // intersecting non-simple hole / simple - i/i
192     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))",
193                               "POLYGON((5 5,4 8,6 10,10 10,10 0,6 0,4 2,5 5))",
194                               "212101212");
195 
196     // no turns - disjoint inside a hole
197     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))",
198                               "POLYGON((3 3,3 7,7 7,7 3,3 3))",
199                               "FF2FF1212");
200     // no turns - within
201     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))",
202                               "POLYGON((-1 -1,-1 11,11 11,11 -1,-1 -1))",
203                               "2FF1FF212");
204     // no-turns - intersects
205     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))",
206                               "POLYGON((1 1,1 9,9 9,9 1,1 1))",
207                               "2121F12F2");
208     // no-turns - intersects, hole in a hole
209     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))",
210                               "POLYGON((1 1,1 9,9 9,9 1,1 1),(3 3,7 3,7 7,3 7,3 3))",
211                               "2121F1212");
212 
213     // no-turns ring - for exteriors
214     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))",
215                               "POLYGON((1 1,1 9,9 9,9 1,1 1),(2 2,8 2,8 8,2 8,2 2))",
216                               "212F11FF2");
217     // no-turns ring - for interiors
218     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))",
219                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,8 2,8 8,2 8,2 2))",
220                               "212F11FF2");
221 
222     {
223         test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
224                                   "POLYGON((5 5,5 10,6 10,6 5,5 5))",
225                                   "212F11FF2");
226 
227         test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
228                                   "POLYGON((10 0,10 10,20 10,20 0,10 0))",
229                                   "FF2F11212");
230 
231         namespace bgdr = bg::detail::relate;
232         poly p1, p2, p3;
233         bg::read_wkt("POLYGON((0 0,0 10,10 10,10 0,0 0))", p1);
234         bg::read_wkt("POLYGON((10 0,10 10,20 10,20 0,10 0))", p2);
235         bg::read_wkt("POLYGON((5 5,5 10,6 10,6 5,5 5))", p3);
236         BOOST_CHECK(bg::relate(p1, p2, bg::de9im::mask("FT*******")
237                                     || bg::de9im::mask("F**T*****")
238                                     || bg::de9im::mask("F***T****"))); // touches()
239         BOOST_CHECK(bg::relate(p1, p3, bg::de9im::mask("T*****FF*"))); // contains()
240         BOOST_CHECK(bg::relate(p2, p3, bg::de9im::mask("FF*FF****"))); // disjoint()
241 
242         BOOST_CHECK(bg::relate(p1, p2, bg::de9im::static_mask<'F','T'>()
243                                     || bg::de9im::static_mask<'F','*','*','T'>()
244                                     || bg::de9im::static_mask<'F','*','*','*','T'>()));
245     }
246 
247     // CCW
248     {
249         typedef bg::model::polygon<P, false> poly;
250         // within non-simple hole / simple
251         test_geometry<poly, poly>("POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,5 6,10 5,5 5))",
252                                   "POLYGON((0 0,10 0,10 5,5 5,0 0))",
253                                   "212F11FF2");
254     }
255     // OPEN
256     {
257         typedef bg::model::polygon<P, true, false> poly;
258         // within non-simple hole / simple
259         test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0),(5 5,10 5,5 6))",
260                                   "POLYGON((0 0,5 5,10 5,10 0))",
261                                   "212F11FF2");
262     }
263     // CCW, OPEN
264     {
265         typedef bg::model::polygon<P, false, false> poly;
266         // within non-simple hole / simple
267         test_geometry<poly, poly>("POLYGON((0 0,10 0,10 10,0 10),(5 5,5 6,10 5))",
268                                   "POLYGON((0 0,10 0,10 5,5 5))",
269                                   "212F11FF2");
270     }
271 
272     // https://svn.boost.org/trac/boost/ticket/10912
273     {
274         // external rings touches and G2's hole is inside G1
275         test_geometry<poly, poly>("POLYGON((0 0,0 5,5 5,5 0,0 0))",
276                                   "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))",
277                                   "21211F212");
278         test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
279                                   "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,2 4,4 4,4 2,2 2))",
280                                   "212F1FFF2");
281         // extended
282         // external rings touches and G1's hole is inside G2
283         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))",
284                                   "POLYGON((0 0,0 10,10 10,10 0,0 0))",
285                                   "2FF11F212");
286         // external rings touches, holes doesn't
287         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))",
288                                   "POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,8 1,8 8,1 8,1 1))",
289                                   "212111212");
290         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))",
291                                   "POLYGON((0 0,0 10,10 10,10 0,0 0),(1 1,8 1,8 8,1 8,1 1))",
292                                   "212F11FF2");
293         // holes touches, external rings doesn't
294         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))",
295                                   "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,7 2,7 7,2 7,2 2))",
296                                   "2FF11F212");
297         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))",
298                                   "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,8 2,8 8,2 8,2 2))",
299                                   "212111212");
300         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))",
301                                   "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,7 2,7 7,2 7,2 2))",
302                                   "2FF11F212");
303 
304         test_geometry<poly, poly>("POLYGON((3 3,3 9,9 9,9 3,3 3))",
305                                   "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,4 2,4 4,2 4,2 2))",
306                                   "212101212");
307     }
308 
309     if ( BOOST_GEOMETRY_CONDITION((
310             boost::is_same<typename bg::coordinate_type<P>::type, double>::value )) )
311     {
312         // original - assertion for CCW
313         //"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))"
314         //"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))"
315 
316         // assertion failure in 1.57
317         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))",
318                                   "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))",
319                                   "*********");
320         // simpler case
321         test_geometry<poly, poly>("POLYGON((0 0, -0.59322033898305082 -8.0508474576271194, -2.8823529411764710 -7.7647058823529411, -3.7361111111111112 -6.5694444444444446, 0 0))",
322                                   "POLYGON((-10 -10, -4.1194968553459113 -7.6100628930817606, -2.8823529411764706 -7.7647058823529411, -2.2631578947368420 -8.6315789473684212, -10 -10))",
323                                   "FF2F01212");
324         // sanity check
325         test_geometry<poly, poly>("POLYGON((0 0, -0.59322033898305082 -8.0508474576271194, -2.8823529411764710 -7.7647058823529411, -3.7361111111111112 -6.5694444444444446, 0 0))",
326                                   "POLYGON((-10 -10, -4.1194968553459113 -7.6100628930817606, -2.8823529411764710 -7.7647058823529411, -2.2631578947368420 -8.6315789473684212, -10 -10))",
327                                   "FF2F01212");
328 
329         // compatibility check
330         /*test_geometry<poly, poly>("POLYGON((0 0,0 1,1 1,1 0,0 0))",
331                                   "POLYGON((1 1,1 2,2 2,2 1,1 1))",
332                                   "****0****");
333         test_geometry<P, P>("POINT(0.9999999999999998 0.9999999999999998)",
334                             "POINT(1 1)",
335                             "0********");
336         test_geometry<P, P>("POINT(0.9999999999999995 0.9999999999999995)",
337                             "POINT(1 1)",
338                             "F********");
339         test_geometry<poly, poly>("POLYGON((0 0,0 1,0.9999999999999998 0.9999999999999998,1 0,0 0))",
340                                   "POLYGON((1 1,1 2,2 2,2 1,1 1))",
341                                   "****0****");
342         test_geometry<poly, poly>("POLYGON((0 0,0 1,0.9999999999999995 0.9999999999999995,1 0,0 0))",
343                                   "POLYGON((1 1,1 2,2 2,2 1,1 1))",
344                                   "****F****");*/
345     }
346 
347     // mysql 21872795 (overlaps)
348     test_geometry<poly, poly>("POLYGON((2 2,2 8,8 8,8 2,2 2))",
349                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(8 8,4 6,4 4,8 8))",
350                               "21210F212");
351     test_geometry<poly, poly>("POLYGON((2 2,2 8,8 8,8 2,2 2))",
352                               "POLYGON((0 0,0 10,10 10,10 0,0 0),(2 2,4 4,4 6,2 2))",
353                               "21210F212");
354     // mysql 21873343 (touches)
355     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0), (0 8, 8 5, 8 8, 0 8))",
356                               "POLYGON((0 8,-8 5,-8 8,0 8))",
357                               "FF2F01212");
358     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0), (0 6, 6 3, 6 6, 0 6))",
359                               "POLYGON((0 6,-6 3,-6 6,0 6))",
360                               "FF2F01212");
361     // similar but touching from the inside of the hole
362     test_geometry<poly, poly>("POLYGON((0 0,0 10,10 10,10 0,0 0), (0 8, 8 5, 8 8, 0 8))",
363                               "POLYGON((0 8,7 7, 7 6,0 8))",
364                               "FF2F01212");
365 }
366 
367 template <typename P>
test_polygon_multi_polygon()368 void test_polygon_multi_polygon()
369 {
370     typedef bg::model::polygon<P> poly;
371     typedef bg::model::ring<P> ring;
372     typedef bg::model::multi_polygon<poly> mpoly;
373 
374     test_geometry<poly, mpoly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
375                                "MULTIPOLYGON(((5 5,5 10,6 10,6 5,5 5)),((0 20,0 30,10 30,10 20,0 20)))",
376                                "212F11212");
377     test_geometry<ring, mpoly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
378                                "MULTIPOLYGON(((5 5,5 10,6 10,6 5,5 5)),((0 20,0 30,10 30,10 20,0 20)))",
379                                "212F11212");
380 
381     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)))",
382                                "POLYGON((0 0,0 5,5 5,5 0,0 0))",
383                                "212F11FF2");
384     test_geometry<poly, mpoly>("POLYGON((0 0,0 5,5 5,5 0,0 0))",
385                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
386                                "2FF11F212");
387     test_geometry<poly, mpoly>("POLYGON((0 0,0 5,5 5,5 0,0 0))",
388                                "MULTIPOLYGON(((0 0,0 -10,-10 -10,-10 0,0 0)),((0 0,0 10,10 10,10 0,0 0)))",
389                                "2FF11F212");
390     test_geometry<poly, mpoly>("POLYGON((0 0,0 10,10 10,10 0,0 0))",
391                                "MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((0 0,0 -10,-10 -10,-10 0,0 0)))",
392                                "2FFF1F212");
393 }
394 
395 template <typename P>
test_multi_polygon_multi_polygon()396 void test_multi_polygon_multi_polygon()
397 {
398     typedef bg::model::polygon<P> poly;
399     typedef bg::model::multi_polygon<poly> mpoly;
400 
401     test_geometry<mpoly, mpoly>("MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))",
402                                 "MULTIPOLYGON(((5 5,5 10,6 10,6 5,5 5)),((0 20,0 30,10 30,10 20,0 20)))",
403                                 "212F11212");
404     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)))",
405                                 "MULTIPOLYGON(((5 5,5 10,6 10,6 5,5 5)))",
406                                 "212F11FF2");
407 
408     test_geometry<mpoly, mpoly>("MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))",
409                                 "MULTIPOLYGON(((5 5,5 6,6 6,6 5,5 5)),((0 20,0 30,10 30,10 20,0 20)))",
410                                 "212FF1212");
411     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)))",
412                                 "MULTIPOLYGON(((5 5,5 6,6 6,6 5,5 5)))",
413                                 "212FF1FF2");
414 }
415 
416 template <typename P>
test_all()417 void test_all()
418 {
419     test_polygon_polygon<P>();
420     test_polygon_multi_polygon<P>();
421     test_multi_polygon_multi_polygon<P>();
422 }
423 
test_main(int,char * [])424 int test_main( int , char* [] )
425 {
426     test_all<bg::model::d2::point_xy<int> >();
427     test_all<bg::model::d2::point_xy<double> >();
428 
429 #if defined(HAVE_TTMATH)
430     test_all<bg::model::d2::point_xy<ttmath_big> >();
431 #endif
432 
433     return 0;
434 }
435