17 #include "CUnit/Basic.h"
33 #define DIST2DTEST(str1, str2, res, accepted_error) \
34 do_test_mindistance_tolerance(str1, str2, res, __LINE__, lwgeom_mindistance2d_tolerance, accepted_error);\
35 do_test_mindistance_tolerance(str2, str1, res, __LINE__, lwgeom_mindistance2d_tolerance, accepted_error)
36 #define DIST3DTEST(str1, str2, res, accepted_error) \
37 do_test_mindistance_tolerance(str1, str2, res, __LINE__, lwgeom_mindistance3d_tolerance, accepted_error);\
38 do_test_mindistance_tolerance(str2, str1, res, __LINE__, lwgeom_mindistance3d_tolerance, accepted_error)
45 double (*distancef)(
const LWGEOM *,
const LWGEOM *,
double),
46 double accepted_error)
51 char *msg1 =
"test_mindistance2d_tolerance failed (got %g expected %g) at line %d\n";
52 char *msg2 =
"\n\ndo_test_mindistance2d_tolerance: NULL lwgeom generated from WKT\n %s\n\n";
74 if ( fabs(
distance - expected_res) > accepted_error )
76 printf(msg1,
distance, expected_res, line);
88 double default_accepted_error = 0.00001;
89 double zero_accepted_error = 0.0;
96 "CURVEPOLYGON(COMPOUNDCURVE((129296 142584,94722 100435,91618 97138,57306 60686,26874 28357,13059 34228,14572 65506,14593 65948,14616 66389),CIRCULARSTRING(14616 66389,17955 101124,24417 135415,24655 136418,24895 137421),(24895 137421,25472 139809,19354 141285,0 0,148000 142000,129296 142584)))",
97 "POINT(19925 112376)",
103 DIST2DTEST(
"POINT(0 0)",
"MULTIPOINT(0 1.5,0 2,0 2.5)", 1.5, default_accepted_error);
108 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(POINT(3 4))", 5.0, default_accepted_error);
113 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", 5.0, default_accepted_error);
118 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4))))", 5.0, default_accepted_error);
123 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", 5.0, default_accepted_error);
128 DIST2DTEST(
"GEOMETRYCOLLECTION(POINT(0 0))",
"GEOMETRYCOLLECTION(POINT(3 4))", 5.0, default_accepted_error);
133 DIST2DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", 5.0, default_accepted_error);
138 DIST2DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(0 0)))",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4)))", 5.0, default_accepted_error);
143 DIST2DTEST(
"LINESTRING(-2 0, -0.2 0)",
"POINT(-2 0)", 0, zero_accepted_error);
148 DIST2DTEST(
"LINESTRING(-0.2 0, -2 0)",
"POINT(-2 0)", 0, zero_accepted_error);
153 DIST2DTEST(
"LINESTRING(-1e-8 0, -0.2 0)",
"POINT(-1e-8 0)", 0, zero_accepted_error);
158 DIST2DTEST(
"LINESTRING(-0.2 0, -1e-8 0)",
"POINT(-1e-8 0)", 0, zero_accepted_error);
163 DIST2DTEST(
"CIRCULARSTRING(-1 0, 0 1, 1 0)",
"POINT(0 0)", 1, default_accepted_error);
164 DIST2DTEST(
"CIRCULARSTRING(-3 0, -2 0, -1 0, 0 1, 1 0)",
"POINT(0 0)", 1, default_accepted_error);
169 DIST2DTEST(
"CIRCULARSTRING(-1 0, 0 1, 1 0)",
"CIRCULARSTRING(0 0, 1 -1, 2 0)", 1, default_accepted_error);
174 static char *cs1 =
"CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(1 6, 6 1, 9 7),(9 7, 3 13, 1 6)),COMPOUNDCURVE((3 6, 5 4, 7 4, 7 6),CIRCULARSTRING(7 6,5 8,3 6)))";
175 DIST2DTEST(cs1,
"POINT(3 14)", 1, default_accepted_error);
176 DIST2DTEST(cs1,
"POINT(3 8)", 0, default_accepted_error);
177 DIST2DTEST(cs1,
"POINT(6 5)", 1, default_accepted_error);
178 DIST2DTEST(cs1,
"POINT(6 4)", 0, default_accepted_error);
183 DIST2DTEST(cs1,
"LINESTRING(0 0, 50 0)", 0.917484, default_accepted_error);
184 DIST2DTEST(cs1,
"LINESTRING(6 0, 10 7)", 0, default_accepted_error);
185 DIST2DTEST(cs1,
"LINESTRING(4 4, 4 8)", 0, default_accepted_error);
186 DIST2DTEST(cs1,
"LINESTRING(4 7, 5 6, 6 7)", 0.585786, default_accepted_error);
187 DIST2DTEST(cs1,
"LINESTRING(10 0, 10 2, 10 0)", 1.52913, default_accepted_error);
192 DIST2DTEST(cs1,
"POLYGON((10 4, 10 8, 13 8, 13 4, 10 4))", 0.58415, default_accepted_error);
193 DIST2DTEST(cs1,
"POLYGON((9 4, 9 8, 12 8, 12 4, 9 4))", 0, default_accepted_error);
194 DIST2DTEST(cs1,
"POLYGON((1 4, 1 8, 4 8, 4 4, 1 4))", 0, default_accepted_error);
199 DIST2DTEST(cs1,
"CURVEPOLYGON(CIRCULARSTRING(-1 4, 0 5, 1 4, 0 3, -1 4))", 0.0475666, default_accepted_error);
200 DIST2DTEST(cs1,
"CURVEPOLYGON(CIRCULARSTRING(1 4, 2 5, 3 4, 2 3, 1 4))", 0.0, default_accepted_error);
205 static char *cs2 =
"MULTISURFACE(POLYGON((0 0,0 4,4 4,4 0,0 0)),CURVEPOLYGON(CIRCULARSTRING(8 2,10 4,12 2,10 0,8 2)))";
206 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5 2,6 3,7 2,6 1,5 2))", 1, default_accepted_error);
207 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(4 2,5 3,6 2,5 1,4 2))", 0, default_accepted_error);
208 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5 3,6 2,5 1,4 2,5 3))", 0, default_accepted_error);
209 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(4.5 3,5.5 2,4.5 1,3.5 2,4.5 3))", 0, default_accepted_error);
210 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5.5 3,6.5 2,5.5 1,4.5 2,5.5 3))", 0.5, default_accepted_error);
211 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(10 3,11 2,10 1,9 2,10 3))", 0, default_accepted_error);
212 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(2 3,3 2,2 1,1 2,2 3))", 0, default_accepted_error);
213 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5 7,6 8,7 7,6 6,5 7))", 2.60555, default_accepted_error);
218 DIST2DTEST(
"LINESTRING(0.5 1,0.5 3)",
"MULTICURVE(CIRCULARSTRING(2 3,3 2,2 1,1 2,2 3),(0 0, 0 5))", 0.5, default_accepted_error);
223 DIST2DTEST(
"LINESTRING(10 0,11 1,12 2,13 3,14 4,15 5,16 6)",
224 "LINESTRING(1 1.5,2 3,3 4.5,4 6,5 7.5,6 9)",
225 8.3205, default_accepted_error);
231 "CURVEPOLYGON(CIRCULARSTRING(7874821 8715927,8907663 8715927,8844683 7750316,7937800 7750316,7874821 8715927))",
232 "POINT(5433865 8243495)", 2271704.2698450615, default_accepted_error);
236 "CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0, -1 5, 0 10), (0 10, -10 10, -10 0, 0 0)))",
237 "POINT(-0.5 5)", 0.5, default_accepted_error);
243 double default_accepted_error = 0.00001;
244 double zero_accepted_error = 0.0;
246 DIST3DTEST(
"POINT(0 0 0)",
"MULTIPOINT(0 1.5 0, 0 2 0, 0 2.5 0)", 1.5, default_accepted_error);
247 DIST3DTEST(
"POINT(0 0 0)",
"MULTIPOINT(0 1.5 0, 0 2 0, 0 2.5 0)", 1.5, default_accepted_error);
248 DIST3DTEST(
"POINT(0 0 0)",
"GEOMETRYCOLLECTION(POINT(3 4 0))", 5.0, default_accepted_error);
249 DIST3DTEST(
"POINT(0 0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4 0)))", 5.0, default_accepted_error);
250 DIST3DTEST(
"POINT(0 0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4 0))))", 5.0, default_accepted_error);
251 DIST3DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", 5.0, default_accepted_error);
252 DIST3DTEST(
"GEOMETRYCOLLECTION(POINT(0 0 0))",
"GEOMETRYCOLLECTION(POINT(3 4 0))", 5.0, default_accepted_error);
253 DIST3DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0 0)))",
254 "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4 0)))",
255 5.0, default_accepted_error);
256 DIST3DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(0 0 0)))",
257 "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4 0)))",
258 5.0, default_accepted_error);
259 DIST3DTEST(
"LINESTRING(-2 0 0, -0.2 0 0)",
"POINT(-2 0 0)", 0, zero_accepted_error);
260 DIST3DTEST(
"LINESTRING(-0.2 0 0, -2 0 0)",
"POINT(-2 0 0)", 0, zero_accepted_error);
261 DIST3DTEST(
"LINESTRING(-1e-8 0 0, -0.2 0 0)",
"POINT(-1e-8 0 0)", 0, zero_accepted_error);
262 DIST3DTEST(
"LINESTRING(-0.2 0 0, -1e-8 0 0)",
"POINT(-1e-8 0 0)", 0, zero_accepted_error);
265 DIST3DTEST(
"LINESTRING(1 0 0 , 2 0 0)",
"POLYGON((1 1 0, 2 1 0, 2 2 0, 1 2 0, 1 1 0))", 1.0, default_accepted_error);
266 DIST3DTEST(
"LINESTRING(1 1 1 , 2 1 0)",
"POLYGON((1 1 0, 2 1 0, 2 2 0, 1 2 0, 1 1 0))", 0.0, zero_accepted_error);
267 DIST3DTEST(
"LINESTRING(1 1 1 , 2 1 1)",
"POLYGON((1 1 0, 2 1 0, 2 2 0, 1 2 0, 1 1 0))", 1.0, default_accepted_error);
270 DIST3DTEST(
"LINESTRING(1 0 0 , 2 0 0)",
"TRIANGLE((1 1 0, 2 1 0, 1 2 0, 1 1 0))", 1.0, default_accepted_error);
271 DIST3DTEST(
"LINESTRING(1 1 1 , 2 1 0)",
"TRIANGLE((1 1 0, 2 1 0, 1 2 0, 1 1 0))", 0.0, zero_accepted_error);
272 DIST3DTEST(
"LINESTRING(1 1 1 , 2 1 1)",
"TRIANGLE((1 1 0, 2 1 0, 1 2 0, 1 1 0))", 1.0, default_accepted_error);
275 DIST3DTEST(
"TRIANGLE((-1 1 0, -2 1 0, -1 2 0, -1 1 0))",
"TRIANGLE((1 1 0, 2 1 0, 1 2 0, 1 1 0))", 2.0, default_accepted_error);
278 DIST3DTEST(
"LINESTRING(1 1 1 , 2 2 2)",
"POLYGON((0 0 0, 2 2 2, 3 3 1, 0 0 0))", 0.0, zero_accepted_error);
281 DIST3DTEST(
"LINESTRING(-10000 -10000 0, 0 0 1)",
"POLYGON((0 0 0, 1 0 0, 1 1 0, 0 1 0, 0 0 0))", 1, default_accepted_error);
284 DIST3DTEST(
"LINESTRING(1 1 1, 2 2 2)",
"POLYGON((0 0 0, 2 2 2, 3 3 3, 0 0 0))", 0, zero_accepted_error);
285 DIST3DTEST(
"TRIANGLE((1 1 1, 2 2 2, 3 3 3, 1 1 1))",
"POLYGON((0 0 0, 2 2 2, 3 3 3, 0 0 0))", 0, zero_accepted_error);
286 DIST3DTEST(
"POLYGON((0 0 0, 2 2 2, 3 3 3, 0 0 0))",
"TRIANGLE((1 1 1, 2 2 2, 3 3 3, 1 1 1))", 0, zero_accepted_error);
287 DIST3DTEST(
"TRIANGLE((0 0 0, 2 2 2, 3 3 3, 0 0 0))",
"LINESTRING(1 1 1, 2 2 2)", 0, zero_accepted_error);
291 "POLYHEDRALSURFACE Z (((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)),((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),((1 0 0,1 1 0,1 1 1,1 0 1,1 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)))",
292 "POLYHEDRALSURFACE Z (((-1 -1 -1,-1 2 -1,2 2 -1,2 -1 -1,-1 -1 -1)),((-1 -1 2,2 -1 2,2 2 2,-1 2 2,-1 -1 2)),((-1 -1 -1,-1 -1 2,-1 2 2,-1 2 -1,-1 -1 -1)),((2 -1 -1,2 2 -1,2 2 2,2 -1 2,2 -1 -1)),((-1 -1 -1,2 -1 -1,2 -1 2,-1 -1 2,-1 -1 -1)),((-1 2 -1,-1 2 2,2 2 2,2 2 -1,-1 2 -1)))",
293 0, zero_accepted_error);
297 "POLYHEDRALSURFACE Z (((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)),((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),((1 0 0,1 1 0,1 1 1,1 0 1,1 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)))",
298 "POLYHEDRALSURFACE Z (((0 0 2,0 1 2,-1 2 2,0 0 2)),((0 1 2,0 0 2,0 1 4,0 1 2)),((-1 2 2,0 1 2,1 1 2,-1 2 2)),((0 0 2,-1 2 2,-1 -1 2,0 0 2)),((0 1 4,0 0 2,0 0 4,0 1 4)),((0 1 2,0 1 4,1 1 4,0 1 2)),((1 1 2,0 1 2,1 1 4,1 1 2)),((-1 2 2,1 1 2,2 2 2,-1 2 2)),((-1 -1 2,-1 2 2,-1 -1 -1,-1 -1 2)),((0 0 2,-1 -1 2,1 0 2,0 0 2)),((0 0 4,0 0 2,1 0 2,0 0 4)),((0 1 4,0 0 4,1 0 4,0 1 4)),((1 1 4,0 1 4,1 0 4,1 1 4)),((1 1 2,1 1 4,1 0 4,1 1 2)),((2 2 2,1 1 2,2 -1 2,2 2 2)),((-1 2 2,2 2 2,-1 2 -1,-1 2 2)),((-1 -1 -1,-1 2 2,-1 2 -1,-1 -1 -1)),((-1 -1 2,-1 -1 -1,2 -1 -1,-1 -1 2)),((1 0 2,-1 -1 2,2 -1 2,1 0 2)),((0 0 4,1 0 2,1 0 4,0 0 4)),((1 1 2,1 0 4,1 0 2,1 1 2)),((2 -1 2,1 1 2,1 0 2,2 -1 2)),((2 2 2,2 -1 2,2 2 -1,2 2 2)),((-1 2 -1,2 2 2,2 2 -1,-1 2 -1)),((-1 -1 -1,-1 2 -1,2 2 -1,-1 -1 -1)),((2 -1 -1,-1 -1 -1,2 2 -1,2 -1 -1)),((-1 -1 2,2 -1 -1,2 -1 2,-1 -1 2)),((2 2 -1,2 -1 2,2 -1 -1,2 2 -1)))",
299 0, zero_accepted_error);
303 "TIN Z (((0 0 2,0 1 2,-1 2 2,0 0 2)),((0 1 2,0 0 2,0 1 4,0 1 2)),((-1 2 2,0 1 2,1 1 2,-1 2 2)),((0 0 2,-1 2 2,-1 -1 2,0 0 2)),((0 1 4,0 0 2,0 0 4,0 1 4)),((0 1 2,0 1 4,1 1 4,0 1 2)),((1 1 2,0 1 2,1 1 4,1 1 2)),((-1 2 2,1 1 2,2 2 2,-1 2 2)),((-1 -1 2,-1 2 2,-1 -1 -1,-1 -1 2)),((0 0 2,-1 -1 2,1 0 2,0 0 2)),((0 0 4,0 0 2,1 0 2,0 0 4)),((0 1 4,0 0 4,1 0 4,0 1 4)),((1 1 4,0 1 4,1 0 4,1 1 4)),((1 1 2,1 1 4,1 0 4,1 1 2)),((2 2 2,1 1 2,2 -1 2,2 2 2)),((-1 2 2,2 2 2,-1 2 -1,-1 2 2)),((-1 -1 -1,-1 2 2,-1 2 -1,-1 -1 -1)),((-1 -1 2,-1 -1 -1,2 -1 -1,-1 -1 2)),((1 0 2,-1 -1 2,2 -1 2,1 0 2)),((0 0 4,1 0 2,1 0 4,0 0 4)),((1 1 2,1 0 4,1 0 2,1 1 2)),((2 -1 2,1 1 2,1 0 2,2 -1 2)),((2 2 2,2 -1 2,2 2 -1,2 2 2)),((-1 2 -1,2 2 2,2 2 -1,-1 2 -1)),((-1 -1 -1,-1 2 -1,2 2 -1,-1 -1 -1)),((2 -1 -1,-1 -1 -1,2 2 -1,2 -1 -1)),((-1 -1 2,2 -1 -1,2 -1 2,-1 -1 2)),((2 2 -1,2 -1 2,2 -1 -1,2 2 -1)))",
304 "POLYHEDRALSURFACE Z (((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)),((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),((1 0 0,1 1 0,1 1 1,1 0 1,1 0 0)),((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)))",
305 0, zero_accepted_error);
309 "TIN Z (((0 0 2,0 1 2,-1 2 2,0 0 2)),((0 1 2,0 0 2,0 1 4,0 1 2)),((-1 2 2,0 1 2,1 1 2,-1 2 2)),((0 0 2,-1 2 2,-1 -1 2,0 0 2)),((0 1 4,0 0 2,0 0 4,0 1 4)),((0 1 2,0 1 4,1 1 4,0 1 2)),((1 1 2,0 1 2,1 1 4,1 1 2)),((-1 2 2,1 1 2,2 2 2,-1 2 2)),((-1 -1 2,-1 2 2,-1 -1 -1,-1 -1 2)),((0 0 2,-1 -1 2,1 0 2,0 0 2)),((0 0 4,0 0 2,1 0 2,0 0 4)),((0 1 4,0 0 4,1 0 4,0 1 4)),((1 1 4,0 1 4,1 0 4,1 1 4)),((1 1 2,1 1 4,1 0 4,1 1 2)),((2 2 2,1 1 2,2 -1 2,2 2 2)),((-1 2 2,2 2 2,-1 2 -1,-1 2 2)),((-1 -1 -1,-1 2 2,-1 2 -1,-1 -1 -1)),((-1 -1 2,-1 -1 -1,2 -1 -1,-1 -1 2)),((1 0 2,-1 -1 2,2 -1 2,1 0 2)),((0 0 4,1 0 2,1 0 4,0 0 4)),((1 1 2,1 0 4,1 0 2,1 1 2)),((2 -1 2,1 1 2,1 0 2,2 -1 2)),((2 2 2,2 -1 2,2 2 -1,2 2 2)),((-1 2 -1,2 2 2,2 2 -1,-1 2 -1)),((-1 -1 -1,-1 2 -1,2 2 -1,-1 -1 -1)),((2 -1 -1,-1 -1 -1,2 2 -1,2 -1 -1)),((-1 -1 2,2 -1 -1,2 -1 2,-1 -1 2)),((2 2 -1,2 -1 2,2 -1 -1,2 2 -1)))",
310 "TIN Z (((0 0 0,0 1 0,1 1 0,0 0 0)),((1 0 0,0 0 0,1 1 0,1 0 0)),((0 1 1,1 0 1,1 1 1,0 1 1)),((0 1 1,0 0 1,1 0 1,0 1 1)),((0 0 0,0 0 1,0 1 1,0 0 0)),((0 1 0,0 0 0,0 1 1,0 1 0)),((1 0 1,1 1 0,1 1 1,1 0 1)),((1 0 1,1 0 0,1 1 0,1 0 1)),((0 0 1,1 0 0,1 0 1,0 0 1)),((0 0 1,0 0 0,1 0 0,0 0 1)),((0 1 0,0 1 1,1 1 1,0 1 0)),((1 1 0,0 1 0,1 1 1,1 1 0)))",
311 0, zero_accepted_error);
315 "TIN Z (((0 0 2,0 1 2,-1 2 2,0 0 2)),((0 1 2,0 0 2,0 1 4,0 1 2)),((-1 2 2,0 1 2,1 1 2,-1 2 2)),((0 0 2,-1 2 2,-1 -1 2,0 0 2)),((0 1 4,0 0 2,0 0 4,0 1 4)),((0 1 2,0 1 4,1 1 4,0 1 2)),((1 1 2,0 1 2,1 1 4,1 1 2)),((-1 2 2,1 1 2,2 2 2,-1 2 2)),((-1 -1 2,-1 2 2,-1 -1 -1,-1 -1 2)),((0 0 2,-1 -1 2,1 0 2,0 0 2)),((0 0 4,0 0 2,1 0 2,0 0 4)),((0 1 4,0 0 4,1 0 4,0 1 4)),((1 1 4,0 1 4,1 0 4,1 1 4)),((1 1 2,1 1 4,1 0 4,1 1 2)),((2 2 2,1 1 2,2 -1 2,2 2 2)),((-1 2 2,2 2 2,-1 2 -1,-1 2 2)),((-1 -1 -1,-1 2 2,-1 2 -1,-1 -1 -1)),((-1 -1 2,-1 -1 -1,2 -1 -1,-1 -1 2)),((1 0 2,-1 -1 2,2 -1 2,1 0 2)),((0 0 4,1 0 2,1 0 4,0 0 4)),((1 1 2,1 0 4,1 0 2,1 1 2)),((2 -1 2,1 1 2,1 0 2,2 -1 2)),((2 2 2,2 -1 2,2 2 -1,2 2 2)),((-1 2 -1,2 2 2,2 2 -1,-1 2 -1)),((-1 -1 -1,-1 2 -1,2 2 -1,-1 -1 -1)),((2 -1 -1,-1 -1 -1,2 2 -1,2 -1 -1)),((-1 -1 2,2 -1 -1,2 -1 2,-1 -1 2)),((2 2 -1,2 -1 2,2 -1 -1,2 2 -1)))",
317 0, zero_accepted_error);
321 "POLYHEDRALSURFACE Z (((0 -1 1,-1 -1 1,-1 -1 -1,0 -1 -1,1 -1 -1,0 -1 2,0 -1 1)),((0 1 1,0 1 2,1 1 -1,0 1 -1,-1 1 -1,-1 1 1,0 1 1)),((0 -1 1,0 1 1,-1 1 1,-1 -1 1,0 -1 1)),((-1 -1 1,-1 1 1,-1 1 -1,-1 -1 -1,-1 -1 1)),((-1 -1 -1,-1 1 -1,0 1 -1,0 -1 -1,-1 -1 -1)),((0 -1 -1,0 1 -1,1 1 -1,1 -1 -1,0 -1 -1)),((1 -1 -1,1 1 -1,0 1 2,0 -1 2,1 -1 -1)),((0 -1 2,0 1 2,0 1 1,0 -1 1,0 -1 2)))",
323 0, zero_accepted_error);
327 "POLYHEDRALSURFACE Z (((-3 -3 0,-3 3 0,3 3 0,3 -3 0,-3 -3 0),(-1 -1 0,1 -1 0,1 1 0,-1 1 0,-1 -1 0)),((-3 -3 3,3 -3 3,3 3 3,-3 3 3,-3 -3 3),(-1 -1 3,-1 1 3,1 1 3,1 -1 3,-1 -1 3)),((-3 -3 0,-3 -3 3,-3 3 3,-3 3 0,-3 -3 0)),((-3 3 0,-3 3 3,3 3 3,3 3 0,-3 3 0)),((3 3 0,3 3 3,3 -3 3,3 -3 0,3 3 0)),((3 -3 0,3 -3 3,-3 -3 3,-3 -3 0,3 -3 0)),((-1 -1 0,-1 -1 3,1 -1 3,1 -1 0,-1 -1 0)),((1 -1 0,1 -1 3,1 1 3,1 1 0,1 -1 0)),((1 1 0,1 1 3,-1 1 3,-1 1 0,1 1 0)),((-1 1 0,-1 1 3,-1 -1 3,-1 -1 0,-1 1 0)))",
329 1, zero_accepted_error);
333 "POLYHEDRALSURFACE Z (((-3 -3 0,-3 3 0,3 3 0,3 -3 0,-3 -3 0),(-1 -1 0,1 -1 0,1 1 0,-1 1 0,-1 -1 0)),((-3 -3 3,3 -3 3,3 3 3,-3 3 3,-3 -3 3),(-1 -1 3,-1 1 3,1 1 3,1 -1 3,-1 -1 3)),((-3 -3 0,-3 -3 3,-3 3 3,-3 3 0,-3 -3 0)),((-3 3 0,-3 3 3,3 3 3,3 3 0,-3 3 0)),((3 3 0,3 3 3,3 -3 3,3 -3 0,3 3 0)),((3 -3 0,3 -3 3,-3 -3 3,-3 -3 0,3 -3 0)),((-1 -1 0,-1 -1 3,1 -1 3,1 -1 0,-1 -1 0)),((1 -1 0,1 -1 3,1 1 3,1 1 0,1 -1 0)),((1 1 0,1 1 3,-1 1 3,-1 1 0,1 1 0)),((-1 1 0,-1 1 3,-1 -1 3,-1 -1 0,-1 1 0)))",
335 0, zero_accepted_error);
339 "LINESTRING Z (-27974.1264 -110211.5032 148.9768,-27975.4229 -110210.9441 149.0093)",
340 "LINESTRING Z (-27995.4183 -110201.8041 149.3354,-27975.4229 -110210.9441 149.0093)",
341 0, zero_accepted_error);
359 poly =
lwgeom_from_wkt(
"CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,1 5,0 10),(0 10,10 10,10 0, 0 0)),COMPOUNDCURVE(CIRCULARSTRING(3 7,5 8,7 7),(7 7,7 3,3 3, 3 7)))",
LW_PARSER_CHECK_NONE);
367 CU_ASSERT_EQUAL(
tree_pt(tree, 5, 7.5), 0);
369 CU_ASSERT_EQUAL(
tree_pt(tree, 8, 9), 1);
371 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 5), 0);
373 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 7.5), 0);
375 CU_ASSERT_EQUAL(
tree_pt(tree, 0.2, 7.5), 0);
377 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 0.5), 1);
379 CU_ASSERT_EQUAL(
tree_pt(tree, 2, 7.5), 1);
381 CU_ASSERT_EQUAL(
tree_pt(tree, 7, 7), 1);
390 poly =
lwgeom_from_wkt(
"POLYGON((0 0,0 10,10 10,10 0,9 0,9 9,8 6,8 0,2 0,2 9,1 6,1 0,0 0),(4 4,4 6,6 6,6 4,4 4))",
LW_PARSER_CHECK_NONE);
394 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 6), 1);
396 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 5.5), 1);
398 CU_ASSERT_EQUAL(
tree_pt(tree, -3, 5.5), 0);
400 CU_ASSERT_EQUAL(
tree_pt(tree, 4, 4), 1);
401 CU_ASSERT_EQUAL(
tree_pt(tree, 6, 6), 1);
403 CU_ASSERT_EQUAL(
tree_pt(tree, 4.5, 4), 1);
405 CU_ASSERT_EQUAL(
tree_pt(tree, 8, 0), 1);
406 CU_ASSERT_EQUAL(
tree_pt(tree, 9, 0), 1);
407 CU_ASSERT_EQUAL(
tree_pt(tree, 10, 1), 1);
408 CU_ASSERT_EQUAL(
tree_pt(tree, 9.5, 1), 1);
409 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 10), 1);
411 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 6), 1);
413 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 6), 0);
415 CU_ASSERT_EQUAL(
tree_pt(tree, 5, 5), 0);
417 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 4), 1);
418 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 6), 1);
419 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 9), 1);
431 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 0.5), 1);
433 CU_ASSERT_EQUAL(
tree_pt(tree, 1.5, 0.5), 0);
435 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 1), 0);
437 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 1), 1);
439 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 1), 1);
441 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 0.5), 1);
451 CU_ASSERT_EQUAL(
tree_pt(tree, -0.5, 0.5), 0);
453 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 1), 0);
455 CU_ASSERT_EQUAL(
tree_pt(tree, 2, 1), 1);
457 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 1), 1);
459 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 3), 1);
461 CU_ASSERT_EQUAL(
tree_pt(tree, 4, 0), 1);
463 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 3), 1);
465 CU_ASSERT_EQUAL(
tree_pt(tree, 2, 0), 1);
473 poly =
lwgeom_from_wkt(
"POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
LW_PARSER_CHECK_NONE);
477 CU_ASSERT_EQUAL(
tree_pt(tree, -0.5, 3.5), 0);
479 CU_ASSERT_EQUAL(
tree_pt(tree, 6.0, 2.2), 0);
481 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 2), 1);
483 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 0), 1);
485 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 6), 1);
487 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 1), 1);
489 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 2), 1);
491 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 6), 1);
516 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
517 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))"),
523 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
524 "POLYGON((0.3 0.7, 0.3 0.8, 0.4 0.8, 0.4 0.7, 0.3 0.7))"),
530 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
531 "POLYGON((0.3 0.7, 0.3 0.8, 0.4 0.8, 1.3 0.3, 0.3 0.7))"),
537 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
538 "POLYGON((-1 5, 0 5, 0 7, -1 7, -1 5))"),
544 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
545 "GEOMETRYCOLLECTION(MULTILINESTRING((1 2, 3 2)),POINT(1 2))"),
551 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
552 "GEOMETRYCOLLECTION(MULTILINESTRING((6 3, 8 4)),POINT(5 3))"),
558 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
559 "GEOMETRYCOLLECTION(MULTILINESTRING((6 3, 8 4)),POINT(1 3.5))"),
565 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
566 "GEOMETRYCOLLECTION(MULTILINESTRING((1.5 4.1, 1.6 2)),POINT(1 3.5))"),
595 #define TDT(w1, w2, d) CU_ASSERT_DOUBLE_EQUAL(test_rect_tree_distance_tree_case(w1, w2), d, 0.00001);
602 wkt =
"MULTIPOLYGON(((-123.35702791281 48.4232302445918,-123.35689654493 48.4237265810249,-123.354053908057 48.4234039978588,-123.35417179975 48.4229151379279,-123.354369811539 48.4220987102936,-123.355779071731 48.4222571534228,-123.357238860904 48.4224209369449,-123.35702791281 48.4232302445918)))";
603 TDT(wkt,
"MULTIPOLYGON(((-123.353452578038 48.4259519079838,-123.35072012771 48.4256699150083,-123.347337809991 48.4254740864963,-123.347469111645 48.4245757659326,-123.349409235923 48.4246224093429,-123.349966167324 48.4246562342604,-123.353650661317 48.4250703224683,-123.353452578038 48.4259519079838)))", 0.0017144228293396);
606 TDT(wkt,
"MULTIPOINT(0 1.5,0 2,0 2.5)", 1.5);
607 TDT(wkt,
"GEOMETRYCOLLECTION(POINT(3 4))", 5.0);
608 TDT(wkt,
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", 5.0);
609 TDT(wkt,
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4))))", 5.0);
610 TDT(wkt,
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", 5.0);
612 TDT(
"LINESTRING(-2 0, -0.2 0)",
"POINT(-2 0)", 0);
613 TDT(
"LINESTRING(-0.2 0, -2 0)",
"POINT(-2 0)", 0);
614 TDT(
"LINESTRING(-1e-8 0, -0.2 0)",
"POINT(-1e-8 0)", 0);
615 TDT(
"LINESTRING(-0.2 0, -1e-8 0)",
"POINT(-1e-8 0)", 0);
617 wkt =
"CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(1 6, 6 1, 9 7),(9 7, 3 13, 1 6)),COMPOUNDCURVE((3 6, 5 4, 7 4, 7 6),CIRCULARSTRING(7 6,5 8,3 6)))";
618 TDT(wkt,
"POINT(3 14)", 1);
619 TDT(wkt,
"POINT(3 8)", 0);
620 TDT(wkt,
"POINT(6 5)", 1);
621 TDT(wkt,
"POINT(6 4)", 0);
623 wkt =
"MULTISURFACE(POLYGON((0 0,0 4,4 4,4 0,0 0)),CURVEPOLYGON(CIRCULARSTRING(8 2,10 4,12 2,10 0,8 2)))";
624 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5 7,6 8,7 7,6 6,5 7))", 2.60555);
625 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5 2,6 3,7 2,6 1,5 2))", 1);
626 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(4 2,5 3,6 2,5 1,4 2))", 0);
627 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5 3,6 2,5 1,4 2,5 3))", 0);
628 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(4.5 3,5.5 2,4.5 1,3.5 2,4.5 3))", 0);
629 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5.5 3,6.5 2,5.5 1,4.5 2,5.5 3))", 0.5);
630 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(10 3,11 2,10 1,9 2,10 3))", 0);
631 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(2 3,3 2,2 1,1 2,2 3))", 0);
633 wkt =
"CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,5 0,0 0)))";
634 TDT(wkt,
"POINT(3 0)", 0.0);
635 TDT(wkt,
"POINT(5 0)", 0.0);
636 TDT(wkt,
"POINT(7 0)", 2.0);
637 TDT(wkt,
"POINT(2.5 3.5)", 1.0);
640 TDT(wkt,
"POINT(0 1)", 1.0);
641 TDT(wkt,
"POINT(1 0)", 1.0);
643 wkt =
"LINESTRING(0 0,1 0)";
644 TDT(wkt,
"LINESTRING(1 0,1 1)", 0.0);
645 TDT(wkt,
"LINESTRING(0 1,1 1)", 1.0);
647 wkt =
"POLYGON((0 0,0 1,1 1,1 0,0 0))";
648 TDT(wkt,
"POINT(2 2)", sqrt(2));
649 TDT(wkt,
"POINT(0.5 0.5)", 0);
650 TDT(wkt,
"POINT(1 1)", 0);
652 wkt =
"POLYGON((0 0,0 10,10 10,10 0,0 0), (4 4,4 6,6 6,6 4,4 4))";
653 TDT(wkt,
"POINT(5 5)", 1);
654 TDT(wkt,
"POLYGON((5 5,5 5.5,5.5 5.5,5.5 5, 5 5))", 0.5);
681 CU_ASSERT_EQUAL(lineout, NULL);
689 CU_ASSERT_EQUAL(lineout, NULL);
695 CU_ASSERT_EQUAL(lineout, NULL);
699 "MULTIPOLYGON(((0 0,20 0,20 20,0 20,0 0),(2 2,2 4,4 4,4 2,2 2),(6 6,6 8,8 8,8 6,6 6)),((40 0,40 20,60 20,60 0,40 0),(42 2,42 4,44 4,44 2,42 2)))"
703 CU_ASSERT_EQUAL(lineout, NULL);
707 "GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,20 0,20 20,0 20,0 0),(2 2,2 4,4 4,4 2,2 2),(6 6,6 8,8 8,8 6,6 6)),((40 0,40 20,60 20,60 0,40 0),(42 2,42 4,44 4,44 2,42 2))),MULTILINESTRING((0 0,10 0),(20 0, 30 0)),MULTIPOINT(0 0, 3 4))"
709 CU_ASSERT_FATAL(linein != NULL);
712 CU_ASSERT_EQUAL(lineout, NULL);
716 CU_ASSERT_FATAL(linein != NULL);
719 CU_ASSERT_NOT_EQUAL_FATAL(lineout, NULL);
732 double measure = 105.0;
772 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
779 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
786 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0), 0.000001);
793 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1, 0.000001);
800 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
807 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
814 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
824 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
847 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
855 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
859 A1.
x = -2; A1.
y = -2;
863 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
868 A2.
x = 0; A2.
y = 0.5;
871 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
879 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0., 0.000001);
887 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1, 0.000001);
895 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
904 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1, 0.000001);
914 POINT2D A1, A2, A3, B1, B2, B3;
919 A1.
x = -1.0; A1.
y = 4.0;
920 A2.
x = 0.0; A2.
y = 5.0;
921 A3.
x = 1.0; A3.
y = 4.0;
922 B1.
x = 1.0; B1.
y = 6.0;
923 B2.
x = 6.0; B2.
y = 1.0;
924 B3.
x = 9.0; B3.
y = 7.0;
927 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.0475666, 0.000001);
937 A2.
x = -0.3; A2.
y = .5;
942 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.271798, 0.000001);
946 A1.
x = -0.5; A1.
y = .5;
947 A2.
x = -0.4; A2.
y = .2;
951 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.292893, 0.000001);
960 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
969 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
978 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2)-1, 0.000001);
987 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
991 A1.
x = -2.0; A1.
y = -0.1;
992 A2.
x = 1.5; A2.
y = -0.1;
993 A3.
x = -2.0; A3.
y = -0.1;
996 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.480742, 0.0001);
1000 A1.
x = -2.0; A1.
y = 0.0;
1001 A2.
x = 0.0; A2.
y = 2.0;
1002 A3.
x = 2.0; A3.
y = 0.0;
1005 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1009 A1.
x = -0.5 / sqrt(2.0); A1.
y = 0.5 / sqrt(2.0);
1010 A2.
x = 0.0; A2.
y = 0.5;
1011 A3.
x = 0.5 / sqrt(2.0); A3.
y = 0.5 / sqrt(2.0);
1014 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1018 A1.
x = -0.5 / sqrt(2.0); A1.
y = -0.5 / sqrt(2.0);
1019 A2.
x = -0.5; A2.
y = 0.0;
1020 A3.
x = -0.5 / sqrt(2.0); A3.
y = 0.5 / sqrt(2.0);
1023 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1027 A1.
x = -0.5 / sqrt(2.0); A1.
y = -0.5 / sqrt(2.0);
1028 A2.
x = 0.0; A2.
y = -0.5;
1029 A3.
x = 0.5 / sqrt(2.0); A3.
y = -0.5 / sqrt(2.0);
1032 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.736813, 0.000001);
1036 A1.
x = -1.0; A1.
y = 0.0;
1037 A2.
x = 0.0; A2.
y = 1.0;
1038 A3.
x = 1.0; A3.
y = 0.0;
1041 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.0, 0.000001);
1044 B1.
x = -10.0; B1.
y = 0.0;
1045 B2.
x = 0.0 ; B2.
y = 10.0;
1046 B3.
x = 10.0 ; B3.
y = 0.0;
1049 A1.
x = -22.0; A1.
y = 0.0;
1050 A2.
x = -17.0; A2.
y = -5.0;
1051 A3.
x = -12.0; A3.
y = 0.0;
1054 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 2.0, 0.000001);
1057 A1.
x = -19.0; A1.
y = 0.0;
1058 A2.
x = -14.0; A2.
y = -5.0;
1059 A3.
x = - 9.0; A3.
y = 0.0;
1062 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1065 A1.
x = -9.0; A1.
y = 0.0;
1066 A2.
x = -4.0; A2.
y = -5.0;
1067 A3.
x = 1.0; A3.
y = 0.0;
1070 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1073 A1.
x = -1.0; A1.
y = 0.0;
1074 A2.
x = 4.0; A2.
y = -5.0;
1075 A3.
x = 9.0; A3.
y = 0.0;
1078 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1081 A1.
x = 1.0; A1.
y = 0.0;
1082 A2.
x = 6.0; A2.
y = -5.0;
1083 A3.
x = 11.0; A3.
y = 0.0;
1086 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1089 A1.
x = 11.0; A1.
y = 0.0;
1090 A2.
x = 16.0; A2.
y = -5.0;
1091 A3.
x = 21.0; A3.
y = 0.0;
1094 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1098 A1.
x = -15.0; A1.
y = -6.0;
1099 A2.
x = -10.0; A2.
y = -1.0;
1100 A3.
x = - 5.0; A3.
y = -6.0;
1103 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1106 A1.
x = -5.0; A1.
y = 0.0;
1107 A2.
x = 0.0; A2.
y = 5.0;
1108 A3.
x = 5.0; A3.
y = 0.0;
1111 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 5.0, 0.000001);
1114 A1.
x = -5.0; A1.
y = 0.0;
1115 A2.
x = 0.0; A2.
y = -5.0;
1116 A3.
x = 5.0; A3.
y = 0.0;
1119 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 5.0, 0.000001);
1132 A1.
x = -1; A1.
y = 0;
1133 A2.
x = 0 ; A2.
y = 1;
1134 A3.
x = 1 ; A3.
y = 0;
1138 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1140 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1145 A3.
x = 0; A3.
y = -1;
1149 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1151 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1154 A1.
x = -1; A1.
y = 0;
1156 A3.
x = 0; A3.
y = -1;
1160 CU_ASSERT_DOUBLE_EQUAL(d, 3*M_PI_2, 0.000001);
1162 CU_ASSERT_DOUBLE_EQUAL(d, 3*M_PI_2, 0.000001);
1182 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1189 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1192 P.
y = P.
x = 2 * cos(M_PI_4);
1196 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1207 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0), 0.000001);
1214 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1217 P.
x = -1.5; P.
y = 0;
1221 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1224 P.
x = -2.5; P.
y = 0;
1228 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1231 P.
y = -2.5; P.
x = 0;
1235 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1242 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1.0, 0.000001);
1265 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1275 "lw_dist2d_ptarray_ptarrayarc called with non-arc input");
1284 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1293 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1315 "Both input geometries must have a measure dimension");
1326 "Both input geometries must be linestrings");
1340 "Both input lines must have at least 2 points"
1354 "Both input lines must have at least 2 points"
1592 CU_pSuite suite = CU_add_suite(
"measures", NULL, NULL);
static void test_lw_dist2d_ptarray_ptarrayarc(void)
static void test_lw_arc_length(void)
static void test_rect_tree_intersects_tree(void)
static void test_mindistance2d_tolerance(void)
static void test_lwgeom_is_trajectory(void)
void measures_suite_setup(void)
static int tree_inter(const char *wkt1, const char *wkt2)
static void test_lwgeom_tcpa(void)
static void test_lw_dist2d_seg_arc(void)
static void test_rect_tree_distance_tree(void)
static void test_lw_dist2d_pt_ptarrayarc(void)
static void test_lw_dist2d_arc_arc(void)
#define DIST3DTEST(str1, str2, res, accepted_error)
static void test_rect_tree_contains_point(void)
static void do_test_mindistance_tolerance(char *in1, char *in2, double expected_res, int line, double(*distancef)(const LWGEOM *, const LWGEOM *, double), double accepted_error)
static void test_lwgeom_locate_along(void)
static void test_lwgeom_segmentize2d(void)
static LWGEOM * lwgeom_from_text(const char *str)
static void test_lw_dist2d_pt_arc(void)
static double test_rect_tree_distance_tree_case(const char *wkt1, const char *wkt2)
static void test_mindistance3d_tolerance(void)
static int tree_pt(RECT_NODE *tree, double x, double y)
#define DIST2DTEST(str1, str2, res, accepted_error)
char result[OUT_DOUBLE_BUFFER_SIZE]
void cu_error_msg_reset()
char cu_error_msg[MAX_CUNIT_ERROR_LENGTH+1]
#define ASSERT_DOUBLE_EQUAL(o, e)
#define ASSERT_INT_EQUAL(o, e)
#define PG_ADD_TEST(suite, testfunc)
#define ASSERT_STRING_EQUAL(o, e)
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
void lwgeom_request_interrupt(void)
Request interruption of any running code.
LWGEOM * lwgeom_locate_along(const LWGEOM *lwin, double m, double offset)
Determine the location(s) along a measured line where m occurs and return as a multipoint.
void lwgeom_free(LWGEOM *geom)
#define LW_PARSER_CHECK_NONE
LWGEOM * lwgeom_segmentize2d(const LWGEOM *line, double dist)
int lwgeom_is_trajectory(const LWGEOM *geom)
Return LW_TRUE or LW_FALSE depending on whether or not a geometry is a linestring with measure value ...
int lwgeom_parse_wkt(LWGEOM_PARSER_RESULT *parser_result, char *wktstr, int parse_flags)
Parse a WKT geometry string into an LWGEOM structure.
char * lwgeom_to_ewkt(const LWGEOM *lwgeom)
Return an allocated string.
double lwgeom_tcpa(const LWGEOM *g1, const LWGEOM *g2, double *mindist)
Find the time of closest point of approach.
char * lwgeom_to_wkt(const LWGEOM *geom, uint8_t variant, int precision, size_t *size_out)
WKT emitter function.
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
#define LW_TRUE
Return types for functions with status returns.
#define FLAGS_SET_SOLID(flags, value)
void lwline_free(LWLINE *line)
int lwgeom_cpa_within(const LWGEOM *g1, const LWGEOM *g2, double maxdist)
Is the closest point of approach within a distance ?
double lw_arc_length(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3)
Returns the length of a circular arc segment.
RECT_NODE * rect_tree_from_lwgeom(const LWGEOM *lwgeom)
Create a tree index on top an LWGEOM.
int rect_tree_contains_point(RECT_NODE *node, const POINT2D *pt)
void rect_tree_free(RECT_NODE *node)
Recurse from top of node tree and free all children.
static double distance(double x1, double y1, double x2, double y2)
double rect_tree_distance_tree(RECT_NODE *n1, RECT_NODE *n2, double threshold)
Return the distance between two RECT_NODE trees.
int rect_tree_intersects_tree(RECT_NODE *n1, RECT_NODE *n2)
Test if two RECT_NODE trees intersect one another.
int lw_dist2d_pt_arc(const POINT2D *P, const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, DISTPTS *dl)
int lw_dist2d_seg_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *B1, const POINT2D *B2, const POINT2D *B3, DISTPTS *dl)
Calculate the shortest distance between an arc and an edge.
void lw_dist2d_distpts_init(DISTPTS *dl, int mode)
int lw_dist2d_arc_arc(const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, const POINT2D *B1, const POINT2D *B2, const POINT2D *B3, DISTPTS *dl)
int lw_dist2d_ptarray_ptarrayarc(const POINTARRAY *pa, const POINTARRAY *pb, DISTPTS *dl)
Test each segment of pa against each arc of pb for distance.
int lw_dist2d_pt_ptarrayarc(const POINT2D *p, const POINTARRAY *pa, DISTPTS *dl)
Search all the arcs of pointarray to see which one is closest to p1 Returns minimum distance between ...
Structure used in distance-calculations.
Parser result structure: returns the result of attempting to convert (E)WKT/(E)WKB to LWGEOM.