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