]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Boost.Geometry (aka GGL, Generic Geometry Library) |
2 | // Unit Test | |
3 | ||
4 | // Copyright (c) 2007-2016 Barend Gehrels, Amsterdam, the Netherlands. | |
5 | // Copyright (c) 2008-2016 Bruno Lalande, Paris, France. | |
6 | // Copyright (c) 2009-2016 Mateusz Loskot, London, UK. | |
7 | ||
8 | // This file was modified by Oracle on 2016. | |
9 | // Modifications copyright (c) 2016, Oracle and/or its affiliates. | |
10 | // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle | |
11 | ||
12 | // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library | |
13 | // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. | |
14 | ||
15 | // Use, modification and distribution is subject to the Boost Software License, | |
16 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
17 | // http://www.boost.org/LICENSE_1_0.txt) | |
18 | ||
19 | #include <iostream> | |
20 | #include <string> | |
21 | ||
22 | #include "test_union.hpp" | |
23 | #include <algorithms/test_overlay.hpp> | |
24 | ||
25 | #include <algorithms/overlay/overlay_cases.hpp> | |
26 | #include <boost/geometry/geometries/point_xy.hpp> | |
27 | ||
28 | ||
29 | ||
30 | template <typename Ring, typename Polygon> | |
31 | void test_areal() | |
32 | { | |
33 | typedef typename bg::coordinate_type<Polygon>::type ct; | |
34 | ||
35 | ut_settings ignore_validity; | |
36 | ignore_validity.test_validity = false; | |
37 | ||
38 | test_one<Polygon, Polygon, Polygon>("simplex_normal", | |
39 | simplex_normal[0], simplex_normal[1], | |
40 | 1, 0, 13, 11.526367); | |
41 | ||
42 | test_one<Polygon, Polygon, Polygon>("simplex_with_empty_1", | |
43 | simplex_normal[0], polygon_empty, | |
44 | 1, 0, 4, 8.0); | |
45 | test_one<Polygon, Polygon, Polygon>("simplex_with_empty_2", | |
46 | polygon_empty, simplex_normal[0], | |
47 | 1, 0, 4, 8.0); | |
48 | ||
49 | test_one<Polygon, Polygon, Polygon>("star_ring", example_star, example_ring, | |
50 | 1, 0, 23, 5.67017141); | |
51 | ||
52 | // This sample was selected because of the border case, and ttmath generates one point more. | |
53 | test_one<Polygon, Polygon, Polygon>("star_poly", example_star, example_polygon, | |
54 | 1, 1, | |
55 | if_typed_tt<ct>(28, 27), 5.647949); | |
56 | ||
57 | // Pseudo-box as Polygon | |
58 | // (note, internally, the intersection points is different, so yes, | |
59 | // it has to be tested) | |
60 | test_one<Polygon, Polygon, Polygon>("box_poly3", "POLYGON((1.5 1.5 , 1.5 2.5 , 4.5 2.5 , 4.5 1.5 , 1.5 1.5))", | |
61 | "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 2.5,5.3 2.5,5.4 1.2,4.9 0.8,2.9 0.7,2 1.3))", | |
62 | 1, 1, 15, 5.93625); | |
63 | ||
64 | test_one<Polygon, Polygon, Polygon>("first_within_second", | |
65 | first_within_second[0], first_within_second[1], | |
66 | 1, 0, 5, 25.0); | |
67 | ||
68 | test_one<Polygon, Polygon, Polygon>("second_within_first", | |
69 | first_within_second[1], first_within_second[0], | |
70 | 1, 0, 5, 25.0); | |
71 | ||
72 | test_one<Polygon, Polygon, Polygon>("first_within_hole_of_second", | |
73 | first_within_hole_of_second[0], first_within_hole_of_second[1], | |
74 | 2, 1, 15, 17.0); | |
75 | ||
76 | test_one<Polygon, Polygon, Polygon>("new_hole", | |
77 | new_hole[0], new_hole[1], | |
78 | 1, 1, 14, 23.0); | |
79 | ||
80 | test_one<Polygon, Polygon, Polygon>("side_side", | |
81 | side_side[0], side_side[1], 1, 0, 7, 2.0); | |
82 | ||
83 | test_one<Polygon, Polygon, Polygon>("identical", | |
84 | identical[0], identical[1], 1, 0, 5, 1.0); | |
85 | ||
86 | test_one<Polygon, Polygon, Polygon>("disjoint", | |
87 | disjoint[0], disjoint[1], 2, 0, 10, 2.0); | |
88 | ||
89 | test_one<Polygon, Polygon, Polygon>("intersect_holes_intersect", | |
90 | intersect_holes_intersect[0], intersect_holes_intersect[1], | |
91 | 1, 1, 14, 39.75); | |
92 | ||
93 | test_one<Polygon, Polygon, Polygon>("intersect_holes_intersect_and_disjoint", | |
94 | intersect_holes_intersect_and_disjoint[0], intersect_holes_intersect_and_disjoint[1], | |
95 | 1, 1, 14, 39.75); | |
96 | ||
97 | test_one<Polygon, Polygon, Polygon>("intersect_holes_intersect_and_touch", | |
98 | intersect_holes_intersect_and_touch[0], intersect_holes_intersect_and_touch[1], | |
99 | 1, 1, 14, 39.75); | |
100 | ||
101 | test_one<Polygon, Polygon, Polygon>("intersect_holes_new_ring", | |
102 | intersect_holes_new_ring[0], intersect_holes_new_ring[1], | |
103 | 1, 2, 15, 253.8961); | |
104 | ||
105 | test_one<Polygon, Polygon, Polygon>("intersect_holes_disjoint", | |
106 | intersect_holes_disjoint[0], | |
107 | intersect_holes_disjoint[1], | |
108 | 1, 0, 9, 40.0); | |
109 | ||
110 | test_one<Polygon, Polygon, Polygon>("within_holes_disjoint", | |
111 | within_holes_disjoint[0], within_holes_disjoint[1], | |
112 | 1, 0, 5, 49.0); | |
113 | ||
114 | test_one<Polygon, Polygon, Polygon>("winded", | |
115 | winded[0], winded[1], | |
116 | 1, 5, 30, 114.0); | |
117 | ||
118 | test_one<Polygon, Polygon, Polygon>("two_bends", | |
119 | two_bends[0], two_bends[1], | |
120 | 1, 0, 7, 40.0); | |
121 | ||
122 | test_one<Polygon, Polygon, Polygon>("star_comb_15", | |
123 | star_comb_15[0], star_comb_15[1], | |
124 | 1, 27, 204, 898.09693338); | |
125 | ||
126 | test_one<Polygon, Polygon, Polygon>("equal_holes_disjoint", | |
127 | equal_holes_disjoint[0], equal_holes_disjoint[1], | |
128 | 1, 1, 10, 81 - 3 * 7); | |
129 | ||
130 | test_one<Polygon, Polygon, Polygon>("only_hole_intersections1", | |
131 | only_hole_intersections[0], only_hole_intersections[1], | |
132 | 1, 2, 13, 190.9090909); | |
133 | test_one<Polygon, Polygon, Polygon>("only_hole_intersections2", | |
134 | only_hole_intersections[0], only_hole_intersections[2], | |
135 | 1, 2, 13, 190.9090909); | |
136 | ||
137 | test_one<Polygon, Polygon, Polygon>("intersect_exterior_and_interiors_winded", | |
138 | intersect_exterior_and_interiors_winded[0], intersect_exterior_and_interiors_winded[1], | |
139 | 1, 1, 26, 66.5333333); | |
140 | ||
141 | test_one<Polygon, Polygon, Polygon>("crossed", | |
142 | crossed[0], crossed[1], | |
143 | 1, 3, 17, 23.5); // Area from SQL Server - was somehow wrong before | |
144 | ||
145 | test_one<Polygon, Polygon, Polygon>("fitting", | |
146 | fitting[0], fitting[1], | |
147 | 1, 0, 5, 25); | |
148 | ||
149 | test_one<Polygon, Polygon, Polygon>("distance_zero", | |
150 | distance_zero[0], distance_zero[1], | |
151 | 1, 0, if_typed<ct, float>(9, 11), 9.0098387); | |
152 | ||
153 | test_one<Polygon, Polygon, Polygon>("wrapped_a", | |
154 | wrapped[0], wrapped[1], | |
155 | 1, 1, 16, 16); | |
156 | test_one<Polygon, Polygon, Polygon>("wrapped_b", | |
157 | wrapped[0], wrapped[2], | |
158 | 1, 1, 16, 16); | |
159 | ||
160 | test_one<Polygon, Polygon, Polygon>("9", | |
161 | case_9[0], case_9[1], 2, 0, 8, 11); | |
162 | test_one<Polygon, Polygon, Polygon>("22", | |
163 | case_22[0], case_22[1], 2, 0, 8, 9.5); | |
164 | test_one<Polygon, Polygon, Polygon>("25", | |
165 | case_25[0], case_25[1], 2, 0, 8, 7); | |
166 | test_one<Polygon, Polygon, Polygon>("26", | |
167 | case_26[0], case_26[1], 2, 0, 9, 7.5); | |
168 | test_one<Polygon, Polygon, Polygon>("31", | |
169 | case_31[0], case_31[1], 2, 0, 8, 4.5); | |
170 | test_one<Polygon, Polygon, Polygon>("32", | |
171 | case_32[0], case_32[1], 2, 0, 8, 4.5); | |
172 | test_one<Polygon, Polygon, Polygon>("33", | |
173 | case_33[0], case_33[1], 2, 0, 8, 4.5); | |
174 | test_one<Polygon, Polygon, Polygon>("36", | |
175 | case_36[0], case_36[1], 1, 1, 10, 14.375); | |
176 | test_one<Polygon, Polygon, Polygon>("40", | |
177 | case_40[0], case_40[1], 2, 0, 18, 11); | |
178 | ||
179 | // Test rings which should be generated by assemble | |
180 | test_one<Polygon, Polygon, Polygon>("53_iet", | |
181 | case_53[0], case_53[2], 1, 1, 16, 16); | |
182 | test_one<Polygon, Polygon, Polygon>("58_iet", | |
183 | case_58[0], case_58[2], 1, 3, 20, 12.16666); | |
184 | ||
185 | test_one<Polygon, Polygon, Polygon>("59_iet", | |
186 | case_59[0], case_59[2], 1, 1, 14, 17.20833); | |
187 | ||
188 | test_one<Polygon, Polygon, Polygon>("80", | |
189 | case_80[0], case_80[1], 2, 2, 18, 129.0); | |
190 | ||
191 | test_one<Polygon, Polygon, Polygon>("81", | |
192 | case_81[0], case_81[1], 1, 2, 15, 163.5); | |
193 | ||
194 | test_one<Polygon, Polygon, Polygon>("82", | |
195 | case_82[0], case_82[1], 1, 1, 21, 19.75); | |
196 | ||
197 | test_one<Polygon, Polygon, Polygon>("83", | |
198 | case_83[0], case_83[1], 1, 0, 7, 20.0); | |
199 | ||
200 | test_one<Polygon, Polygon, Polygon>("90", | |
201 | case_90[0], case_90[1], 1, 2, 17, 221.3688); | |
202 | ||
203 | test_one<Polygon, Polygon, Polygon>("91", | |
204 | case_91[0], case_91[1], 1, 1, 9, 147.5); | |
205 | ||
206 | test_one<Polygon, Polygon, Polygon>("92", | |
207 | case_92[0], case_92[1], 2, 0, 9, 175.0); | |
208 | ||
209 | test_one<Polygon, Polygon, Polygon>("93", | |
210 | case_93[0], case_93[1], 1, 2, 12, 172.9167); | |
211 | ||
212 | test_one<Polygon, Polygon, Polygon>("94", | |
213 | case_94[0], case_94[1], 2, 0, 12, 170.0); | |
214 | ||
215 | // Has two separate but touching interior rings | |
216 | test_one<Polygon, Polygon, Polygon>("95", | |
217 | case_95[0], case_95[1], 1, 2, 15, 1320.0); | |
218 | ||
219 | test_one<Polygon, Polygon, Polygon>("96", | |
220 | case_96[0], case_96[1], 1, 1, 10, 1500.0); | |
221 | ||
222 | test_one<Polygon, Polygon, Polygon>("97", | |
223 | case_97[0], case_97[1], 1, 0, 10, 286.799); | |
224 | ||
225 | test_one<Polygon, Polygon, Polygon>("98", | |
226 | case_98[0], case_98[1], 1, 1, 14, 653.067); | |
227 | ||
228 | test_one<Polygon, Polygon, Polygon>("99", | |
229 | case_99[0], case_99[1], 1, 0, 5, 1600.0); | |
230 | ||
231 | test_one<Polygon, Polygon, Polygon>("100", | |
232 | case_100[0], case_100[1], 1, 1, 13, 19.125); | |
233 | ||
234 | /* | |
235 | test_one<Polygon, Polygon, Polygon>(102, | |
236 | simplex_normal[0], simplex_reversed[1], | |
237 | 1, 0, 7, X); | |
238 | ||
239 | test_one<Polygon, Polygon, Polygon>(103, | |
240 | simplex_reversed[0], simplex_normal[1], | |
241 | 1, 0, 7, 24.0); | |
242 | ||
243 | test_one<Polygon, Polygon, Polygon>(104, | |
244 | simplex_reversed[0], simplex_reversed[1], | |
245 | 1, 0, 7, 24.0); | |
246 | ||
247 | test_one<Polygon, Polygon, Polygon>(100, | |
248 | star_15, comb_15, | |
249 | 1, 10, 7, 24.0); | |
250 | */ | |
251 | ||
252 | // test some other input/output types | |
253 | ||
254 | // 1 input Ring | |
255 | test_one<Polygon, Polygon, Ring>("identical_pr", identical[0], identical[1], 1, 0, 5, 1.0); | |
256 | test_one<Polygon, Ring, Polygon>("identical_rp", identical[0], identical[1], 1, 0, 5, 1.0); | |
257 | ||
258 | // 2 input rings | |
259 | test_one<Polygon, Ring, Ring>("identical_rr", identical[0], identical[1], 1, 0, 5, 1.0); | |
260 | ||
261 | // output is also Ring | |
262 | test_one<Ring, Ring, Ring>("identical_rrr", identical[0], identical[1], 1, 0, 5, 1.0); | |
263 | ||
264 | // "new hole", tested with Ring -> the newly formed hole will be omitted | |
265 | test_one<Ring, Ring, Ring>("new_hole_discarded", new_hole[0], new_hole[1], 1, 0, 9, 24.0); | |
266 | ||
267 | test_one<Polygon, Polygon, Polygon>("ggl_list_20110306_javier", | |
268 | ggl_list_20110306_javier[0], ggl_list_20110306_javier[1], | |
269 | 1, 1, 16, 80456.4904910401); | |
270 | ||
271 | test_one<Polygon, Polygon, Polygon>("ggl_list_20110307_javier", | |
272 | ggl_list_20110307_javier[0], ggl_list_20110307_javier[1], | |
273 | 1, 1, 13, 20016.4); | |
274 | ||
275 | #if ! defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
276 | test_one<Polygon, Polygon, Polygon>("ggl_list_20110627_phillip", | |
277 | ggl_list_20110627_phillip[0], ggl_list_20110627_phillip[1], | |
278 | 1, 0, 8, 14729.07145); | |
279 | #endif | |
280 | ||
281 | test_one<Polygon, Polygon, Polygon>("ggl_list_20110716_enrico", | |
282 | ggl_list_20110716_enrico[0], ggl_list_20110716_enrico[1], | |
283 | 1, 1, 15, 129904.197692871); | |
284 | ||
285 | #if ! defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
286 | test_one<Polygon, Polygon, Polygon>("ggl_list_20110820_christophe", | |
287 | ggl_list_20110820_christophe[0], ggl_list_20110820_christophe[1], | |
288 | -1, // Either 1 or 2, depending if the intersection/turn point (eps.region) is missed | |
289 | 0, | |
290 | if_typed_tt<ct>(9, 8), | |
291 | 67.3550722317627); | |
292 | #endif | |
293 | ||
294 | { | |
295 | ut_settings settings; | |
296 | settings.percentage = 0.1; | |
297 | #if defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
298 | settings.test_validity = false; | |
299 | #endif | |
300 | ||
301 | test_one<Polygon, Polygon, Polygon>("isovist", | |
302 | isovist1[0], isovist1[1], | |
303 | 1, | |
304 | 0, | |
305 | -1, | |
306 | 313.36036462, settings); | |
307 | ||
308 | // SQL Server gives: 313.360374193241 | |
309 | // PostGIS gives: 313.360364623393 | |
310 | } | |
311 | ||
312 | // Ticket 5103 https://svn.boost.org/trac/boost/ticket/5103 | |
313 | // This ticket was actually reported for Boost.Polygon | |
314 | // We check it for Boost.Geometry as well. | |
315 | // SQL Server gives: 2515271331437.69 | |
316 | // PostGIS gives: 2515271327070.52 | |
317 | // Boost.Geometry gives: 2515271327070.5237746891 (ttmath) | |
318 | // 2515271327070.5156 (double) | |
319 | // 2515271320603.0000 (int) | |
320 | // Note the int-test was tested outside of this unit test. | |
321 | // It is in two points 0.37 off (logical for an int). | |
322 | // Because of the width of the polygon (400000 meter) | |
323 | // this causes a substantial difference. | |
324 | ||
325 | test_one<Polygon, Polygon, Polygon>("ticket_5103", | |
326 | ticket_5103[0], ticket_5103[1], | |
327 | 1, 0, 25, 2515271327070.5); | |
328 | ||
329 | test_one<Polygon, Polygon, Polygon>("ticket_8310a", ticket_8310a[0], ticket_8310a[1], | |
330 | 1, 0, 5, 10.5000019595); | |
331 | test_one<Polygon, Polygon, Polygon>("ticket_8310b", ticket_8310b[0], ticket_8310b[1], | |
332 | 1, 0, 5, 10.5000019595); | |
333 | test_one<Polygon, Polygon, Polygon>("ticket_8310c", ticket_8310c[0], ticket_8310c[1], | |
334 | 1, 0, 5, 10.5000019595); | |
335 | ||
336 | test_one<Polygon, Polygon, Polygon>("ticket_9081_15", | |
337 | ticket_9081_15[0], ticket_9081_15[1], | |
338 | 1, 0, 10, 0.0403425433); | |
339 | ||
340 | test_one<Polygon, Polygon, Polygon>("ticket_9563", ticket_9563[0], ticket_9563[1], | |
341 | 1, 0, 13, 150.0); | |
342 | ||
343 | test_one<Polygon, Polygon, Polygon>("ticket_9756", ticket_9756[0], ticket_9756[1], | |
344 | 1, 0, 10, 1289.08374); | |
345 | ||
346 | #if defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
347 | test_one<Polygon, Polygon, Polygon>("ticket_10108_a", ticket_10108_a[0], ticket_10108_a[1], | |
348 | 1, 0, 8, 0.0435229); | |
349 | #else | |
350 | test_one<Polygon, Polygon, Polygon>("ticket_10108_a", ticket_10108_a[0], ticket_10108_a[1], | |
351 | 2, 0, 8, 0.0435229); | |
352 | #endif | |
353 | ||
354 | #if ! defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
355 | test_one<Polygon, Polygon, Polygon>("ticket_10108_b", ticket_10108_b[0], ticket_10108_b[1], | |
356 | 1, 0, 10, 2424.3449); | |
357 | #endif | |
358 | ||
359 | test_one<Polygon, Polygon, Polygon>("ticket_10866", ticket_10866[0], ticket_10866[1], | |
360 | 1, 0, 14, 332760303.5); | |
361 | ||
362 | test_one<Polygon, Polygon, Polygon>("ticket_11725", ticket_11725[0], ticket_11725[1], | |
363 | 1, 1, 10, 7.5); | |
364 | ||
365 | test_one<Polygon, Polygon, Polygon>("geos_1", geos_1[0], geos_1[1], | |
366 | 1, 0, -1, 3461.3203125, | |
367 | ignore_validity); | |
368 | test_one<Polygon, Polygon, Polygon>("geos_2", geos_2[0], geos_2[1], | |
369 | 1, 0, -1, 350.55102539); | |
370 | test_one<Polygon, Polygon, Polygon>("geos_3", geos_3[0], geos_3[1], | |
371 | 1, 0, -1, 29391548.4998779); | |
372 | test_one<Polygon, Polygon, Polygon>("geos_4", geos_4[0], geos_4[1], | |
373 | 1, 0, -1, 2304.4163115); | |
374 | ||
375 | test_one<Polygon, Polygon, Polygon>("buffer_rt_a", buffer_rt_a[0], buffer_rt_a[1], | |
376 | 1, 0, 265, 19.280667); | |
377 | ||
378 | // Robustness issues, followed out buffer-robustness-tests, test them also reverse | |
379 | #if ! defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
380 | test_one<Polygon, Polygon, Polygon>("buffer_rt_f", buffer_rt_f[0], buffer_rt_f[1], | |
381 | 1, 0, if_typed<ct, double>(18, 23), 4.60853, | |
382 | ignore_validity); | |
383 | test_one<Polygon, Polygon, Polygon>("buffer_rt_f_rev", buffer_rt_f[1], buffer_rt_f[0], | |
384 | 1, 0, if_typed<ct, double>(18, 23), 4.60853, | |
385 | ignore_validity); | |
386 | #endif | |
387 | ||
388 | test_one<Polygon, Polygon, Polygon>("buffer_rt_g", buffer_rt_g[0], buffer_rt_g[1], | |
389 | 1, 0, if_typed<ct, float>(18, 17), 16.571); | |
390 | test_one<Polygon, Polygon, Polygon>("buffer_rt_g_rev", buffer_rt_g[1], buffer_rt_g[0], | |
391 | 1, 0, if_typed<ct, float>(18, 17), 16.571); | |
392 | ||
393 | #if ! defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
394 | test_one<Polygon, Polygon, Polygon>("buffer_rt_i", buffer_rt_i[0], buffer_rt_i[1], | |
395 | 1, 0, if_typed<ct, float>(14, 13), 13.6569); | |
396 | #endif | |
397 | test_one<Polygon, Polygon, Polygon>("buffer_rt_i_rev", buffer_rt_i[1], buffer_rt_i[0], | |
398 | 1, 0, 13, 13.6569); | |
399 | ||
400 | test_one<Polygon, Polygon, Polygon>("buffer_rt_j", buffer_rt_j[0], buffer_rt_j[1], | |
401 | 1, 0, -1, 16.5711); | |
402 | test_one<Polygon, Polygon, Polygon>("buffer_rt_j_rev", buffer_rt_j[1], buffer_rt_j[0], | |
403 | 1, 0, -1, 16.5711); | |
404 | ||
405 | #if ! defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
406 | test_one<Polygon, Polygon, Polygon>("buffer_rt_l", buffer_rt_l[0], buffer_rt_l[1], | |
407 | 1, 0, -1, 19.3995); | |
408 | test_one<Polygon, Polygon, Polygon>("buffer_rt_l_rev", buffer_rt_l[1], buffer_rt_l[0], | |
409 | 1, 0, -1, 19.3995); | |
410 | #endif | |
411 | ||
412 | test_one<Polygon, Polygon, Polygon>("buffer_rt_m1", buffer_rt_m1[0], buffer_rt_m1[1], | |
413 | 1, 0, if_typed_tt<ct>(14, 13), 19.4852); | |
414 | test_one<Polygon, Polygon, Polygon>("buffer_rt_m1_rev", buffer_rt_m1[1], buffer_rt_m1[0], | |
415 | 1, 0, if_typed_tt<ct>(14, 13), 19.4852); | |
416 | ||
417 | test_one<Polygon, Polygon, Polygon>("buffer_rt_m2", buffer_rt_m2[0], buffer_rt_m2[1], | |
418 | 1, 0, if_typed_tt<ct>(20, 19), 21.4853); | |
419 | test_one<Polygon, Polygon, Polygon>("buffer_rt_m2_rev", buffer_rt_m2[1], buffer_rt_m2[0], | |
420 | 1, 0, if_typed_tt<ct>(20, 19), 21.4853); | |
421 | ||
422 | test_one<Polygon, Polygon, Polygon>("buffer_rt_q", buffer_rt_q[0], buffer_rt_q[1], | |
423 | 1, 0, 18, 18.5710); | |
424 | test_one<Polygon, Polygon, Polygon>("buffer_rt_q_rev", buffer_rt_q[1], buffer_rt_q[0], | |
425 | 1, 0, 18, 18.5710); | |
426 | ||
427 | #if ! defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
428 | test_one<Polygon, Polygon, Polygon>("buffer_rt_r", buffer_rt_r[0], buffer_rt_r[1], | |
429 | 1, 0, 19, 21.07612); | |
430 | test_one<Polygon, Polygon, Polygon>("buffer_rt_r_rev", buffer_rt_r[1], buffer_rt_r[0], | |
431 | 1, 0, if_typed_tt<ct>(20, 19), 21.07612); | |
432 | #endif | |
433 | ||
434 | #if ! defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
435 | test_one<Polygon, Polygon, Polygon>("buffer_rt_t", buffer_rt_t[0], buffer_rt_t[1], | |
436 | 1, 0, if_typed_tt<ct>(16, 14), 15.6569); | |
437 | test_one<Polygon, Polygon, Polygon>("buffer_rt_t_rev", buffer_rt_t[1], buffer_rt_t[0], | |
438 | 1, 0, if_typed_tt<ct>(16, if_typed<ct, float>(15, 14)), 15.6569); | |
439 | #endif | |
440 | ||
441 | test_one<Polygon, Polygon, Polygon>("buffer_mp1", buffer_mp1[0], buffer_mp1[1], | |
442 | 1, 0, if_typed_tt<ct>(93, 91), 22.815); | |
443 | ||
444 | test_one<Polygon, Polygon, Polygon>("buffer_mp2", buffer_mp2[0], buffer_mp2[1], | |
445 | #if defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
446 | 1, 0, 217, 36.752837, ignore_validity); | |
447 | #else | |
448 | 1, 1, 217, 36.752837); | |
449 | #endif | |
450 | ||
451 | test_one<Polygon, Polygon, Polygon>("mysql_21964079_1", | |
452 | mysql_21964079_1[0], mysql_21964079_1[1], | |
453 | 2, 1, -1, 234.5); | |
454 | test_one<Polygon, Polygon, Polygon>("mysql_21964079_2", | |
455 | mysql_21964079_2[0], mysql_21964079_2[1], | |
456 | 2, 1, -1, 112.0); | |
457 | ||
458 | test_one<Polygon, Polygon, Polygon>("mysql_23023665_1", | |
459 | mysql_23023665_1[0], mysql_23023665_1[1], | |
460 | 2, 1, -1, 92.0 + 142.5); | |
461 | test_one<Polygon, Polygon, Polygon>("mysql_23023665_2", | |
462 | mysql_23023665_2[0], mysql_23023665_2[1], | |
463 | 2, 1, -1, 96.0 + 16.0); | |
464 | test_one<Polygon, Polygon, Polygon>("mysql_23023665_3", | |
465 | mysql_23023665_3[0], mysql_23023665_3[1], | |
466 | 2, 1, -1, 225.0 + 66.0); | |
467 | test_one<Polygon, Polygon, Polygon>("mysql_21964049", | |
468 | mysql_21964049[0], mysql_21964049[1], | |
469 | 1, 1, -1, 220.5); | |
470 | } | |
471 | ||
472 | template <typename P> | |
473 | void test_all() | |
474 | { | |
475 | typedef bg::model::polygon<P> polygon; | |
476 | typedef bg::model::ring<P> ring; | |
477 | typedef bg::model::box<P> box; | |
478 | ||
479 | test_areal<ring, polygon>(); | |
480 | ||
481 | // Open | |
482 | test_areal<bg::model::ring<P, true, false>, bg::model::polygon<P, true, false> >(); | |
483 | ||
484 | // Counter clockwise | |
485 | test_areal<bg::model::ring<P, false>, bg::model::polygon<P, false> >(); | |
486 | ||
487 | #if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE) | |
488 | // Counter clockwise and open | |
489 | test_areal<bg::model::ring<P, false, false>, bg::model::polygon<P, false, false> >(); | |
490 | #endif | |
491 | ||
492 | test_one<polygon, box, polygon>("box_ring", example_box, example_ring, | |
493 | 1, 1, 15, 6.38875); | |
494 | ||
495 | test_one<polygon, box, polygon>("box_poly", example_box, example_polygon, | |
496 | 1, 3, 23, 6.30983); | |
497 | ||
498 | ||
499 | test_one<polygon, box, polygon>("box_poly1", example_box, | |
500 | "POLYGON((3.4 2,4.1 3,5.3 2.6,5.4 1.2,4.9 0.8,2.9 0.7,2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2))", | |
501 | 1, 1, 15, 6.38875); | |
502 | test_one<polygon, box, polygon>("box_poly2", example_box, | |
503 | "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 2.5,5.3 2.5,5.4 1.2,4.9 0.8,2.9 0.7,2 1.3))", | |
504 | 1, 1, 15, 5.93625); | |
505 | ||
506 | // 3: see areal | |
507 | ||
508 | test_one<polygon, box, polygon>("box_poly4", example_box, | |
509 | "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 2.5,4.5 2.5,4.5 1.2,4.9 0.8,2.9 0.7,2 1.3))", | |
510 | 1, 1, 15, 4.651245); | |
511 | ||
512 | test_one<polygon, box, polygon>("box_poly5", example_box, | |
513 | "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 2.5,4.5 2.5,4.5 2.3,5.0 2.3,5.0 2.1,4.5 2.1,4.5 1.9,4.0 1.9,4.5 1.2,4.9 0.8,2.9 0.7,2 1.3))", | |
514 | 1, 1, 21, 4.7191); | |
515 | ||
516 | test_one<polygon, box, polygon>("box_poly6", example_box, | |
517 | "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.1 2.5,4.5 1.2,2.9 0.7,2 1.3))", | |
518 | 1, 1, 15, 4.2174); | |
519 | ||
520 | test_one<polygon, box, polygon>("box_poly7", example_box, | |
521 | "POLYGON((2 1.3,2.4 1.7,2.8 1.8,3.4 1.2,3.7 1.6,3.4 2,4.0 3.0,5.0 2.0,2.9 0.7,2 1.3))", | |
522 | 1, 1, 17, 4.270554); | |
523 | ||
524 | test_one<polygon, box, polygon>("box_poly8", "box(0 0, 3 3)", | |
525 | "POLYGON((2 2, 1 4, 2 4, 3 3, 2 2))", | |
526 | 1, 0, 8, 10.25); | |
527 | } | |
528 | ||
529 | ||
530 | int test_main(int, char* []) | |
531 | { | |
532 | test_all<bg::model::d2::point_xy<double> >(); | |
533 | ||
534 | #if ! defined(BOOST_GEOMETRY_TEST_ONLY_ONE_TYPE) | |
535 | ||
536 | #if ! defined(BOOST_GEOMETRY_NO_ROBUSTNESS) | |
537 | test_all<bg::model::d2::point_xy<float> >(); | |
538 | test_all<bg::model::d2::point_xy<long double> >(); | |
539 | #endif | |
540 | ||
541 | #if defined(HAVE_TTMATH) | |
542 | std::cout << "Testing TTMATH" << std::endl; | |
543 | test_all<bg::model::d2::point_xy<ttmath_big> >(); | |
544 | #endif | |
545 | #endif | |
546 | ||
547 | return 0; | |
548 | } |