]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/test/algorithms/overlay/get_turn_info.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / geometry / test / algorithms / overlay / get_turn_info.cpp
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // Unit Test
3
4 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
5
6 // This file was modified by Oracle on 2017.
7 // Modifications copyright (c) 2017, Oracle and/or its affiliates.
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 #include <iostream>
15
16 #include <geometry_test_common.hpp>
17
18
19 #include <boost/foreach.hpp>
20
21 #include <boost/geometry/algorithms/intersection.hpp>
22 #include <boost/geometry/algorithms/make.hpp>
23
24 #include <boost/geometry/algorithms/detail/overlay/get_turn_info.hpp>
25 #include <boost/geometry/algorithms/detail/overlay/debug_turn_info.hpp>
26 #include <boost/geometry/geometries/point_xy.hpp>
27
28 #if defined(TEST_WITH_SVG)
29 # include <boost/geometry/io/svg/svg_mapper.hpp>
30 #endif
31
32
33
34 template <typename P, typename T>
35 void test_with_point(std::string const& caseid,
36 T pi_x, T pi_y, T pj_x, T pj_y, T pk_x, T pk_y,
37 T qi_x, T qi_y, T qj_x, T qj_y, T qk_x, T qk_y,
38 bg::detail::overlay::method_type expected_method,
39 bool expected_touch_only,
40 T ip_x, T ip_y,
41 std::string const& expected,
42 T ip_x2, T ip_y2)
43 {
44 P pi = bg::make<P>(pi_x, pi_y);
45 P pj = bg::make<P>(pj_x, pj_y);
46 P pk = bg::make<P>(pk_x, pk_y);
47 P qi = bg::make<P>(qi_x, qi_y);
48 P qj = bg::make<P>(qj_x, qj_y);
49 P qk = bg::make<P>(qk_x, qk_y);
50
51 typedef typename bg::strategy::intersection::services::default_strategy
52 <
53 typename bg::cs_tag<P>::type
54 >::type strategy_type;
55
56 typedef typename bg::detail::no_rescale_policy rescale_policy_type;
57
58 typedef bg::detail::overlay::turn_info
59 <
60 P,
61 typename bg::segment_ratio_type<P, rescale_policy_type>::type
62 > turn_info;
63 typedef std::vector<turn_info> tp_vector;
64 turn_info model;
65 tp_vector info;
66 strategy_type strategy;
67 rescale_policy_type rescale_policy;
68 bg::detail::overlay::get_turn_info
69 <
70 bg::detail::overlay::assign_null_policy
71 >::apply(pi, pj, pk, qi, qj, qk,
72 false, false, false, false, // dummy parameters
73 model, strategy, rescale_policy, std::back_inserter(info));
74
75
76 if (info.size() == 0)
77 {
78 BOOST_CHECK_EQUAL(expected_method,
79 bg::detail::overlay::method_none);
80 }
81
82 std::string detected;
83 std::string method;
84 for (typename tp_vector::const_iterator it = info.begin(); it != info.end(); ++it)
85 {
86 for (int t = 0; t < 2; t++)
87 {
88 detected += bg::operation_char(it->operations[t].operation);
89 method += bg::method_char(it->method);
90 }
91 }
92
93 BOOST_CHECK_MESSAGE(detected == expected,
94 caseid
95 << (caseid.find("_") == std::string::npos ? " " : "")
96 << " method: " << method
97 << " detected: " << detected
98 << " expected: " << expected);
99
100
101 if (! info.empty())
102 {
103 BOOST_CHECK_EQUAL(info[0].method, expected_method);
104 BOOST_CHECK_MESSAGE(info[0].touch_only == expected_touch_only,
105 caseid
106 << " detected: " << info[0].touch_only
107 << " expected: " << expected_touch_only);
108 BOOST_CHECK_CLOSE(bg::get<0>(info[0].point), ip_x, 0.001);
109 BOOST_CHECK_CLOSE(bg::get<1>(info[0].point), ip_y, 0.001);
110
111 if (info.size() > 1)
112 {
113 BOOST_CHECK_EQUAL(info.size(), 2u);
114 BOOST_CHECK_EQUAL(info[1].method, expected_method);
115 BOOST_CHECK_CLOSE(bg::get<0>(info[1].point), ip_x2, 0.001);
116 BOOST_CHECK_CLOSE(bg::get<1>(info[1].point), ip_y2, 0.001);
117 }
118 }
119
120 #if defined(TEST_WITH_SVG)
121 {
122 std::ostringstream filename;
123 filename << "get_turn_info_" << caseid
124 << "_" << string_from_type<typename bg::coordinate_type<P>::type>::name()
125 << ".svg";
126
127 std::ofstream svg(filename.str().c_str());
128
129 bg::svg_mapper<P> mapper(svg, 500, 500);
130 mapper.add(bg::make<P>(0, 0));
131 mapper.add(bg::make<P>(10, 10));
132
133 bg::model::linestring<P> p; p.push_back(pi); p.push_back(pj); p.push_back(pk);
134 bg::model::linestring<P> q; q.push_back(qi); q.push_back(qj); q.push_back(qk);
135 mapper.map(p, "opacity:0.8;stroke:rgb(0,192,0);stroke-width:3");
136 mapper.map(q, "opacity:0.8;stroke:rgb(0,0,255);stroke-width:3");
137
138 std::string style = ";font-family='Verdana';font-weight:bold";
139 std::string align = ";text-anchor:end;text-align:end";
140 int offset = 8;
141
142 mapper.text(pi, "pi", "fill:rgb(0,192,0)" + style, offset, offset);
143 mapper.text(pj, "pj", "fill:rgb(0,192,0)" + style, offset, offset);
144 mapper.text(pk, "pk", "fill:rgb(0,192,0)" + style, offset, offset);
145
146 mapper.text(qi, "qi", "fill:rgb(0,0,255)" + style + align, -offset, offset);
147 mapper.text(qj, "qj", "fill:rgb(0,0,255)" + style + align, -offset, offset);
148 mapper.text(qk, "qk", "fill:rgb(0,0,255)" + style + align, -offset, offset);
149
150
151 int factor = 1; // second info, if any, will go left by factor -1
152 int ch = '1';
153 for (typename tp_vector::const_iterator it = info.begin();
154 it != info.end();
155 ++it, factor *= -1, ch++)
156 {
157 bool at_j = it->method == bg::detail::overlay::method_crosses;
158 std::string op;
159 op += bg::operation_char(it->operations[0].operation);
160 align = ";text-anchor:middle;text-align:center";
161 mapper.text(at_j ? pj : pk, op, "fill:rgb(255,128,0)" + style + align, offset * factor, -offset);
162
163 op.clear();
164 op += bg::operation_char(it->operations[1].operation);
165 mapper.text(at_j ? qj : qk, op, "fill:rgb(255,128,0)" + style + align, offset * factor, -offset);
166
167 // Map intersection point + method
168 mapper.map(it->point, "opacity:0.8;fill:rgb(255,0,0);stroke:rgb(0,0,100);stroke-width:1");
169
170 op.clear();
171 op += bg::method_char(it->method);
172 op += ' ';
173 op += (it->touch_only ? 'o' : '*');
174 if (info.size() != 1)
175 {
176 op += ch;
177 op += " p:"; op += bg::operation_char(it->operations[0].operation);
178 op += " q:"; op += bg::operation_char(it->operations[1].operation);
179 }
180 mapper.text(it->point, op, "fill:rgb(255,0,0)" + style, offset, -offset);
181 }
182 }
183 #endif
184
185 }
186
187 template <typename P, typename T>
188 void test_both(std::string const& caseid,
189 T pi_x, T pi_y, T pj_x, T pj_y, T pk_x, T pk_y,
190 T qi_x, T qi_y, T qj_x, T qj_y, T qk_x, T qk_y,
191 bg::detail::overlay::method_type method
192 = bg::detail::overlay::method_none,
193 bool expected_touch_only = false,
194 T ip_x = -1, T ip_y = -1,
195 std::string const& expected = "",
196 T ip_x2 = -1, T ip_y2 = -1)
197 {
198 test_with_point<P, double>(caseid,
199 pi_x, pi_y, pj_x, pj_y, pk_x, pk_y,
200 qi_x, qi_y, qj_x, qj_y, qk_x, qk_y,
201 method, expected_touch_only, ip_x, ip_y, expected, ip_x2, ip_y2);
202
203 std::string reversed(expected.rbegin(), expected.rend());
204
205 if (ip_x2 >= 0 && ip_y2 >= 0)
206 {
207 std::swap(ip_x, ip_x2);
208 std::swap(ip_y, ip_y2);
209 }
210
211 test_with_point<P, double>(caseid + "_r",
212 qi_x, qi_y, qj_x, qj_y, qk_x, qk_y, // q
213 pi_x, pi_y, pj_x, pj_y, pk_x, pk_y, // p
214 method, expected_touch_only, ip_x, ip_y, reversed, ip_x2, ip_y2);
215 }
216
217
218 template <typename P>
219 void test_all()
220 {
221 using namespace bg::detail::overlay;
222
223 // See powerpoint "doc/testcases/get_turn_info.ppt"
224
225
226 // ------------------------------------------------------------------------
227 // "Real" intersections ("i"), or, crossing
228 // ------------------------------------------------------------------------
229 test_both<P, double>("il1",
230 5, 1, 5, 6, 7, 8, // p
231 3, 3, 7, 5, 8, 3, // q
232 method_crosses, false, 5, 4, "ui");
233
234 test_both<P, double>("il2",
235 5, 1, 5, 6, 7, 8, // p
236 3, 5, 7, 5, 3, 3, // q
237 method_crosses, false, 5, 5, "ui");
238
239 test_both<P, double>("il3",
240 5, 1, 5, 6, 7, 8, // p
241 3, 3, 7, 5, 3, 5, // q
242 method_crosses, false, 5, 4, "ui");
243
244 test_both<P, double>("il4",
245 5, 1, 5, 6, 7, 8, // p
246 3, 3, 7, 5, 4, 8, // q
247 method_crosses, false, 5, 4, "ui");
248
249 test_both<P, double>("ir1",
250 5, 1, 5, 6, 7, 8, // p
251 7, 5, 3, 3, 2, 5, // q
252 method_crosses, false, 5, 4, "iu");
253
254
255 // ------------------------------------------------------------------------
256 // TOUCH INTERIOR or touch in the middle ("m")
257 // ------------------------------------------------------------------------
258 test_both<P, double>("ml1",
259 5, 1, 5, 6, 7, 8, // p
260 3, 3, 5, 4, 7, 3, // q
261 method_touch_interior, false, 5, 4, "ui");
262
263 test_both<P, double>("ml2",
264 5, 1, 5, 6, 7, 8, // p
265 3, 3, 5, 4, 3, 6, // q
266 method_touch_interior, true, 5, 4, "iu");
267
268 test_both<P, double>("ml3",
269 5, 1, 5, 6, 7, 8, // p
270 3, 6, 5, 4, 3, 3, // q
271 method_touch_interior, true, 5, 4, "uu");
272
273 test_both<P, double>("mr1",
274 5, 1, 5, 6, 7, 8, // p
275 7, 3, 5, 4, 3, 3, // q
276 method_touch_interior, false, 5, 4, "iu");
277
278 test_both<P, double>("mr2",
279 5, 1, 5, 6, 7, 8, // p
280 7, 3, 5, 4, 7, 6, // q
281 method_touch_interior, true, 5, 4, "ui");
282
283 test_both<P, double>("mr3",
284 5, 1, 5, 6, 7, 8, // p
285 7, 6, 5, 4, 7, 3, // q
286 method_touch_interior, true, 5, 4, "ii");
287
288 test_both<P, double>("mcl",
289 5, 1, 5, 6, 7, 8, // p
290 3, 2, 5, 3, 5, 5, // q
291 method_touch_interior, false, 5, 3, "cc");
292
293 test_both<P, double>("mcr",
294 5, 1, 5, 6, 7, 8, // p
295 7, 2, 5, 3, 5, 5, // q
296 method_touch_interior, false, 5, 3, "cc");
297
298 test_both<P, double>("mclo",
299 5, 1, 5, 6, 7, 8, // p
300 3, 4, 5, 5, 5, 3, // q
301 method_touch_interior, false, 5, 5, "ux");
302
303 test_both<P, double>("mcro",
304 5, 1, 5, 6, 7, 8, // p
305 7, 4, 5, 5, 5, 3, // q
306 method_touch_interior, false, 5, 5, "ix");
307
308 // ------------------------------------------------------------------------
309 // COLLINEAR
310 // ------------------------------------------------------------------------
311 test_both<P, double>("cll1",
312 5, 1, 5, 6, 3, 8, // p
313 5, 5, 5, 7, 3, 8, // q
314 method_collinear, false, 5, 6, "ui");
315 test_both<P, double>("cll2",
316 5, 1, 5, 6, 3, 8, // p
317 5, 3, 5, 5, 3, 6, // q
318 method_collinear, false, 5, 5, "iu");
319 test_both<P, double>("clr1",
320 5, 1, 5, 6, 3, 8, // p
321 5, 5, 5, 7, 6, 8, // q
322 method_collinear, false, 5, 6, "ui");
323 test_both<P, double>("clr2",
324 5, 1, 5, 6, 3, 8, // p
325 5, 3, 5, 5, 6, 6, // q
326 method_collinear, false, 5, 5, "ui");
327
328 test_both<P, double>("crl1",
329 5, 1, 5, 6, 7, 8, // p
330 5, 5, 5, 7, 3, 8, // q
331 method_collinear, false, 5, 6, "iu");
332 test_both<P, double>("crl2",
333 5, 1, 5, 6, 7, 8, // p
334 5, 3, 5, 5, 3, 6, // q
335 method_collinear, false, 5, 5, "iu");
336 test_both<P, double>("crr1",
337 5, 1, 5, 6, 7, 8, // p
338 5, 5, 5, 7, 6, 8, // q
339 method_collinear, false, 5, 6, "iu");
340 test_both<P, double>("crr2",
341 5, 1, 5, 6, 7, 8, // p
342 5, 3, 5, 5, 6, 6, // q
343 method_collinear, false, 5, 5, "ui");
344
345 // The next two cases are changed (BSG 2013-09-24), they contain turn info (#buffer_rt_g)
346 // In new approach they are changed back (BSG 2013-10-20)
347 test_both<P, double>("ccx1",
348 5, 1, 5, 6, 5, 8, // p
349 5, 5, 5, 7, 3, 8, // q
350 method_collinear, false, 5, 6, "cc"); // "iu");
351 test_both<P, double>("cxc1",
352 5, 1, 5, 6, 7, 8, // p
353 5, 3, 5, 5, 5, 7, // q
354 method_collinear, false, 5, 5, "cc"); // "iu");
355
356 // Bug in case #54 of "overlay_cases.hpp"
357 test_both<P, double>("c_bug1",
358 5, 0, 2, 0, 2, 2, // p
359 4, 0, 1, 0, 1, 2, // q
360 method_collinear, false, 2, 0, "iu");
361
362
363 // ------------------------------------------------------------------------
364 // COLLINEAR OPPOSITE
365 // ------------------------------------------------------------------------
366
367 test_both<P, double>("clo1",
368 5, 2, 5, 6, 3, 8, // p
369 5, 7, 5, 5, 3, 3, // q
370 method_collinear, false, 5, 6, "ixxu", 5, 5);
371 test_both<P, double>("clo2",
372 5, 2, 5, 6, 3, 8, // p
373 5, 7, 5, 5, 5, 2, // q
374 method_collinear, false, 5, 6, "ix");
375 // actually "xxix", xx is skipped everywhere
376 test_both<P, double>("clo3",
377 5, 2, 5, 6, 3, 8, // p
378 5, 7, 5, 5, 7, 3, // q
379 method_collinear, false, 5, 6, "ixxi", 5, 5);
380
381 test_both<P, double>("cco1",
382 5, 2, 5, 6, 5, 8, // p
383 5, 7, 5, 5, 3, 3, // q
384 method_collinear, false, 5, 5, "xu"); // "xuxx"
385 test_both<P, double>("cco2",
386 5, 2, 5, 6, 5, 8, // p
387 5, 7, 5, 5, 5, 2); // q "xxxx"
388 test_both<P, double>("cco3",
389 5, 2, 5, 6, 5, 8, // p
390 5, 7, 5, 5, 7, 3, // q
391 method_collinear, false, 5, 5, "xi"); // "xixx"
392
393
394 test_both<P, double>("cro1",
395 5, 2, 5, 6, 7, 8, // p
396 5, 7, 5, 5, 3, 3, // q
397 method_collinear, false, 5, 6, "uxxu", 5, 5);
398 test_both<P, double>("cro2",
399 5, 2, 5, 6, 7, 8, // p
400 5, 7, 5, 5, 5, 2, // q
401 method_collinear, false, 5, 6, "ux"); // "xxux"
402 test_both<P, double>("cro3",
403 5, 2, 5, 6, 7, 8, // p
404 5, 7, 5, 5, 7, 3, // q
405 method_collinear, false, 5, 6, "uxxi", 5, 5);
406
407 test_both<P, double>("cxo1",
408 5, 2, 5, 6, 3, 8, // p
409 5, 5, 5, 3, 3, 1, // q
410 method_collinear, false, 5, 3, "xu");
411 test_both<P, double>("cxo2",
412 5, 2, 5, 6, 3, 8, // p
413 5, 5, 5, 3, 5, 0); // q "xx"
414 test_both<P, double>("cxo3",
415 5, 2, 5, 6, 3, 8, // p
416 5, 5, 5, 3, 7, 1, // q
417 method_collinear, false, 5, 3, "xi");
418
419 test_both<P, double>("cxo4",
420 5, 2, 5, 6, 3, 8, // p
421 5, 7, 5, 1, 3, 0, // q
422 method_collinear, false, 5, 6, "ix");
423 test_both<P, double>("cxo5",
424 5, 2, 5, 6, 5, 8, // p
425 5, 7, 5, 1, 3, 0); // q "xx"
426 test_both<P, double>("cxo6",
427 5, 2, 5, 6, 7, 8, // p
428 5, 7, 5, 1, 3, 0, // q
429 method_collinear, false, 5, 6, "ux");
430
431
432 // Verify
433 test_both<P, double>("cvo1",
434 5, 3, 5, 7, 7, 9, // p
435 5, 5, 5, 3, 3, 1 // q
436 );
437 test_both<P, double>("cvo2",
438 5, 3, 5, 7, 7, 9, // p
439 5, 4, 5, 2, 3, 0 // q
440 );
441
442
443 // ------------------------------------------------------------------------
444 // TOUCH - both same
445 // ------------------------------------------------------------------------
446 // Both left, Q turns right
447 test_both<P, double>("blr1",
448 5, 1, 5, 6, 4, 4, // p
449 3, 7, 5, 6, 3, 5, // q
450 method_touch, true, 5, 6, "ui");
451 test_both<P, double>("blr2",
452 5, 1, 5, 6, 1, 4, // p
453 3, 7, 5, 6, 3, 5, // q
454 method_touch, false, 5, 6, "cc");
455 test_both<P, double>("blr3",
456 5, 1, 5, 6, 3, 6, // p
457 3, 7, 5, 6, 3, 5, // q
458 method_touch, false, 5, 6, "iu");
459 test_both<P, double>("blr4",
460 5, 1, 5, 6, 1, 8, // p
461 3, 7, 5, 6, 3, 5, // q
462 method_touch, false, 5, 6, "xu");
463 test_both<P, double>("blr5",
464 5, 1, 5, 6, 4, 8, // p
465 3, 7, 5, 6, 3, 5, // q
466 method_touch, true, 5, 6, "uu");
467 test_both<P, double>("blr6",
468 5, 1, 5, 6, 6, 4, // p
469 3, 7, 5, 6, 3, 5, // q
470 method_touch, true, 5, 6, "uu");
471
472 test_both<P, double>("blr7",
473 5, 1, 5, 6, 3, 6, // p
474 3, 7, 5, 6, 5, 3, // q
475 method_touch, false, 5, 6, "ix");
476 test_both<P, double>("blr8",
477 5, 1, 5, 6, 3, 6, // p
478 3, 6, 5, 6, 5, 3, // q
479 method_touch, false, 5, 6, "xx");
480 test_both<P, double>("blr9",
481 5, 1, 5, 6, 3, 6, // p
482 3, 5, 5, 6, 5, 3, // q
483 method_touch, false, 5, 6, "ux");
484
485 // Variants
486 test_both<P, double>("blr7-a",
487 5, 1, 5, 6, 3, 6, // p
488 5, 8, 5, 6, 5, 3, // q
489 method_touch, false, 5, 6, "ix");
490 test_both<P, double>("blr7-b", // in fact NOT "both-left"
491 5, 1, 5, 6, 3, 6, // p
492 6, 8, 5, 6, 5, 3, // q
493 method_touch, false, 5, 6, "ix");
494
495 // To check if "collinear-check" on other side
496 // does not apply to this side
497 test_both<P, double>("blr6-c1",
498 5, 1, 5, 6, 7, 5, // p
499 3, 7, 5, 6, 3, 5, // q
500 method_touch, true, 5, 6, "uu");
501 test_both<P, double>("blr6-c2",
502 5, 1, 5, 6, 7, 7, // p
503 3, 7, 5, 6, 3, 5, // q
504 method_touch, true, 5, 6, "uu");
505
506
507
508 // Both right, Q turns right
509 test_both<P, double>("brr1",
510 5, 1, 5, 6, 6, 4, // p
511 7, 5, 5, 6, 7, 7, // q
512 method_touch, true, 5, 6, "uu");
513 test_both<P, double>("brr2",
514 5, 1, 5, 6, 9, 4, // p
515 7, 5, 5, 6, 7, 7, // q
516 method_touch, false, 5, 6, "xu");
517 test_both<P, double>("brr3",
518 5, 1, 5, 6, 7, 6, // p
519 7, 5, 5, 6, 7, 7, // q
520 method_touch, false, 5, 6, "iu");
521 test_both<P, double>("brr4",
522 5, 1, 5, 6, 9, 8, // p
523 7, 5, 5, 6, 7, 7, // q
524 method_touch, false, 5, 6, "cc");
525 test_both<P, double>("brr5",
526 5, 1, 5, 6, 6, 8, // p
527 7, 5, 5, 6, 7, 7, // q
528 method_touch, true, 5, 6, "ui");
529 test_both<P, double>("brr6",
530 5, 1, 5, 6, 4, 4, // p
531 7, 5, 5, 6, 7, 7, // q
532 method_touch, true, 5, 6, "ui");
533
534 // Both right, Q turns left
535 test_both<P, double>("brl1",
536 5, 1, 5, 6, 6, 4, // p
537 7, 7, 5, 6, 7, 5, // q
538 method_touch, true, 5, 6, "iu");
539 test_both<P, double>("brl2",
540 5, 1, 5, 6, 9, 4, // p
541 7, 7, 5, 6, 7, 5, // q
542 method_touch, false, 5, 6, "cc");
543 test_both<P, double>("brl3",
544 5, 1, 5, 6, 7, 6, // p
545 7, 7, 5, 6, 7, 5, // q
546 method_touch, false, 5, 6, "ui");
547 test_both<P, double>("brl4",
548 5, 1, 5, 6, 9, 8, // p
549 7, 7, 5, 6, 7, 5, // q
550 method_touch, false, 5, 6, "xi");
551 test_both<P, double>("brl5",
552 5, 1, 5, 6, 6, 8, // p
553 7, 7, 5, 6, 7, 5, // q
554 method_touch, true, 5, 6, "ii");
555 test_both<P, double>("brl6",
556 5, 1, 5, 6, 4, 4, // p
557 7, 7, 5, 6, 7, 5, // q
558 method_touch, true, 5, 6, "ii");
559 test_both<P, double>("brl7",
560 5, 1, 5, 6, 7, 6, // p
561 7, 7, 5, 6, 5, 3, // q
562 method_touch, false, 5, 6, "ux");
563 test_both<P, double>("brl8",
564 5, 1, 5, 6, 7, 6, // p
565 7, 6, 5, 6, 5, 3, // q
566 method_touch, false, 5, 6, "xx");
567 test_both<P, double>("brl9",
568 5, 1, 5, 6, 7, 6, // p
569 7, 5, 5, 6, 5, 3, // q
570 method_touch, false, 5, 6, "ix");
571
572 // Variants
573 test_both<P, double>("brl7-a",
574 5, 1, 5, 6, 7, 6, // p
575 5, 8, 5, 6, 5, 3, // q
576 method_touch, false, 5, 6, "ux");
577 test_both<P, double>("brl7-b", // in fact NOT "both right"
578 5, 1, 5, 6, 7, 6, // p
579 4, 8, 5, 6, 5, 3, // q
580 method_touch, false, 5, 6, "ux");
581
582
583
584 // Both left, Q turns left
585 test_both<P, double>("bll1",
586 5, 1, 5, 6, 4, 4, // p
587 3, 5, 5, 6, 3, 7, // q
588 method_touch, true, 5, 6, "ii");
589 test_both<P, double>("bll2",
590 5, 1, 5, 6, 1, 4, // p
591 3, 5, 5, 6, 3, 7, // q
592 method_touch, false, 5, 6, "xi");
593 test_both<P, double>("bll3",
594 5, 1, 5, 6, 3, 6, // p
595 3, 5, 5, 6, 3, 7, // q
596 method_touch, false, 5, 6, "ui");
597 test_both<P, double>("bll4",
598 5, 1, 5, 6, 1, 8, // p
599 3, 5, 5, 6, 3, 7, // q
600 method_touch, false, 5, 6, "cc");
601 test_both<P, double>("bll5",
602 5, 1, 5, 6, 4, 8, // p
603 3, 5, 5, 6, 3, 7, // q
604 method_touch, true, 5, 6, "iu");
605 test_both<P, double>("bll6",
606 5, 1, 5, 6, 6, 4, // p
607 3, 5, 5, 6, 3, 7, // q
608 method_touch, true, 5, 6, "iu");
609
610 // TOUCH - COLLINEAR + one side
611 // Collinear/left, Q turns right
612 test_both<P, double>("t-clr1",
613 5, 1, 5, 6, 4, 4, // p
614 5, 8, 5, 6, 3, 5, // q
615 method_touch, true, 5, 6, "ui");
616 test_both<P, double>("t-clr2",
617 5, 1, 5, 6, 1, 4, // p
618 5, 8, 5, 6, 3, 5, // q
619 method_touch, false, 5, 6, "cc");
620 test_both<P, double>("t-clr3",
621 5, 1, 5, 6, 3, 6, // p
622 5, 8, 5, 6, 3, 5, // q
623 method_touch, false, 5, 6, "iu");
624 test_both<P, double>("t-clr4",
625 5, 1, 5, 6, 5, 8, // p
626 5, 8, 5, 6, 3, 5, // q
627 method_touch, false, 5, 6, "xu");
628 // 5 n.a.
629 test_both<P, double>("t-clr6",
630 5, 1, 5, 6, 6, 4, // p
631 5, 8, 5, 6, 3, 5, // q
632 method_touch, true, 5, 6, "uu");
633
634 // Collinear/right, Q turns right
635 test_both<P, double>("t-crr1",
636 5, 1, 5, 6, 6, 4, // p
637 7, 5, 5, 6, 5, 8, // q
638 method_touch, true, 5, 6, "uu");
639 test_both<P, double>("t-crr2",
640 5, 1, 5, 6, 9, 4, // p
641 7, 5, 5, 6, 5, 8, // q
642 method_touch, false, 5, 6, "xu");
643 test_both<P, double>("t-crr3",
644 5, 1, 5, 6, 7, 6, // p
645 7, 5, 5, 6, 5, 8, // q
646 method_touch, false, 5, 6, "iu");
647 test_both<P, double>("t-crr4",
648 5, 1, 5, 6, 5, 9, // p
649 7, 5, 5, 6, 5, 8, // q
650 method_touch, false, 5, 6, "cc");
651 // 5 n.a.
652 test_both<P, double>("t-crr6",
653 5, 1, 5, 6, 4, 4, // p
654 7, 5, 5, 6, 5, 8, // q
655 method_touch, true, 5, 6, "ui");
656
657 // Collinear/right, Q turns left
658 test_both<P, double>("t-crl1",
659 5, 1, 5, 6, 6, 4, // p
660 5, 7, 5, 6, 7, 5, // q
661 method_touch, true, 5, 6, "iu");
662 test_both<P, double>("t-crl2",
663 5, 1, 5, 6, 9, 4, // p
664 5, 7, 5, 6, 7, 5, // q
665 method_touch, false, 5, 6, "cc");
666 test_both<P, double>("t-crl3",
667 5, 1, 5, 6, 7, 6, // p
668 5, 7, 5, 6, 7, 5, // q
669 method_touch, false, 5, 6, "ui");
670 test_both<P, double>("t-crl4",
671 5, 1, 5, 6, 5, 8, // p
672 5, 7, 5, 6, 7, 5, // q
673 method_touch, false, 5, 6, "xi");
674 // 5 n.a.
675 test_both<P, double>("t-crl6",
676 5, 1, 5, 6, 4, 4, // p
677 5, 7, 5, 6, 7, 5, // q
678 method_touch, true, 5, 6, "ii");
679
680 // Collinear/left, Q turns left
681 test_both<P, double>("t-cll1",
682 5, 1, 5, 6, 4, 4, // p
683 3, 5, 5, 6, 5, 8, // q
684 method_touch, true, 5, 6, "ii");
685 test_both<P, double>("t-cll2",
686 5, 1, 5, 6, 1, 4, // p
687 3, 5, 5, 6, 5, 8, // q
688 method_touch, false, 5, 6, "xi");
689 test_both<P, double>("t-cll3",
690 5, 1, 5, 6, 3, 6, // p
691 3, 5, 5, 6, 5, 8, // q
692 method_touch, false, 5, 6, "ui");
693 test_both<P, double>("t-cll4",
694 5, 1, 5, 6, 5, 9, // p
695 3, 5, 5, 6, 5, 8, // q
696 method_touch, false, 5, 6, "cc");
697 // 5 n.a.
698 test_both<P, double>("t-cll6",
699 5, 1, 5, 6, 6, 4, // p
700 3, 5, 5, 6, 5, 8, // q
701 method_touch, true, 5, 6, "iu");
702
703 // Left to right
704 test_both<P, double>("lr1",
705 5, 1, 5, 6, 3, 3, // p
706 1, 5, 5, 6, 9, 5, // q
707 method_touch, true, 5, 6, "ii");
708 test_both<P, double>("lr2",
709 5, 1, 5, 6, 1, 5, // p
710 1, 5, 5, 6, 9, 5, // q
711 method_touch, false, 5, 6, "xi");
712 test_both<P, double>("lr3",
713 5, 1, 5, 6, 4, 8, // p
714 1, 5, 5, 6, 9, 5, // q
715 method_touch, false, 5, 6, "ui");
716 test_both<P, double>("lr4",
717 5, 1, 5, 6, 9, 5, // p
718 1, 5, 5, 6, 9, 5, // q
719 method_touch, false, 5, 6, "cc");
720 test_both<P, double>("lr5",
721 5, 1, 5, 6, 7, 3, // p
722 1, 5, 5, 6, 9, 5, // q
723 method_touch, true, 5, 6, "iu");
724 // otherwise case more thoroughly
725 test_both<P, double>("lr3a",
726 5, 1, 5, 6, 1, 6, // p
727 1, 5, 5, 6, 9, 5, // q
728 method_touch, false, 5, 6, "ui");
729 test_both<P, double>("lr3b",
730 5, 1, 5, 6, 5, 10, // p
731 1, 5, 5, 6, 9, 5, // q
732 method_touch, false, 5, 6, "ui");
733 test_both<P, double>("lr3c",
734 5, 1, 5, 6, 8, 9, // p
735 1, 5, 5, 6, 9, 5, // q
736 method_touch, false, 5, 6, "ui");
737 test_both<P, double>("lr3d",
738 5, 1, 5, 6, 9, 7, // p
739 1, 5, 5, 6, 9, 5, // q
740 method_touch, false, 5, 6, "ui");
741 test_both<P, double>("lr3e",
742 5, 1, 5, 6, 9, 6, // p
743 1, 5, 5, 6, 9, 5, // q
744 method_touch, false, 5, 6, "ui");
745
746 // Right to left
747 test_both<P, double>("rl1",
748 5, 1, 5, 6, 3, 3, // p
749 9, 5, 5, 6, 1, 5, // q
750 method_touch, true, 5, 6, "ui");
751 test_both<P, double>("rl2",
752 5, 1, 5, 6, 1, 5, // p
753 9, 5, 5, 6, 1, 5, // q
754 method_touch, false, 5, 6, "cc");
755 test_both<P, double>("rl3",
756 5, 1, 5, 6, 4, 8, // p
757 9, 5, 5, 6, 1, 5, // q
758 method_touch, false, 5, 6, "iu");
759 test_both<P, double>("rl4",
760 5, 1, 5, 6, 9, 5, // p
761 9, 5, 5, 6, 1, 5, // q
762 method_touch, false, 5, 6, "xu");
763 test_both<P, double>("rl5",
764 5, 1, 5, 6, 7, 3, // p
765 9, 5, 5, 6, 1, 5, // q
766 method_touch, true, 5, 6, "uu");
767
768 // Equal (p1/q1 are equal)
769 test_both<P, double>("ebl1",
770 5, 1, 5, 6, 3, 4, // p
771 5, 1, 5, 6, 3, 8, // q
772 method_equal, false, 5, 6, "ui");
773 test_both<P, double>("ebl2",
774 5, 1, 5, 6, 3, 8, // p
775 5, 1, 5, 6, 3, 4, // q
776 method_equal, false, 5, 6, "iu");
777 test_both<P, double>("ebl3",
778 5, 1, 5, 6, 3, 8, // p
779 5, 1, 5, 6, 3, 8, // q
780 method_equal, false, 5, 6, "cc");
781
782 test_both<P, double>("ebl3-c1",
783 5, 1, 5, 6, 10, 1, // p
784 5, 1, 5, 6, 3, 8, // q
785 method_equal, false, 5, 6, "iu");
786
787 test_both<P, double>("ebr1",
788 5, 1, 5, 6, 7, 4, // p
789 5, 1, 5, 6, 7, 8, // q
790 method_equal, false, 5, 6, "iu");
791 test_both<P, double>("ebr2",
792 5, 1, 5, 6, 7, 8, // p
793 5, 1, 5, 6, 7, 4, // q
794 method_equal, false, 5, 6, "ui");
795 test_both<P, double>("ebr3",
796 5, 1, 5, 6, 7, 8, // p
797 5, 1, 5, 6, 7, 8, // q
798 method_equal, false, 5, 6, "cc");
799
800 test_both<P, double>("ebr3-c1",
801 5, 1, 5, 6, 0, 1, // p
802 5, 1, 5, 6, 7, 8, // q
803 method_equal, false, 5, 6, "ui");
804
805 test_both<P, double>("elr1",
806 5, 1, 5, 6, 7, 8, // p
807 5, 1, 5, 6, 3, 8, // q
808 method_equal, false, 5, 6, "iu");
809 test_both<P, double>("elr2",
810 5, 1, 5, 6, 3, 8, // p
811 5, 1, 5, 6, 7, 8, // q
812 method_equal, false, 5, 6, "ui");
813 test_both<P, double>("ec1",
814 5, 1, 5, 6, 5, 8, // p
815 5, 1, 5, 6, 5, 8, // q
816 method_equal, false, 5, 6, "cc");
817 test_both<P, double>("ec2",
818 5, 1, 5, 6, 5, 8, // p
819 5, 1, 5, 6, 5, 7, // q
820 method_equal, false, 5, 6, "cc");
821
822 test_both<P, double>("snl-1",
823 0, 3, 2, 3, 4, 3, // p
824 4, 3, 2, 3, 0, 3, // q
825 method_touch, false, 2, 3, "xx");
826
827 // BSG 2012-05-26 to be decided what's the problem here and what it tests...
828 // Anyway, test results are not filled out.
829 //test_both<P, double>("issue_buffer_mill",
830 // 5.1983614873206241 , 6.7259025813913107 , 5.0499999999999998 , 6.4291796067500622 , 5.1983614873206241 , 6.7259025813913107, // p
831 // 5.0499999999999998 , 6.4291796067500622 , 5.0499999999999998 , 6.4291796067500622 , 5.1983614873206241 , 6.7259025813913107, // q
832 // method_collinear, false, 2, 0, "tt");
833
834 }
835
836
837 /***
838 #include <boost/geometry/geometries/adapted/c_array.hpp>
839 BOOST_GEOMETRY_REGISTER_C_ARRAY_CS(cs::cartesian)
840
841 template <typename G>
842 void test2(G const& geometry)
843 {
844 typedef typename bg::point_type<G>::type P;
845 typedef typename bg::tag<G>::type T;
846 typedef typename bg::tag<P>::type PT;
847 std::cout << typeid(G).name() << std::endl;
848 std::cout << typeid(T).name() << std::endl;
849 std::cout << typeid(P).name() << std::endl;
850 std::cout << typeid(PT).name() << std::endl;
851
852
853 std::cout << bg::length(geometry) << std::endl;
854
855 typedef bg::model::point<float, 3, bg::cs::cartesian> P2;
856 bg::model::linestring<P2> out;
857 bg::strategy::transform::scale_transformer<float[3], P2> scaler(5);
858 bg::transform(geometry, out, scaler);
859 std::cout << bg::dsv(out) << std::endl;
860 }
861
862 void test_f3()
863 {
864 float vertices[][3] = {
865 {-1, -1, 1}, {1, -1, 1}, {1, 1, 1}, {-1, 1, 1},
866 {-1, -1, -1}, {1, -1, -1}, {1, 1, -1}, {-1, 1, -1}
867 };
868 test2(vertices);
869 }
870 ***/
871
872 int test_main(int, char* [])
873 {
874 test_all<bg::model::d2::point_xy<double> >();
875 return 0;
876 }