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;
95 "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)))",
96 "POINT(19925 112376)",
102 DIST2DTEST(
"POINT(0 0)",
"MULTIPOINT(0 1.5,0 2,0 2.5)", 1.5, default_accepted_error);
107 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(POINT(3 4))", 5.0, default_accepted_error);
112 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", 5.0, default_accepted_error);
117 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4))))", 5.0, default_accepted_error);
122 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", 5.0, default_accepted_error);
127 DIST2DTEST(
"GEOMETRYCOLLECTION(POINT(0 0))",
"GEOMETRYCOLLECTION(POINT(3 4))", 5.0, default_accepted_error);
132 DIST2DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", 5.0, default_accepted_error);
137 DIST2DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(0 0)))",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4)))", 5.0, default_accepted_error);
142 DIST2DTEST(
"LINESTRING(-2 0, -0.2 0)",
"POINT(-2 0)", 0, zero_accepted_error);
147 DIST2DTEST(
"LINESTRING(-0.2 0, -2 0)",
"POINT(-2 0)", 0, zero_accepted_error);
152 DIST2DTEST(
"LINESTRING(-1e-8 0, -0.2 0)",
"POINT(-1e-8 0)", 0, zero_accepted_error);
157 DIST2DTEST(
"LINESTRING(-0.2 0, -1e-8 0)",
"POINT(-1e-8 0)", 0, zero_accepted_error);
162 DIST2DTEST(
"CIRCULARSTRING(-1 0, 0 1, 1 0)",
"POINT(0 0)", 1, default_accepted_error);
163 DIST2DTEST(
"CIRCULARSTRING(-3 0, -2 0, -1 0, 0 1, 1 0)",
"POINT(0 0)", 1, default_accepted_error);
168 DIST2DTEST(
"CIRCULARSTRING(-1 0, 0 1, 1 0)",
"CIRCULARSTRING(0 0, 1 -1, 2 0)", 1, default_accepted_error);
173 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)))";
174 DIST2DTEST(cs1,
"POINT(3 14)", 1, default_accepted_error);
175 DIST2DTEST(cs1,
"POINT(3 8)", 0, default_accepted_error);
176 DIST2DTEST(cs1,
"POINT(6 5)", 1, default_accepted_error);
177 DIST2DTEST(cs1,
"POINT(6 4)", 0, default_accepted_error);
182 DIST2DTEST(cs1,
"LINESTRING(0 0, 50 0)", 0.917484, default_accepted_error);
183 DIST2DTEST(cs1,
"LINESTRING(6 0, 10 7)", 0, default_accepted_error);
184 DIST2DTEST(cs1,
"LINESTRING(4 4, 4 8)", 0, default_accepted_error);
185 DIST2DTEST(cs1,
"LINESTRING(4 7, 5 6, 6 7)", 0.585786, default_accepted_error);
186 DIST2DTEST(cs1,
"LINESTRING(10 0, 10 2, 10 0)", 1.52913, default_accepted_error);
191 DIST2DTEST(cs1,
"POLYGON((10 4, 10 8, 13 8, 13 4, 10 4))", 0.58415, default_accepted_error);
192 DIST2DTEST(cs1,
"POLYGON((9 4, 9 8, 12 8, 12 4, 9 4))", 0, default_accepted_error);
193 DIST2DTEST(cs1,
"POLYGON((1 4, 1 8, 4 8, 4 4, 1 4))", 0, default_accepted_error);
198 DIST2DTEST(cs1,
"CURVEPOLYGON(CIRCULARSTRING(-1 4, 0 5, 1 4, 0 3, -1 4))", 0.0475666, default_accepted_error);
199 DIST2DTEST(cs1,
"CURVEPOLYGON(CIRCULARSTRING(1 4, 2 5, 3 4, 2 3, 1 4))", 0.0, default_accepted_error);
204 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)))";
205 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5 2,6 3,7 2,6 1,5 2))", 1, default_accepted_error);
206 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(4 2,5 3,6 2,5 1,4 2))", 0, default_accepted_error);
207 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5 3,6 2,5 1,4 2,5 3))", 0, default_accepted_error);
208 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(4.5 3,5.5 2,4.5 1,3.5 2,4.5 3))", 0, default_accepted_error);
209 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5.5 3,6.5 2,5.5 1,4.5 2,5.5 3))", 0.5, default_accepted_error);
210 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(10 3,11 2,10 1,9 2,10 3))", 0, default_accepted_error);
211 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(2 3,3 2,2 1,1 2,2 3))", 0, default_accepted_error);
212 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5 7,6 8,7 7,6 6,5 7))", 2.60555, default_accepted_error);
217 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);
222 DIST2DTEST(
"LINESTRING(10 0,11 1,12 2,13 3,14 4,15 5,16 6)",
223 "LINESTRING(1 1.5,2 3,3 4.5,4 6,5 7.5,6 9)",
224 8.3205, default_accepted_error);
230 "CURVEPOLYGON(CIRCULARSTRING(7874821 8715927,8907663 8715927,8844683 7750316,7937800 7750316,7874821 8715927))",
231 "POINT(5433865 8243495)", 2271704.2698450615, default_accepted_error);
237 double default_accepted_error = 0.00001;
238 double zero_accepted_error = 0.0;
240 DIST3DTEST(
"POINT(0 0 0)",
"MULTIPOINT(0 1.5 0, 0 2 0, 0 2.5 0)", 1.5, default_accepted_error);
241 DIST3DTEST(
"POINT(0 0 0)",
"MULTIPOINT(0 1.5 0, 0 2 0, 0 2.5 0)", 1.5, default_accepted_error);
242 DIST3DTEST(
"POINT(0 0 0)",
"GEOMETRYCOLLECTION(POINT(3 4 0))", 5.0, default_accepted_error);
243 DIST3DTEST(
"POINT(0 0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4 0)))", 5.0, default_accepted_error);
244 DIST3DTEST(
"POINT(0 0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4 0))))", 5.0, default_accepted_error);
245 DIST3DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", 5.0, default_accepted_error);
246 DIST3DTEST(
"GEOMETRYCOLLECTION(POINT(0 0 0))",
"GEOMETRYCOLLECTION(POINT(3 4 0))", 5.0, default_accepted_error);
247 DIST3DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0 0)))",
248 "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4 0)))",
249 5.0, default_accepted_error);
250 DIST3DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(0 0 0)))",
251 "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4 0)))",
252 5.0, default_accepted_error);
253 DIST3DTEST(
"LINESTRING(-2 0 0, -0.2 0 0)",
"POINT(-2 0 0)", 0, zero_accepted_error);
254 DIST3DTEST(
"LINESTRING(-0.2 0 0, -2 0 0)",
"POINT(-2 0 0)", 0, zero_accepted_error);
255 DIST3DTEST(
"LINESTRING(-1e-8 0 0, -0.2 0 0)",
"POINT(-1e-8 0 0)", 0, zero_accepted_error);
256 DIST3DTEST(
"LINESTRING(-0.2 0 0, -1e-8 0 0)",
"POINT(-1e-8 0 0)", 0, zero_accepted_error);
259 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);
260 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);
261 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);
264 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);
265 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);
266 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);
269 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);
272 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);
275 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);
278 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);
279 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);
280 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);
281 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);
285 "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)))",
286 "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)))",
287 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 (((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)))",
293 0, zero_accepted_error);
297 "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)))",
298 "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)))",
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 "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)))",
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)))",
311 0, zero_accepted_error);
315 "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)))",
317 0, zero_accepted_error);
321 "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)))",
323 1, 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 0, zero_accepted_error);
333 "LINESTRING Z (-27974.1264 -110211.5032 148.9768,-27975.4229 -110210.9441 149.0093)",
334 "LINESTRING Z (-27995.4183 -110201.8041 149.3354,-27975.4229 -110210.9441 149.0093)",
335 0, zero_accepted_error);
353 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);
361 CU_ASSERT_EQUAL(
tree_pt(tree, 5, 7.5), 0);
363 CU_ASSERT_EQUAL(
tree_pt(tree, 8, 9), 1);
365 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 5), 0);
367 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 7.5), 0);
369 CU_ASSERT_EQUAL(
tree_pt(tree, 0.2, 7.5), 0);
371 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 0.5), 1);
373 CU_ASSERT_EQUAL(
tree_pt(tree, 2, 7.5), 1);
375 CU_ASSERT_EQUAL(
tree_pt(tree, 7, 7), 1);
384 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);
388 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 6), 1);
390 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 5.5), 1);
392 CU_ASSERT_EQUAL(
tree_pt(tree, -3, 5.5), 0);
394 CU_ASSERT_EQUAL(
tree_pt(tree, 4, 4), 1);
395 CU_ASSERT_EQUAL(
tree_pt(tree, 6, 6), 1);
397 CU_ASSERT_EQUAL(
tree_pt(tree, 4.5, 4), 1);
399 CU_ASSERT_EQUAL(
tree_pt(tree, 8, 0), 1);
400 CU_ASSERT_EQUAL(
tree_pt(tree, 9, 0), 1);
401 CU_ASSERT_EQUAL(
tree_pt(tree, 10, 1), 1);
402 CU_ASSERT_EQUAL(
tree_pt(tree, 9.5, 1), 1);
403 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 10), 1);
405 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 6), 1);
407 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 6), 0);
409 CU_ASSERT_EQUAL(
tree_pt(tree, 5, 5), 0);
411 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 4), 1);
412 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 6), 1);
413 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 9), 1);
425 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 0.5), 1);
427 CU_ASSERT_EQUAL(
tree_pt(tree, 1.5, 0.5), 0);
429 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 1), 0);
431 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 1), 1);
433 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 1), 1);
435 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 0.5), 1);
445 CU_ASSERT_EQUAL(
tree_pt(tree, -0.5, 0.5), 0);
447 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 1), 0);
449 CU_ASSERT_EQUAL(
tree_pt(tree, 2, 1), 1);
451 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 1), 1);
453 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 3), 1);
455 CU_ASSERT_EQUAL(
tree_pt(tree, 4, 0), 1);
457 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 3), 1);
459 CU_ASSERT_EQUAL(
tree_pt(tree, 2, 0), 1);
467 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);
471 CU_ASSERT_EQUAL(
tree_pt(tree, -0.5, 3.5), 0);
473 CU_ASSERT_EQUAL(
tree_pt(tree, 6.0, 2.2), 0);
475 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 2), 1);
477 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 0), 1);
479 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 6), 1);
481 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 1), 1);
483 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 2), 1);
485 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 6), 1);
510 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
511 "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))",
518 "POLYGON((0.3 0.7, 0.3 0.8, 0.4 0.8, 0.4 0.7, 0.3 0.7))"),
524 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
525 "POLYGON((0.3 0.7, 0.3 0.8, 0.4 0.8, 1.3 0.3, 0.3 0.7))"),
531 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
532 "POLYGON((-1 5, 0 5, 0 7, -1 7, -1 5))"),
538 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
539 "GEOMETRYCOLLECTION(MULTILINESTRING((1 2, 3 2)),POINT(1 2))"),
545 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
546 "GEOMETRYCOLLECTION(MULTILINESTRING((6 3, 8 4)),POINT(5 3))"),
552 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
553 "GEOMETRYCOLLECTION(MULTILINESTRING((6 3, 8 4)),POINT(1 3.5))"),
559 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
560 "GEOMETRYCOLLECTION(MULTILINESTRING((1.5 4.1, 1.6 2)),POINT(1 3.5))"),
589 #define TDT(w1, w2, d) CU_ASSERT_DOUBLE_EQUAL(test_rect_tree_distance_tree_case(w1, w2), d, 0.00001);
596 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)))";
597 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);
600 TDT(wkt,
"MULTIPOINT(0 1.5,0 2,0 2.5)", 1.5);
601 TDT(wkt,
"GEOMETRYCOLLECTION(POINT(3 4))", 5.0);
602 TDT(wkt,
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", 5.0);
603 TDT(wkt,
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4))))", 5.0);
604 TDT(wkt,
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", 5.0);
606 TDT(
"LINESTRING(-2 0, -0.2 0)",
"POINT(-2 0)", 0);
607 TDT(
"LINESTRING(-0.2 0, -2 0)",
"POINT(-2 0)", 0);
608 TDT(
"LINESTRING(-1e-8 0, -0.2 0)",
"POINT(-1e-8 0)", 0);
609 TDT(
"LINESTRING(-0.2 0, -1e-8 0)",
"POINT(-1e-8 0)", 0);
611 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)))";
612 TDT(wkt,
"POINT(3 14)", 1);
613 TDT(wkt,
"POINT(3 8)", 0);
614 TDT(wkt,
"POINT(6 5)", 1);
615 TDT(wkt,
"POINT(6 4)", 0);
617 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)))";
618 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5 7,6 8,7 7,6 6,5 7))", 2.60555);
619 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5 2,6 3,7 2,6 1,5 2))", 1);
620 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(4 2,5 3,6 2,5 1,4 2))", 0);
621 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5 3,6 2,5 1,4 2,5 3))", 0);
622 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(4.5 3,5.5 2,4.5 1,3.5 2,4.5 3))", 0);
623 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5.5 3,6.5 2,5.5 1,4.5 2,5.5 3))", 0.5);
624 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(10 3,11 2,10 1,9 2,10 3))", 0);
625 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(2 3,3 2,2 1,1 2,2 3))", 0);
627 wkt =
"CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,5 0,0 0)))";
628 TDT(wkt,
"POINT(3 0)", 0.0);
629 TDT(wkt,
"POINT(5 0)", 0.0);
630 TDT(wkt,
"POINT(7 0)", 2.0);
631 TDT(wkt,
"POINT(2.5 3.5)", 1.0);
634 TDT(wkt,
"POINT(0 1)", 1.0);
635 TDT(wkt,
"POINT(1 0)", 1.0);
637 wkt =
"LINESTRING(0 0,1 0)";
638 TDT(wkt,
"LINESTRING(1 0,1 1)", 0.0);
639 TDT(wkt,
"LINESTRING(0 1,1 1)", 1.0);
641 wkt =
"POLYGON((0 0,0 1,1 1,1 0,0 0))";
642 TDT(wkt,
"POINT(2 2)", sqrt(2));
643 TDT(wkt,
"POINT(0.5 0.5)", 0);
644 TDT(wkt,
"POINT(1 1)", 0);
646 wkt =
"POLYGON((0 0,0 10,10 10,10 0,0 0), (4 4,4 6,6 6,6 4,4 4))";
647 TDT(wkt,
"POINT(5 5)", 1);
648 TDT(wkt,
"POLYGON((5 5,5 5.5,5.5 5.5,5.5 5, 5 5))", 0.5);
675 CU_ASSERT_EQUAL(lineout, NULL);
683 CU_ASSERT_EQUAL(lineout, NULL);
689 CU_ASSERT_EQUAL(lineout, NULL);
693 "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)))"
697 CU_ASSERT_EQUAL(lineout, NULL);
701 "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))"
703 CU_ASSERT_FATAL(linein != NULL);
706 CU_ASSERT_EQUAL(lineout, NULL);
710 CU_ASSERT_FATAL(linein != NULL);
713 CU_ASSERT_NOT_EQUAL_FATAL(lineout, NULL);
726 double measure = 105.0;
766 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
773 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
780 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0), 0.000001);
787 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1, 0.000001);
794 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
801 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
808 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
818 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
841 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
849 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
853 A1.
x = -2; A1.
y = -2;
857 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
862 A2.
x = 0; A2.
y = 0.5;
865 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
873 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0., 0.000001);
881 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1, 0.000001);
889 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
898 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1, 0.000001);
908 POINT2D A1, A2, A3, B1, B2, B3;
913 A1.
x = -1.0; A1.
y = 4.0;
914 A2.
x = 0.0; A2.
y = 5.0;
915 A3.
x = 1.0; A3.
y = 4.0;
916 B1.
x = 1.0; B1.
y = 6.0;
917 B2.
x = 6.0; B2.
y = 1.0;
918 B3.
x = 9.0; B3.
y = 7.0;
921 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.0475666, 0.000001);
935 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
944 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
953 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2)-1, 0.000001);
962 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
966 A1.
x = -2.0; A1.
y = 0.0;
967 A2.
x = 0.0; A2.
y = 2.0;
968 A3.
x = 2.0; A3.
y = 0.0;
971 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
975 A1.
x = -0.5 / sqrt(2.0); A1.
y = 0.5 / sqrt(2.0);
976 A2.
x = 0.0; A2.
y = 0.5;
977 A3.
x = 0.5 / sqrt(2.0); A3.
y = 0.5 / sqrt(2.0);
980 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
984 A1.
x = -0.5 / sqrt(2.0); A1.
y = -0.5 / sqrt(2.0);
985 A2.
x = -0.5; A2.
y = 0.0;
986 A3.
x = -0.5 / sqrt(2.0); A3.
y = 0.5 / sqrt(2.0);
989 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
993 A1.
x = -0.5 / sqrt(2.0); A1.
y = -0.5 / sqrt(2.0);
994 A2.
x = 0.0; A2.
y = -0.5;
995 A3.
x = 0.5 / sqrt(2.0); A3.
y = -0.5 / sqrt(2.0);
998 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.736813, 0.000001);
1002 A1.
x = -1.0; A1.
y = 0.0;
1003 A2.
x = 0.0; A2.
y = 1.0;
1004 A3.
x = 1.0; A3.
y = 0.0;
1007 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.0, 0.000001);
1010 B1.
x = -10.0; B1.
y = 0.0;
1011 B2.
x = 0.0 ; B2.
y = 10.0;
1012 B3.
x = 10.0 ; B3.
y = 0.0;
1015 A1.
x = -22.0; A1.
y = 0.0;
1016 A2.
x = -17.0; A2.
y = -5.0;
1017 A3.
x = -12.0; A3.
y = 0.0;
1020 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 2.0, 0.000001);
1023 A1.
x = -19.0; A1.
y = 0.0;
1024 A2.
x = -14.0; A2.
y = -5.0;
1025 A3.
x = - 9.0; A3.
y = 0.0;
1028 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1031 A1.
x = -9.0; A1.
y = 0.0;
1032 A2.
x = -4.0; A2.
y = -5.0;
1033 A3.
x = 1.0; A3.
y = 0.0;
1036 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1039 A1.
x = -1.0; A1.
y = 0.0;
1040 A2.
x = 4.0; A2.
y = -5.0;
1041 A3.
x = 9.0; A3.
y = 0.0;
1044 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1047 A1.
x = 1.0; A1.
y = 0.0;
1048 A2.
x = 6.0; A2.
y = -5.0;
1049 A3.
x = 11.0; A3.
y = 0.0;
1052 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1055 A1.
x = 11.0; A1.
y = 0.0;
1056 A2.
x = 16.0; A2.
y = -5.0;
1057 A3.
x = 21.0; A3.
y = 0.0;
1060 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1064 A1.
x = -15.0; A1.
y = -6.0;
1065 A2.
x = -10.0; A2.
y = -1.0;
1066 A3.
x = - 5.0; A3.
y = -6.0;
1069 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1072 A1.
x = -5.0; A1.
y = 0.0;
1073 A2.
x = 0.0; A2.
y = 5.0;
1074 A3.
x = 5.0; A3.
y = 0.0;
1077 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 5.0, 0.000001);
1080 A1.
x = -5.0; A1.
y = 0.0;
1081 A2.
x = 0.0; A2.
y = -5.0;
1082 A3.
x = 5.0; A3.
y = 0.0;
1085 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 5.0, 0.000001);
1098 A1.
x = -1; A1.
y = 0;
1099 A2.
x = 0 ; A2.
y = 1;
1100 A3.
x = 1 ; A3.
y = 0;
1104 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1106 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1111 A3.
x = 0; A3.
y = -1;
1115 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1117 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1120 A1.
x = -1; A1.
y = 0;
1122 A3.
x = 0; A3.
y = -1;
1126 CU_ASSERT_DOUBLE_EQUAL(d, 3*M_PI_2, 0.000001);
1128 CU_ASSERT_DOUBLE_EQUAL(d, 3*M_PI_2, 0.000001);
1148 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1155 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1158 P.
y = P.
x = 2 * cos(M_PI_4);
1162 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1173 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0), 0.000001);
1180 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1183 P.
x = -1.5; P.
y = 0;
1187 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1190 P.
x = -2.5; P.
y = 0;
1194 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1197 P.
y = -2.5; P.
x = 0;
1201 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1208 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1.0, 0.000001);
1231 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1241 "lw_dist2d_ptarray_ptarrayarc called with non-arc input");
1250 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1259 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1281 "Both input geometries must have a measure dimension");
1292 "Both input geometries must be linestrings");
1306 "Both input lines must have at least 2 points"
1320 "Both input lines must have at least 2 points"
1558 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 alloced 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.