]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/test/algorithms/relate/relate_linear_linear.cpp
bump version to 18.2.2-pve1
[ceph.git] / ceph / src / boost / libs / geometry / test / algorithms / relate / relate_linear_linear.cpp
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2
3 // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
4
5 // This file was modified by Oracle on 2013-2021.
6 // Modifications copyright (c) 2013-2021 Oracle and/or its affiliates.
7 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
8
9 // Use, modification and distribution is subject to the Boost Software License,
10 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
11 // http://www.boost.org/LICENSE_1_0.txt)
12
13 #include "test_relate.hpp"
14
15
16 template <typename P>
17 void test_linestring_linestring()
18 {
19 using coord_t = typename bg::coordinate_type<P>::type;
20 using ls = bg::model::linestring<P>;
21
22 test_geometry<ls, ls>("LINESTRING(0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 3 2)", "1FFF0FFF2");
23 test_geometry<ls, ls>("LINESTRING(0 0,3 2)", "LINESTRING(0 0, 2 2, 3 2)", "FF1F0F1F2");
24 test_geometry<ls, ls>("LINESTRING(1 0,2 2,2 3)", "LINESTRING(0 0, 2 2, 3 2)", "0F1FF0102");
25
26 test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(0 0,1 1,2 0,2 -1)", "0F1F00102");
27
28 test_geometry<ls, ls>("LINESTRING(0 0, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 3 2)", "1FFF0FFF2");
29 test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1, 0 0)", "LINESTRING(0 0, 2 2, 3 2)", "1FFF0FFF2");
30 test_geometry<ls, ls>("LINESTRING(0 0, 1 1, 2 2, 3 2)", "LINESTRING(3 2, 2 2, 0 0)", "1FFF0FFF2");
31 test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1, 0 0)", "LINESTRING(3 2, 2 2, 0 0)", "1FFF0FFF2");
32
33 test_geometry<ls, ls>("LINESTRING(3 1, 2 2, 1 1, 0 0)", "LINESTRING(0 0, 2 2, 3 2)", "1F1F00102");
34 test_geometry<ls, ls>("LINESTRING(3 3, 2 2, 1 1, 0 0)", "LINESTRING(0 0, 2 2, 3 2)", "1F1F00102");
35
36 test_geometry<ls, ls>("LINESTRING(0 0, 1 1, 2 2, 2 3)", "LINESTRING(0 0, 2 2, 2 3)", "1FFF0FFF2");
37 test_geometry<ls, ls>("LINESTRING(2 3, 2 2, 1 1, 0 0)", "LINESTRING(0 0, 2 2, 2 3)", "1FFF0FFF2");
38 test_geometry<ls, ls>("LINESTRING(0 0, 1 1, 2 2, 2 3)", "LINESTRING(2 3, 2 2, 0 0)", "1FFF0FFF2");
39 test_geometry<ls, ls>("LINESTRING(2 3, 2 2, 1 1, 0 0)", "LINESTRING(2 3, 2 2, 0 0)", "1FFF0FFF2");
40
41 test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
42
43 test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
44 test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2)", "LINESTRING(4 2, 2 2, 0 0)", "1FF0FF102");
45 test_geometry<ls, ls>("LINESTRING(3 2, 2 2, 1 1)", "LINESTRING(4 2, 2 2, 0 0)", "1FF0FF102");
46
47 // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", true);
48
49 // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 3)", "LINESTRING(0 0, 2 2, 4 2)", false);
50 // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2, 3 3)", "LINESTRING(0 0, 2 2, 4 2)", false);
51 // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 1)", "LINESTRING(0 0, 2 2, 4 2)", false);
52 // test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 3 2, 3 1)", "LINESTRING(0 0, 2 2, 4 2)", false);
53
54 // test_geometry<ls, ls>("LINESTRING(0 1, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
55 // test_geometry<ls, ls>("LINESTRING(0 1, 0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
56 // test_geometry<ls, ls>("LINESTRING(1 0, 1 1, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
57 // test_geometry<ls, ls>("LINESTRING(1 0, 0 0, 2 2, 3 2)", "LINESTRING(0 0, 2 2, 4 2)", false);
58
59 // test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0)", false);
60 // test_geometry<ls, ls>("LINESTRING(1 1)", "LINESTRING(0 0, 2 2)", true);
61 // test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0, 2 2)", false);
62 // test_geometry<ls, ls>("LINESTRING(0 0, 1 1)", "LINESTRING(0 0)", false);
63
64 // test_geometry<ls, ls>("LINESTRING(0 0,5 0,3 0,6 0)", "LINESTRING(0 0,6 0)", true);
65 // test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1)", "LINESTRING(0 0,3 3,6 3)", true);
66
67 // SPIKES!
68 test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1,5 3)", "LINESTRING(0 0,3 3,6 3)", "1F100F102");
69 test_geometry<ls, ls>("LINESTRING(5 3,1 1,3 3,2 2,0 0)", "LINESTRING(0 0,3 3,6 3)", "1F100F102");
70 test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1,5 3)", "LINESTRING(6 3,3 3,0 0)", "1F100F102");
71 test_geometry<ls, ls>("LINESTRING(5 3,1 1,3 3,2 2,0 0)", "LINESTRING(6 3,3 3,0 0)", "1F100F102");
72
73 test_geometry<ls, ls>("LINESTRING(6 3,3 3,0 0)", "LINESTRING(0 0,2 2,3 3,1 1,5 3)", "101F001F2");
74
75 test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(1 0,9 0,2 0)", "101FF0FF2");
76 test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1)", "LINESTRING(0 0,3 3,6 3)", "1FF00F102");
77 // TODO: REWRITE MATRICES
78 // BEGIN
79 /*test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,1 1)", "LINESTRING(0 0,4 4,6 3)", "1FF00F102");
80
81 test_geometry<ls, ls>("LINESTRING(0 0,2 0,1 0)", "LINESTRING(0 1,0 0,2 0)", "1FF00F102");
82 test_geometry<ls, ls>("LINESTRING(2 0,0 0,1 0)", "LINESTRING(0 1,0 0,2 0)", "1FF00F102");
83
84 test_geometry<ls, ls>("LINESTRING(0 0,3 3,1 1)", "LINESTRING(3 0,3 3,3 1)", "0F1FF0102");
85 test_geometry<ls, ls>("LINESTRING(0 0,3 3,1 1)", "LINESTRING(2 0,2 3,2 1)", "0F1FF0102");
86 test_geometry<ls, ls>("LINESTRING(0 0,3 3,1 1)", "LINESTRING(2 0,2 2,2 1)", "0F1FF0102");
87
88 test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,4 4)", "LINESTRING(0 0,1 1,4 4)", "1FFF0FFF2");*/
89 // END
90
91 test_geometry<ls, ls>("LINESTRING(0 0,2 2,3 3,4 4)", "LINESTRING(0 0,1 1,4 4)", "1FFF0FFF2");
92
93 // loop i/i i/i u/u u/u
94 test_geometry<ls, ls>("LINESTRING(0 0,10 0)",
95 "LINESTRING(1 1,1 0,6 0,6 1,4 1,4 0,9 0,9 1)", "1F1FF0102");
96
97 // self-intersecting and self-touching equal
98 test_geometry<ls, ls>("LINESTRING(0 5,5 5,10 5,10 10,5 10,5 5,5 0)",
99 "LINESTRING(0 5,5 5,5 10,10 10,10 5,5 5,5 0)", "1FFF0FFF2");
100 // self-intersecting loop and self-touching equal
101 test_geometry<ls, ls>("LINESTRING(0 5,5 5,10 5,10 10,5 10,5 5,10 5,10 10,5 10,5 5,5 0)",
102 "LINESTRING(0 5,5 5,5 10,10 10,10 5,5 5,5 0)", "1FFF0FFF2");
103
104 test_geometry<ls, ls>("LINESTRING(0 0,1 1)", "LINESTRING(0 1,1 0)", "0F1FF0102");
105 test_geometry<ls, ls>("LINESTRING(0 0,1 1)", "LINESTRING(1 1,2 0)", "FF1F00102");
106 test_geometry<ls, ls>("LINESTRING(0 0,1 1)", "LINESTRING(2 0,1 1)", "FF1F00102");
107
108 test_geometry<ls, ls>("LINESTRING(0 0,1 0,2 1,3 5,4 0)", "LINESTRING(1 0,2 1,3 5)", "101FF0FF2");
109 test_geometry<ls, ls>("LINESTRING(0 0,1 0,2 1,3 5,4 0)", "LINESTRING(3 5,2 1,1 0)", "101FF0FF2");
110 test_geometry<ls, ls>("LINESTRING(1 0,2 1,3 5)", "LINESTRING(4 0,3 5,2 1,1 0,0 0)", "1FF0FF102");
111 test_geometry<ls, ls>("LINESTRING(3 5,2 1,1 0)", "LINESTRING(4 0,3 5,2 1,1 0,0 0)", "1FF0FF102");
112
113 test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(-1 -1,1 0,10 0,20 -1)", "1F10F0102");
114 test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(20 -1,10 0,1 0,-1 -1)", "1F10F0102");
115
116 test_geometry<ls, ls>("LINESTRING(-1 1,0 0,1 0,5 0,5 5,10 5,15 0,31 0)",
117 "LINESTRING(-1 -1,0 0,1 0,2 0,3 1,4 0,30 0)",
118 "101FF0102");
119 test_geometry<ls, ls>("LINESTRING(-1 1,0 0,1 0,5 0,5 5,10 5,15 0,31 0)",
120 "LINESTRING(30 0,4 0,3 1,2 0,1 0,0 0,-1 -1)",
121 "101FF0102");
122 test_geometry<ls, ls>("LINESTRING(31 0,15 0,10 5,5 5,5 0,1 0,0 0,-1 1)",
123 "LINESTRING(-1 -1,0 0,1 0,2 0,3 1,4 0,30 0)",
124 "101FF0102");
125 test_geometry<ls, ls>("LINESTRING(31 0,15 0,10 5,5 5,5 0,1 0,0 0,-1 1)",
126 "LINESTRING(30 0,4 0,3 1,2 0,1 0,0 0,-1 -1)",
127 "101FF0102");
128
129 // self-IP
130 test_geometry<ls, ls>("LINESTRING(1 0,9 0)",
131 "LINESTRING(0 0,10 0,10 10,5 0,0 10)",
132 "1FF0FF102");
133 test_geometry<ls, ls>("LINESTRING(1 0,5 0,9 0)",
134 "LINESTRING(0 0,10 0,10 10,5 0,0 10)",
135 "1FF0FF102");
136 test_geometry<ls, ls>("LINESTRING(1 0,9 0)",
137 "LINESTRING(0 0,10 0,10 10,5 10,5 -1)",
138 "1FF0FF102");
139 test_geometry<ls, ls>("LINESTRING(1 0,9 0)",
140 "LINESTRING(0 0,10 0,5 0,5 5)",
141 "1FF0FF102");
142 test_geometry<ls, ls>("LINESTRING(1 0,7 0)", "LINESTRING(0 0,10 0,10 10,4 -1)",
143 "1FF0FF102");
144 test_geometry<ls, ls>("LINESTRING(1 0,5 0,7 0)", "LINESTRING(0 0,10 0,10 10,4 -1)",
145 "1FF0FF102");
146 test_geometry<ls, ls>("LINESTRING(1 0,7 0,8 1)", "LINESTRING(0 0,10 0,10 10,4 -1)",
147 "1F10F0102");
148 test_geometry<ls, ls>("LINESTRING(1 0,5 0,7 0,8 1)", "LINESTRING(0 0,10 0,10 10,4 -1)",
149 "1F10F0102");
150
151 // self-IP going out and in on the same point
152 test_geometry<ls, ls>("LINESTRING(2 0,5 0,5 5,6 5,5 0,8 0)", "LINESTRING(1 0,9 0)",
153 "1F10FF102");
154
155 // duplicated points
156 test_geometry<ls, ls>("LINESTRING(1 1, 2 2, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
157 test_geometry<ls, ls>("LINESTRING(1 1, 1 1, 2 2)", "LINESTRING(0 0, 2 2, 4 2)", "1FF0FF102");
158
159 // linear ring
160 test_geometry<ls, ls>("LINESTRING(0 0,10 0)", "LINESTRING(5 0,9 0,5 5,1 0,5 0)", "1F1FF01F2");
161 test_geometry<ls, ls>("LINESTRING(0 0,5 0,10 0)", "LINESTRING(5 0,9 0,5 5,1 0,5 0)", "1F1FF01F2");
162 test_geometry<ls, ls>("LINESTRING(0 0,5 0,10 0)", "LINESTRING(5 0,10 0,5 5,1 0,5 0)", "1F10F01F2");
163
164 test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(5 0,10 0,5 5,0 0,5 0)", "1FF0FF1F2");
165 test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(5 0,10 0,5 5,5 0)", "FF10F01F2");
166
167 test_geometry<ls, ls>("LINESTRING(1 0,1 6)", "LINESTRING(0 0,5 0,5 5,0 5)", "0F10F0102");
168
169 // point-size Linestring
170 test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(0 0,5 0)", "0FFFFF102");
171 test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(1 0,5 0)", "F0FFFF102");
172 test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(0 0,1 0)", "F0FFFF102");
173 test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(1 0,1 0)", "0FFFFFFF2");
174 test_geometry<ls, ls>("LINESTRING(1 0,1 0)", "LINESTRING(0 0,0 0)", "FF0FFF0F2");
175
176 // INVALID LINESTRINGS
177 // 1-point LS (a Point) NOT disjoint
178 //test_geometry<ls, ls>("LINESTRING(1 0)", "LINESTRING(0 0,5 0)", "0FFFFF102");
179 //test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(1 0)", "0F1FF0FF2");
180 //test_geometry<ls, ls>("LINESTRING(0 0,5 0)", "LINESTRING(1 0,1 0,1 0)", "0F1FF0FF2");
181 // Point/Point
182 //test_geometry<ls, ls>("LINESTRING(0 0)", "LINESTRING(0 0)", "0FFFFFFF2");
183
184 if ( BOOST_GEOMETRY_CONDITION(std::is_floating_point<coord_t>::value) )
185 {
186 // https://svn.boost.org/trac/boost/ticket/10904
187 // very small segments
188 test_geometry<ls, ls>("LINESTRING(5.6956521739130430148634331999347 -0.60869565217391330413931882503675,5.5 -0.50000000000000066613381477509392)",
189 "LINESTRING(5.5 -0.50000000000000066613381477509392,5.5 -0.5)",
190 "FF1F00102");
191 test_geometry<ls, ls>("LINESTRING(-3.2333333333333333925452279800083 5.5999999999999978683717927196994,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
192 "LINESTRING(-3.2333333333333325043668082798831 5.5999999999999996447286321199499,-3.2333333333333333925452279800083 5.5999999999999996447286321199499)",
193 "FF1F00102", "F0FFFF102"); // on some platforms the first Linestring may be detected as degenerated to Point
194 }
195
196 if ( BOOST_GEOMETRY_CONDITION((std::is_same<coord_t, double>::value)) )
197 {
198 // detected as collinear
199 test_geometry<ls, ls>("LINESTRING(1 -10, 3.069359e+307 3.069359e+307)",
200 "LINESTRING(1 6, 1 0)",
201 "*********"); // TODO: be more specific with the result
202 }
203
204 // OTHER MASKS
205 {
206 namespace bgdr = bg::detail::relate;
207 ls ls1, ls2, ls3, ls4;
208 bg::read_wkt("LINESTRING(0 0,2 0)", ls1);
209 bg::read_wkt("LINESTRING(2 0,4 0)", ls2);
210 bg::read_wkt("LINESTRING(1 0,1 1)", ls3);
211 bg::read_wkt("LINESTRING(1 0,4 0)", ls4);
212 BOOST_CHECK(bg::relate(ls1, ls2, bg::de9im::mask("FT*******")
213 || bg::de9im::mask("F**T*****")
214 || bg::de9im::mask("F***T****")));
215 BOOST_CHECK(bg::relate(ls1, ls3, bg::de9im::mask("FT*******")
216 || bg::de9im::mask("F**T*****")
217 || bg::de9im::mask("F***T****")));
218 BOOST_CHECK(bg::relate(ls3, ls1, bg::de9im::mask("FT*******")
219 || bg::de9im::mask("F**T*****")
220 || bg::de9im::mask("F***T****")));
221 BOOST_CHECK(bg::relate(ls2, ls4, bg::de9im::mask("T*F**F***"))); // within
222
223 BOOST_CHECK(bg::relate(ls1, ls2, bg::de9im::static_mask<'F','T'>()
224 || bg::de9im::static_mask<'F','*','*','T'>()
225 || bg::de9im::static_mask<'F','*','*','*','T'>()));
226 BOOST_CHECK(bg::relate(ls1, ls2, bg::de9im::mask("FT")
227 || bg::de9im::mask("F**T")
228 || bg::de9im::mask("F***T**************")));
229
230 BOOST_CHECK_THROW(bg::relate(ls1, ls2, bg::de9im::mask("A")), bg::invalid_input_exception);
231 }
232
233 // spike - boundary and interior on the same point
234 test_geometry<ls, ls>("LINESTRING(3 7, 8 8, 2 6)", "LINESTRING(5 7, 10 7, 0 7)", "0010F0102");
235
236 // 22.01.2015
237 test_geometry<ls, ls>("LINESTRING(5 5,10 10)", "LINESTRING(6 6,3 3)", "1010F0102");
238 test_geometry<ls, ls>("LINESTRING(5 5,2 8)", "LINESTRING(4 6,7 3)", "1010F0102");
239 }
240
241 template <typename P>
242 void test_linestring_multi_linestring()
243 {
244 using coord_t = typename bg::coordinate_type<P>::type;
245 using ls = bg::model::linestring<P>;
246 using mls = bg::model::multi_linestring<ls>;
247
248 // LS disjoint
249 test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,2 1))", "101FF0102");
250 // linear ring disjoint
251 test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,2 1,2 2,1 1))", "101FF01F2");
252 // 2xLS forming non-simple linear ring disjoint
253 test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,2 1,2 2),(1 1,2 2))", "101FF01F2");
254
255 test_geometry<ls, mls>("LINESTRING(0 0,10 0)",
256 "MULTILINESTRING((1 0,9 0),(9 0,2 0))",
257 "101FF0FF2");
258
259 // rings
260 test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
261 "MULTILINESTRING((5 5,0 5,0 0),(0 0,5 0,5 5))",
262 "1FFFFFFF2");
263 test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
264 "MULTILINESTRING((5 5,5 0,0 0),(0 0,0 5,5 5))",
265 "1FFFFFFF2");
266 // overlapping rings
267 test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
268 "MULTILINESTRING((5 5,0 5,0 0),(0 0,5 0,5 5,0 5))",
269 "10FFFFFF2");
270 test_geometry<ls, mls>("LINESTRING(0 0,5 0,5 5,0 5,0 0)",
271 "MULTILINESTRING((5 5,5 0,0 0),(0 0,0 5,5 5,5 0))",
272 "10FFFFFF2");
273
274 // INVALID LINESTRINGS
275 // 1-point LS (a Point) disjoint
276 //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1))", "101FF00F2");
277 //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,1 1))", "101FF00F2");
278 //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,2 0),(1 1,1 1,1 1))", "101FF00F2");
279 // 1-point LS (a Point) NOT disjoint
280 //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,9 0),(2 0))", "101FF0FF2");
281 //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,9 0),(2 0,2 0))", "101FF0FF2");
282 //test_geometry<ls, mls>("LINESTRING(0 0,10 0)", "MULTILINESTRING((1 0,9 0),(2 0,2 0,2 0))", "101FF0FF2");
283
284 // point-like
285 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
286 "MULTILINESTRING((0 0, 1 0),(2 0, 2 0))", // |------| *
287 "101F00FF2");
288 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
289 "MULTILINESTRING((0 0, 1 0),(1 0, 1 0))", // |------*
290 "101F00FF2");
291 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
292 "MULTILINESTRING((5 0, 1 0),(1 0, 1 0))", // *-------|
293 "101F00FF2");
294 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
295 "MULTILINESTRING((0 0, 1 0),(5 0, 5 0))", // |------| *
296 "10100FFF2");
297 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
298 "MULTILINESTRING((0 0, 1 0),(0 0, 0 0))", // *------|
299 "101000FF2");
300 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
301 "MULTILINESTRING((4 0, 5 0),(5 0, 5 0))", // |------*
302 "101000FF2");
303 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
304 "MULTILINESTRING((1 0, 2 0),(0 0, 0 0))", // * |------|
305 "1010F0FF2");
306
307 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
308 "MULTILINESTRING((2 0, 2 0),(2 0, 2 2))", // *
309 "001FF0102"); // |
310
311 // for consistency
312 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
313 "MULTILINESTRING((0 0, 5 0),(0 0, 2 0))", // |--------------|
314 "10F00FFF2"); // |------|
315
316 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
317 "MULTILINESTRING((0 0, 5 0),(3 0, 5 0))", // |--------------|
318 "10F00FFF2"); // |------|
319
320 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
321 "MULTILINESTRING((0 0, 5 0),(0 0, 6 0))", // |--------------|
322 "1FF00F102"); // |----------------|
323
324 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
325 "MULTILINESTRING((0 0, 5 0),(-1 0, 5 0))", // |--------------|
326 "1FF00F102"); // |----------------|
327
328 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
329 "MULTILINESTRING((0 0, 5 0),(-1 0, 6 0))", // |--------------|
330 "1FF00F102"); // |------------------|
331
332 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
333 "MULTILINESTRING((0 0, 5 0),(-1 0, 2 0))", // |--------------|
334 "10F00F102"); // |-------|
335
336 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
337 "MULTILINESTRING((0 0, 5 0),(2 0, 6 0))", // |--------------|
338 "10F00F102"); // |-------|
339
340 test_geometry<ls, mls>("LINESTRING(0 0, 5 0)", // |--------------|
341 "MULTILINESTRING((0 0, 5 0),(2 0, 2 2))", // |--------------|
342 "10FF0F102"); // |
343 // |
344
345 if ( BOOST_GEOMETRY_CONDITION(std::is_floating_point<coord_t>::value) )
346 {
347 // related to https://svn.boost.org/trac/boost/ticket/10904
348 test_geometry<ls, mls>("LINESTRING(-2305843009213693956 4611686018427387906, -33 -92, 78 83)",
349 "MULTILINESTRING((20 100, 31 -97, -46 57, -20 -4),(-71 -4))",
350 "*********"); // TODO: be more specific with the result
351 }
352
353 // 22.01.2015
354 // inspired by L/A and A/A
355 test_geometry<ls, mls>("LINESTRING(1 1,2 2)", "MULTILINESTRING((0 0,1 1),(1 1,3 3))", "1FF0FF102");
356
357 // 25.01.2015
358 test_geometry<ls, mls>("LINESTRING(1 1, 5 5, 4 4)",
359 "MULTILINESTRING((2 5, 7 5, 8 3, 6 3, 4 0),(0 0,10 10))",
360 "1FF0FF102");
361 test_geometry<ls, mls>("LINESTRING(4 1, 4 5, 4 4)",
362 "MULTILINESTRING((2 5, 7 5, 8 3, 6 3, 4 0),(4 0, 4 8, 0 4))",
363 "1FF0FF102");
364 test_geometry<ls, mls>("LINESTRING(1 1,5 5,4 4)",
365 "MULTILINESTRING((5 0,5 5,5 10),(0 0,10 10))",
366 "1FF0FF102");
367 test_geometry<ls, mls>("LINESTRING(1 1,5 5,1 0)",
368 "MULTILINESTRING((5 0,5 5,5 10),(0 0,5 5,1 0))",
369 "1FF00F102");
370 test_geometry<ls, mls>("LINESTRING(5 5,4 4)",
371 "MULTILINESTRING((5 0,5 5,5 10),(0 0,10 10))",
372 "1FF0FF102");
373 test_geometry<ls, mls>("LINESTRING(6 6,5 5,4 4)",
374 "MULTILINESTRING((5 0,5 5,5 10),(0 0,10 10))",
375 "1FF0FF102");
376 test_geometry<ls, mls>("LINESTRING(5 5,4 4)",
377 "MULTILINESTRING((5 0,5 5,5 10))",
378 "FF10F0102");
379 }
380
381 template <typename P>
382 void test_multi_linestring_multi_linestring()
383 {
384 using coord_t = typename bg::coordinate_type<P>::type;
385 using ls = bg::model::linestring<P>;
386 using mls = bg::model::multi_linestring<ls>;
387
388 test_geometry<mls, mls>("MULTILINESTRING((0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0))",
389 "MULTILINESTRING((0 10,5 0,20 0,20 0,30 0))",
390 "1F1F00102");
391 test_geometry<mls, mls>("MULTILINESTRING((0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0))",
392 //"MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),(1 10,1 10,1 0,1 0,1 -10),(2 0,2 0),(3 0,3 0,3 0),(0 0,0 0,0 10,0 10),(30 0,30 0,31 0,31 0))",
393 "MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),(1 10,1 10,1 0,1 0,1 -10),(0 0,0 0,0 10,0 10),(30 0,30 0,31 0,31 0))",
394 "1F100F102");
395 test_geometry<mls, mls>("MULTILINESTRING((0 0,0 0,18 0,18 0,19 0,19 0,19 0,30 0,30 0))",
396 "MULTILINESTRING((0 10,5 0,20 0,20 0,30 0),(0 0,0 0,0 10,0 10))",
397 "1F1F0F1F2");
398
399 // point-like
400 test_geometry<mls, mls>("MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
401 "MULTILINESTRING((0 0, 0 0))",
402 "0F0FFFFF2");
403 test_geometry<mls, mls>("MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
404 "MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
405 "0FFFFFFF2");
406 test_geometry<mls, mls>("MULTILINESTRING((0 0, 0 0),(1 1, 1 1))",
407 "MULTILINESTRING((2 2, 2 2),(3 3, 3 3))",
408 "FF0FFF0F2");
409
410 test_geometry<mls, mls>("MULTILINESTRING((0 5,10 5,10 10,5 10),(5 10,5 0,5 2),(5 2,5 5,0 5))",
411 "MULTILINESTRING((5 5,0 5),(5 5,5 0),(10 10,10 5,5 5,5 10,10 10))",
412 "10FFFFFF2");
413
414 if ( BOOST_GEOMETRY_CONDITION((std::is_same<coord_t, double>::value)) )
415 {
416 // assertion failure in 1.57
417 test_geometry<mls, mls>("MULTILINESTRING((-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))",
418 "MULTILINESTRING((-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))",
419 "*********");
420 }
421 }
422
423 template <typename P>
424 void test_all()
425 {
426 test_linestring_linestring<P>();
427 test_linestring_multi_linestring<P>();
428 test_multi_linestring_multi_linestring<P>();
429 }
430
431 int test_main( int , char* [] )
432 {
433 test_all<bg::model::d2::point_xy<int> >();
434 test_all<bg::model::d2::point_xy<double> >();
435
436 return 0;
437 }