• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Boost.Geometry
2 // Unit Test
3 
4 // Copyright (c) 2016-2018, Oracle and/or its affiliates.
5 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
6 
7 // Use, modification and distribution is subject to the Boost Software License,
8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 
11 
12 #include "segment_intersection_geo.hpp"
13 
14 
15 template <typename T>
test_geographic()16 void test_geographic()
17 {
18     typedef bg::model::point<double, 2, bg::cs::geographic<bg::degree> > point_t;
19     typedef bg::model::segment<point_t> segment_t;
20 
21     test_all_strategies<segment_t, point_t>(
22         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -2, -1 -1)", 'a', "POINT(-1 -1)");
23     test_all_strategies<segment_t, point_t>(
24         "SEGMENT(-1 -2, 1 1)", "SEGMENT(-1 -2, -1 -1)", 'f', "POINT(-1 -2)");
25     test_all_strategies<segment_t, point_t>(
26         "SEGMENT(1 1, -1 -1)", "SEGMENT(-1 -2, -1 -1)", 't', "POINT(-1 -1)");
27     test_all_strategies<segment_t, point_t>(
28         "SEGMENT(1 1, -1 -2)", "SEGMENT(-1 -2, -1 -1)", 'a', "POINT(-1 -2)");
29     test_all_strategies<segment_t, point_t>(
30         "SEGMENT(-1 -2, -1 -1)", "SEGMENT(-1 -1, 1 1)", 'a', "POINT(-1 -1)");
31     test_all_strategies<segment_t, point_t>(
32         "SEGMENT(-1 -2, -1 -1)", "SEGMENT(-1 -2, 1 1)", 'f', "POINT(-1 -2)");
33     test_all_strategies<segment_t, point_t>(
34         "SEGMENT(-1 -2, -1 -1)", "SEGMENT(1 1, -1 -1)", 't', "POINT(-1 -1)");
35     test_all_strategies<segment_t, point_t>(
36         "SEGMENT(-1 -2, -1 -1)", "SEGMENT(1 1, -1 -2)", 'a', "POINT(-1 -2)");
37 
38     test_strategies<segment_t, point_t>(
39         "SEGMENT(-1 -2, -1 2)", "SEGMENT(-2 -2, 2 2)",
40         great_elliptic('i', "POINT(-1 -1.000457053724121)"),
41         geodesic_vincenty('i', "POINT(-1 -1.000459099991114)"),
42         geodesic_andoyer('i', "POINT(-1 -1.000453510849886)"));
43     test_strategies<segment_t, point_t>(
44         "SEGMENT(-2 -2, 2 2)", "SEGMENT(-1 -2, -1 2)",
45         great_elliptic('i', "POINT(-1 -1.000457053724121)"),
46         geodesic_vincenty('i', "POINT(-1 -1.000459099991114)"),
47         geodesic_andoyer('i', "POINT(-1 -1.000453510849886)"));
48 
49     // crossing   X
50     test_strategies<segment_t, point_t>(
51         "SEGMENT(-45 -45, 45 45)", "SEGMENT(-45 45, 45 -45)",
52         great_elliptic('i', "POINT(0 0)"),
53         geodesic_vincenty('i', "POINT(0.000000001380087204053 -0.0000000000000063611)"),
54         geodesic_andoyer('i', "POINT(0 0.0003512140328446071)"));
55     test_strategies<segment_t, point_t>(
56         "SEGMENT(-45 -45, 45 45)", "SEGMENT(45 -45, -45 45)",
57         great_elliptic('i', "POINT(0 0)"),
58         geodesic_vincenty('i', "POINT(0.000000001380087204053 -0.0000000000000063611)"),
59         geodesic_andoyer('i', "POINT(0 0.0003512140328446071)"));
60     test_strategies<segment_t, point_t>(
61         "SEGMENT(45 45, -45 -45)", "SEGMENT(-45 45, 45 -45)",
62         great_elliptic('i', "POINT(0 0)"),
63         geodesic_vincenty('i', "POINT(0.000000001380087204053 -0.0000000000000063611)"),
64         geodesic_andoyer('i', "POINT(0 0.0003512140328446071)"));
65     test_strategies<segment_t, point_t>(
66         "SEGMENT(45 45, -45 -45)", "SEGMENT(45 -45, -45 45)",
67         great_elliptic('i', "POINT(0 0)"),
68         geodesic_vincenty('i', "POINT(0.000000001380087204053 -0.0000000000000063611)"),
69         geodesic_andoyer('i', "POINT(0 0.0003512140328446071)"));
70 
71     // crossing   X
72     test_strategies<segment_t, point_t>(
73         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 1, 1 -1)",
74         great_elliptic('i', "POINT(0 0)"),
75         geodesic_vincenty('i', "POINT(0.000000000000000596354 -0.0000000000626626779)"),
76         geodesic_andoyer('i', "POINT(-0.000000000000000596354 0.0000055787431347552)"));
77     test_strategies<segment_t, point_t>(
78         "SEGMENT(-1 -1, 1 1)", "SEGMENT(1 -1, -1 1)",
79         great_elliptic('i', "POINT(0 0)"),
80         geodesic_vincenty('i', "POINT(0.000000000000000596354 -0.0000000000626626779)"),
81         geodesic_andoyer('i', "POINT(-0.000000000000000596354 0.0000055787431347552)"));
82     test_strategies<segment_t, point_t>(
83         "SEGMENT(1 1, -1 -1)", "SEGMENT(-1 1, 1 -1)",
84         great_elliptic('i', "POINT(0 0)"),
85         geodesic_vincenty('i', "POINT(0.000000000000000596354 -0.0000000000626626779)"),
86         geodesic_andoyer('i', "POINT(-0.000000000000000596354 0.0000055787431347552)"));
87     test_strategies<segment_t, point_t>(
88         "SEGMENT(1 1, -1 -1)", "SEGMENT(1 -1, -1 1)",
89         great_elliptic('i', "POINT(0 0)"),
90         geodesic_vincenty('i', "POINT(0.000000000000000596354 -0.0000000000626626779)"),
91         geodesic_andoyer('i', "POINT(-0.000000000000000596354 0.0000055787431347552)"));
92 
93     // equal
94     //   //
95     test_all_strategies<segment_t, point_t>(
96         "SEGMENT(-45 -45, 45 45)", "SEGMENT(-45 -45, 45 45)", 'e', "POINT(-45 -45)", "POINT(45 45)", false);
97     //   //
98     test_all_strategies<segment_t, point_t>(
99         "SEGMENT(-45 -45, 45 45)", "SEGMENT(45 45, -45 -45)", 'e', "POINT(-45 -45)", "POINT(45 45)", true);
100 
101     // starting outside s1
102     //    /
103     //   |
104     test_all_strategies<segment_t, point_t>(
105         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, -1 -1)", 'a', "POINT(-1 -1)");
106     //   /
107     //  /|
108     test_all_strategies<segment_t, point_t>(
109         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, 0 0)", 'm', "POINT(0 0)");
110     //   /|
111     //  / |
112     test_all_strategies<segment_t, point_t>(
113         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, 1 1)", 't', "POINT(1 1)");
114     //   |/
115     //  /|
116     test_strategies<segment_t, point_t>(
117         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, 2 2)",
118         great_elliptic('i', "POINT(0 0)"),
119         geodesic_vincenty('i', "POINT(0.00000013628420059 0.00000013624239008)"),
120         geodesic_thomas('i', "POINT(-0.00004079969079346 -0.00004078714535240)"),
121         geodesic_andoyer('i', "POINT(-0.01217344899138908 -0.01216980051876599)"));
122     //       ------
123     // ------
124     test_all_strategies<segment_t, point_t>(
125         "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, -1 0)", 'a', "POINT(-1 0)");
126     //    ------
127     // ------
128     test_all_strategies<segment_t, point_t>(
129         "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, 0 0)", 'c', "POINT(-1 0)", "POINT(0 0)", false);
130     test_all_strategies<segment_t, point_t>(
131         "SEGMENT(-1 0, 1 0)", "SEGMENT(0 0, -2 0)", 'c', "POINT(-1 0)", "POINT(0 0)", true);
132     test_all_strategies<segment_t, point_t>(
133         "SEGMENT(1 0, -1 0)", "SEGMENT(-2 0, 0 0)", 'c', "POINT(0 0)", "POINT(-1 0)", true);
134     test_all_strategies<segment_t, point_t>(
135         "SEGMENT(1 0, -1 0)", "SEGMENT(0 0, -2 0)", 'c', "POINT(0 0)", "POINT(-1 0)", false);
136     //    ------
137     // ---------
138     test_all_strategies<segment_t, point_t>(
139         "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, 1 0)", 'c', "POINT(-1 0)", "POINT(1 0)", false);
140     test_all_strategies<segment_t, point_t>(
141         "SEGMENT(-1 0, 1 0)", "SEGMENT(1 0, -2 0)", 'c', "POINT(-1 0)", "POINT(1 0)", true);
142     test_all_strategies<segment_t, point_t>(
143         "SEGMENT(1 0, -1 0)", "SEGMENT(-2 0, 1 0)", 'c', "POINT(1 0)", "POINT(-1 0)", true);
144     test_all_strategies<segment_t, point_t>(
145         "SEGMENT(1 0, -1 0)", "SEGMENT(1 0, -2 0)", 'c', "POINT(1 0)", "POINT(-1 0)", false);
146     //    ------
147     // ------------
148     test_all_strategies<segment_t, point_t>(
149         "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, 2 0)", 'c', "POINT(-1 0)", "POINT(1 0)", false);
150 
151     // starting at s1
152     //  /
153     // //
154     test_all_strategies<segment_t, point_t>(
155         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -1, 0 0)", 'c', "POINT(-1 -1)", "POINT(0 0)", false);
156     //  //
157     // //
158     test_all_strategies<segment_t, point_t>(
159         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -1, 1 1)", 'e', "POINT(-1 -1)", "POINT(1 1)", false);
160     // | /
161     // |/
162     test_all_strategies<segment_t, point_t>(
163         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -1, 2 2)", 'f', "POINT(-1 -1)");
164     // ------
165     // ---
166     test_all_strategies<segment_t, point_t>(
167         "SEGMENT(-1 0, 1 0)", "SEGMENT(-1 0, 0 0)", 'c', "POINT(-1 0)", "POINT(0 0)", false);
168     // ------
169     // ------
170     test_all_strategies<segment_t, point_t>(
171         "SEGMENT(-1 0, 1 0)", "SEGMENT(-1 0, 1 0)", 'e', "POINT(-1 0)", "POINT(1 0)", false);
172     // ------
173     // ---------
174     test_all_strategies<segment_t, point_t>(
175         "SEGMENT(-1 0, 1 0)", "SEGMENT(-1 0, 2 0)", 'c', "POINT(-1 0)", "POINT(1 0)", false);
176 
177     // starting inside
178     //   //
179     //  /
180     test_all_strategies<segment_t, point_t>(
181         "SEGMENT(-1 -1, 1 1)", "SEGMENT(0 0, 1 1)", 'c', "POINT(0 0)", "POINT(1 1)", false);
182     test_all_strategies<segment_t, point_t>(
183         "SEGMENT(-1 -1, 1 1)", "SEGMENT(1 1, 0 0)", 'c', "POINT(0 0)", "POINT(1 1)", true);
184     test_all_strategies<segment_t, point_t>(
185         "SEGMENT(1 1, -1 -1)", "SEGMENT(0 0, 1 1)", 'c', "POINT(1 1)", "POINT(0 0)", true);
186     test_all_strategies<segment_t, point_t>(
187         "SEGMENT(1 1, -1 -1)", "SEGMENT(1 1, 0 0)", 'c', "POINT(1 1)", "POINT(0 0)", false);
188     test_all_strategies<segment_t, point_t>(
189         "SEGMENT(0 0, 1 1)", "SEGMENT(-1 -1, 1 1)", 'c', "POINT(0 0)", "POINT(1 1)", false);
190     test_all_strategies<segment_t, point_t>(
191         "SEGMENT(1 1, 0 0)", "SEGMENT(-1 -1, 1 1)", 'c', "POINT(1 1)", "POINT(0 0)", true);
192     test_all_strategies<segment_t, point_t>(
193         "SEGMENT(0 0, 1 1)", "SEGMENT(1 1, -1 -1)", 'c', "POINT(0 0)", "POINT(1 1)", true);
194     test_all_strategies<segment_t, point_t>(
195         "SEGMENT(1 1, 0 0)", "SEGMENT(1 1, -1 -1)", 'c', "POINT(1 1)", "POINT(0 0)", false);
196     //   |/
197     //   /
198     test_all_strategies<segment_t, point_t>(
199         "SEGMENT(-1 -1, 1 1)", "SEGMENT(0 0, 2 2)", 's', "POINT(0 0)");
200     // ------
201     //    ---
202     test_all_strategies<segment_t, point_t>(
203         "SEGMENT(-1 0, 1 0)", "SEGMENT(0 0, 1 0)", 'c', "POINT(0 0)", "POINT(1 0)", false);
204     // ------
205     //    ------
206     test_all_strategies<segment_t, point_t>(
207         "SEGMENT(-1 0, 1 0)", "SEGMENT(0 0, 2 0)", 'c', "POINT(0 0)", "POINT(1 0)", false);
208 
209     // starting at p2
210     //    |
211     //   /
212     test_all_strategies<segment_t, point_t>(
213         "SEGMENT(-1 -1, 1 1)", "SEGMENT(1 1, 2 2)", 'a', "POINT(1 1)");
214     // ------
215     //       ---
216     test_all_strategies<segment_t, point_t>(
217         "SEGMENT(-1 0, 1 0)", "SEGMENT(1 0, 2 0)", 'a', "POINT(1 0)");
218 
219     // disjoint, crossing
220     //     /
221     //  |
222     test_all_strategies<segment_t, point_t>(
223         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-3 -3, -2 -2)", 'd');
224     //     |
225     //  /
226     test_all_strategies<segment_t, point_t>(
227         "SEGMENT(-1 -1, 1 1)", "SEGMENT(2 2, 3 3)", 'd');
228     // disjoint, collinear
229     //          ------
230     // ------
231     test_all_strategies<segment_t, point_t>(
232         "SEGMENT(-1 0, 1 0)", "SEGMENT(-3 0, -2 0)", 'd');
233     // ------
234     //           ------
235     test_all_strategies<segment_t, point_t>(
236         "SEGMENT(-1 0, 1 0)", "SEGMENT(2 0, 3 0)", 'd');
237 
238     // degenerated
239     //    /
240     // *
241     test_all_strategies<segment_t, point_t>(
242         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-2 -2, -2 -2)", 'd');
243     //    /
244     //   *
245     test_all_strategies<segment_t, point_t>(
246         "SEGMENT(-1 -1, 1 1)", "SEGMENT(-1 -1, -1 -1)", '0', "POINT(-1 -1)");
247     //    /
248     //   *
249     //  /
250     test_all_strategies<segment_t, point_t>(
251         "SEGMENT(-1 -1, 1 1)", "SEGMENT(0 0, 0 0)", '0', "POINT(0 0)");
252     //    *
253     //   /
254     test_all_strategies<segment_t, point_t>(
255         "SEGMENT(-1 -1, 1 1)", "SEGMENT(1 1, 1 1)", '0', "POINT(1 1)");
256     //       *
257     //   /
258     test_all_strategies<segment_t, point_t>(
259         "SEGMENT(-1 -1, 1 1)", "SEGMENT(2 2, 2 2)", 'd');
260     // similar to above, collinear
261     // *   ------
262     test_all_strategies<segment_t, point_t>(
263         "SEGMENT(-1 0, 1 0)", "SEGMENT(-2 0, -2 0)", 'd');
264     //    *------
265     test_all_strategies<segment_t, point_t>(
266         "SEGMENT(-1 0, 1 0)", "SEGMENT(-1 0, -1 0)", '0', "POINT(-1 0)");
267     //    ---*---
268     test_all_strategies<segment_t, point_t>(
269         "SEGMENT(-1 0, 1 0)", "SEGMENT(0 0, 0 0)", '0', "POINT(0 0)");
270     //    ------*
271     test_all_strategies<segment_t, point_t>(
272         "SEGMENT(-1 0, 1 0)", "SEGMENT(1 0, 1 0)", '0', "POINT(1 0)");
273     //    ------   *
274     test_all_strategies<segment_t, point_t>(
275         "SEGMENT(-1 0, 1 0)", "SEGMENT(2 0, 2 0)", 'd');
276 
277     // Northern hemisphere
278     // ---   ------
279     test_all_strategies<segment_t, point_t>(
280         "SEGMENT(-1 50, 1 50)", "SEGMENT(-3 50, -2 50)", 'd');
281     //    ------
282     // ---
283     test_all_strategies<segment_t, point_t>(
284         "SEGMENT(-1 50, 1 50)", "SEGMENT(-2 50, -1 50)", 'a', "POINT(-1 50)");
285     //  \/
286     //  /\                   (avoid multi-line comment)
287     test_strategies<segment_t, point_t>(
288         "SEGMENT(-1 50, 1 50)", "SEGMENT(-2 50, 0 50)",
289         great_elliptic('i', "POINT(-0.5 50.0032229484023)"),
290         geodesic_vincenty('i', "POINT(-0.4999999996073994 50.00323192256208)"),
291         geodesic_thomas('i', "POINT(-0.4999999963998482 50.00323192258598)"),
292         geodesic_andoyer('i', "POINT(-0.4999990340391772 50.00323192463806)"));
293     //  ________
294     // /   _____\            (avoid multi-line comment)
295     test_all_strategies<segment_t, point_t>(
296         "SEGMENT(-1 50, 1 50)", "SEGMENT(-2 50, 1 50)", 't', "POINT(1 50)");
297     //  _________
298     // /  _____  \           (avoid multi-line comment)
299     test_all_strategies<segment_t, point_t>(
300         "SEGMENT(-1 50, 1 50)", "SEGMENT(-2 50, 2 50)", 'd');
301     //  ______
302     // /___   \              (avoid multi-line comment)
303     test_all_strategies<segment_t, point_t>(
304         "SEGMENT(-1 50, 1 50)", "SEGMENT(-1 50, 0 50)", 'f', "POINT(-1 50)");
305     // ------
306     // ------
307     test_all_strategies<segment_t, point_t>(
308         "SEGMENT(-1 50, 1 50)", "SEGMENT(-1 50, 1 50)", 'e', "POINT(-1 50)", "POINT(1 50)", false);
309     //  ________
310     // /_____   \            (avoid multi-line comment)
311     test_all_strategies<segment_t, point_t>(
312         "SEGMENT(-1 50, 1 50)", "SEGMENT(-1 50, 2 50)", 'f', "POINT(-1 50)");
313     //  ______
314     // /   ___\              (avoid multi-line comment)
315     test_all_strategies<segment_t, point_t>(
316         "SEGMENT(-1 50, 1 50)", "SEGMENT(0 50, 1 50)", 't', "POINT(1 50)");
317     //  \/
318     //  /\                   (avoid multi-line comment)
319     test_strategies<segment_t, point_t>(
320         "SEGMENT(-1 50, 1 50)", "SEGMENT(0 50, 2 50)",
321         great_elliptic('i', "POINT(0.5 50.0032229484023)"),
322         geodesic_vincenty('i', "POINT(0.4999999996112415 50.00323192256208)"),
323         geodesic_thomas('i', "POINT(0.5000000051005989 50.00323192258598)"),
324         geodesic_andoyer('i', "POINT(0.5000009655139563 50.00323192463806)"));
325     // ------
326     //       ---
327     test_all_strategies<segment_t, point_t>(
328         "SEGMENT(-1 50, 1 50)", "SEGMENT(1 50, 2 50)", 'a', "POINT(1 50)");
329     // ------   ---
330     test_all_strategies<segment_t, point_t>(
331         "SEGMENT(-1 50, 1 50)", "SEGMENT(2 50, 3 50)", 'd');
332 
333     // ___|
334     test_all_strategies<segment_t, point_t>(
335         "SEGMENT(0 0, 1 0)", "SEGMENT(1 0, 1 1)", 'a', "POINT(1 0)");
336     // ___|
337     test_all_strategies<segment_t, point_t>(
338         "SEGMENT(1 0, 1 1)", "SEGMENT(0 0, 1 0)", 'a', "POINT(1 0)");
339 
340     //   |/
341     //  /|
342     test_strategies<segment_t, point_t>(
343         "SEGMENT(10 -1, 20 1)", "SEGMENT(12.5 -1, 12.5 1)",
344         great_elliptic('i', "POINT(12.5 -0.50051443471392)"),
345         geodesic_vincenty('i', "POINT(12.5 -0.5005177749487734)"),
346         geodesic_thomas('i', "POINT(12.5 -0.5005177654827411)"),
347         geodesic_andoyer('i', "POINT(12.5 -0.500525380045163)"));
348     //   |/
349     //  /|
350     test_strategies<segment_t, point_t>(
351         "SEGMENT(10 -1, 20 1)", "SEGMENT(17.5 -1, 17.5 1)",
352         great_elliptic('i', "POINT(17.5 0.50051443471392)"),
353         geodesic_vincenty('i', "POINT(17.5 0.5005177748229335)"),
354         geodesic_thomas('i', "POINT(17.5 0.5005178030678186)"),
355         geodesic_andoyer('i', "POINT(17.5 0.5004949944844279)"));
356 
357     // vertical, crossing at the pole or disjoint
358     test_all_strategies<segment_t, point_t>(
359         "SEGMENT(90 45, -90 60)", "SEGMENT(0 50, 180 70)", 'i', "POINT(0 90)");
360     test_all_strategies<segment_t, point_t>(
361         "SEGMENT(90 -45, -90 -60)", "SEGMENT(0 -50, 180 -70)", 'i', "POINT(0 -90)");
362     test_all_strategies<segment_t, point_t>(
363         "SEGMENT(90 45, -90 60)", "SEGMENT(0 -50, 180 -70)", 'd');
364     test_all_strategies<segment_t, point_t>(
365         "SEGMENT(90 -45, -90 -60)", "SEGMENT(0 50, 180 70)", 'd');
366 
367     // vertical touching at the pole
368     test_all_strategies<segment_t, point_t>(
369         "SEGMENT(90 90, 90 45)", "SEGMENT(0 90, 0 45)", 'f', "POINT(90 90)"); // should probably be (0 90)
370     test_all_strategies<segment_t, point_t>(
371         "SEGMENT(90 90, 90 45)", "SEGMENT(0 45, 0 90)", 'a', "POINT(90 90)"); // should probably be (0 90)
372     test_all_strategies<segment_t, point_t>(
373         "SEGMENT(90 45, 90 90)", "SEGMENT(0 90, 0 45)", 'a', "POINT(90 90)"); // should probably be (0 90)
374     test_all_strategies<segment_t, point_t>(
375         "SEGMENT(90 45, 90 90)", "SEGMENT(0 45, 0 90)", 't', "POINT(90 90)"); // should probably be (0 90)
376 
377     // one vertical with endpoint at a pole
378     /*test_strategies<segment_t, point_t>(
379         "SEGMENT(0 90, 90 0)", "SEGMENT(89 45, 91 45)",
380         great_elliptic('i',    "POINT(90 45.00436354465514)"),
381         geodesic_vincenty('i', "POINT(90.00000000000112 45.00437824795338)"),
382         geodesic_thomas('i',   "POINT(90.00000000472062 45.00437824797395)"),
383         geodesic_andoyer('i',  "POINT(89.99999993672924 45.00437824794587)"));
384     test_strategies<segment_t, point_t>(
385         "SEGMENT(90 0, 0 90)", "SEGMENT(89 45, 91 45)",
386         great_elliptic('i',    "POINT(90 45.00436354465514)"),
387         geodesic_vincenty('i', "POINT(90.00000000000112 45.00437824795338)"),
388         geodesic_thomas('i',   "POINT(90.00000000472062 45.00437824797395)"),
389         geodesic_andoyer('i',  "POINT(89.99999993672924 45.00437824794587)"));
390     test_strategies<segment_t, point_t>(
391         "SEGMENT(0 -90, 90 0)", "SEGMENT(89 -45, 91 -45)",
392         great_elliptic('i',    "POINT(90 -45.00436354465514)"),
393         geodesic_vincenty('i', "POINT(90.00000000000112 -45.00437824795338)"),
394         geodesic_thomas('i',   "POINT(90.00000000472062 -45.00437824797395)"),
395         geodesic_andoyer('i',  "POINT(89.99999993672924 -45.00437824794587)"));
396     test_strategies<segment_t, point_t>(
397         "SEGMENT(90 0, 0 -90)", "SEGMENT(89 -45, 91 -45)",
398         great_elliptic('i',    "POINT(90 -45.00436354465514)"),
399         geodesic_vincenty('i', "POINT(90.00000000000112 -45.00437824795338)"),
400         geodesic_thomas('i',   "POINT(90.00000000472062 -45.00437824797395)"),
401         geodesic_andoyer('i',  "POINT(89.99999993672924 -45.00437824794587)"));*/
402 }
403 
404 template <typename T>
test_geographic_radian()405 void test_geographic_radian()
406 {
407     typedef bg::model::point<T, 2, bg::cs::geographic<bg::radian> > point_t;
408     typedef bg::model::segment<point_t> segment_t;
409 
410     bg::strategy::intersection::geographic_segments<bg::strategy::vincenty> strategy;
411 
412     // https://github.com/boostorg/geometry/issues/470
413     point_t p0(0.000000001, 0.000000001);
414     point_t p1(0.000000001, 0.000000005);
415     point_t p2(0.000000005, 0.000000005);
416     segment_t s1(p0, p1);
417     segment_t s2(p1, p2);
418     test_strategy_one(s1, s1, strategy, 'e', 2, p0, p1);
419     test_strategy_one(s2, s2, strategy, 'e', 2, p1, p2);
420 }
421 
test_main(int,char * [])422 int test_main(int, char* [])
423 {
424     //test_geographic<float>();
425     test_geographic<double>();
426 
427     test_geographic_radian<double>();
428 
429     return 0;
430 }
431