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 DIST2DTEST(
"POINT(0 0)",
"MULTIPOINT(0 1.5,0 2,0 2.5)", 1.5, default_accepted_error);
100 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(POINT(3 4))", 5.0, default_accepted_error);
105 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", 5.0, default_accepted_error);
110 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4))))", 5.0, default_accepted_error);
115 DIST2DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", 5.0, default_accepted_error);
120 DIST2DTEST(
"GEOMETRYCOLLECTION(POINT(0 0))",
"GEOMETRYCOLLECTION(POINT(3 4))", 5.0, default_accepted_error);
125 DIST2DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", 5.0, default_accepted_error);
130 DIST2DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(0 0)))",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4)))", 5.0, default_accepted_error);
135 DIST2DTEST(
"LINESTRING(-2 0, -0.2 0)",
"POINT(-2 0)", 0, zero_accepted_error);
140 DIST2DTEST(
"LINESTRING(-0.2 0, -2 0)",
"POINT(-2 0)", 0, zero_accepted_error);
145 DIST2DTEST(
"LINESTRING(-1e-8 0, -0.2 0)",
"POINT(-1e-8 0)", 0, zero_accepted_error);
150 DIST2DTEST(
"LINESTRING(-0.2 0, -1e-8 0)",
"POINT(-1e-8 0)", 0, zero_accepted_error);
155 DIST2DTEST(
"CIRCULARSTRING(-1 0, 0 1, 1 0)",
"POINT(0 0)", 1, default_accepted_error);
156 DIST2DTEST(
"CIRCULARSTRING(-3 0, -2 0, -1 0, 0 1, 1 0)",
"POINT(0 0)", 1, default_accepted_error);
161 DIST2DTEST(
"CIRCULARSTRING(-1 0, 0 1, 1 0)",
"CIRCULARSTRING(0 0, 1 -1, 2 0)", 1, default_accepted_error);
166 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)))";
167 DIST2DTEST(cs1,
"POINT(3 14)", 1, default_accepted_error);
168 DIST2DTEST(cs1,
"POINT(3 8)", 0, default_accepted_error);
169 DIST2DTEST(cs1,
"POINT(6 5)", 1, default_accepted_error);
170 DIST2DTEST(cs1,
"POINT(6 4)", 0, default_accepted_error);
175 DIST2DTEST(cs1,
"LINESTRING(0 0, 50 0)", 0.917484, default_accepted_error);
176 DIST2DTEST(cs1,
"LINESTRING(6 0, 10 7)", 0, default_accepted_error);
177 DIST2DTEST(cs1,
"LINESTRING(4 4, 4 8)", 0, default_accepted_error);
178 DIST2DTEST(cs1,
"LINESTRING(4 7, 5 6, 6 7)", 0.585786, default_accepted_error);
179 DIST2DTEST(cs1,
"LINESTRING(10 0, 10 2, 10 0)", 1.52913, default_accepted_error);
184 DIST2DTEST(cs1,
"POLYGON((10 4, 10 8, 13 8, 13 4, 10 4))", 0.58415, default_accepted_error);
185 DIST2DTEST(cs1,
"POLYGON((9 4, 9 8, 12 8, 12 4, 9 4))", 0, default_accepted_error);
186 DIST2DTEST(cs1,
"POLYGON((1 4, 1 8, 4 8, 4 4, 1 4))", 0, default_accepted_error);
191 DIST2DTEST(cs1,
"CURVEPOLYGON(CIRCULARSTRING(-1 4, 0 5, 1 4, 0 3, -1 4))", 0.0475666, default_accepted_error);
192 DIST2DTEST(cs1,
"CURVEPOLYGON(CIRCULARSTRING(1 4, 2 5, 3 4, 2 3, 1 4))", 0.0, default_accepted_error);
197 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)))";
198 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5 2,6 3,7 2,6 1,5 2))", 1, default_accepted_error);
199 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(4 2,5 3,6 2,5 1,4 2))", 0, default_accepted_error);
200 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5 3,6 2,5 1,4 2,5 3))", 0, default_accepted_error);
201 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(4.5 3,5.5 2,4.5 1,3.5 2,4.5 3))", 0, default_accepted_error);
202 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5.5 3,6.5 2,5.5 1,4.5 2,5.5 3))", 0.5, default_accepted_error);
203 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(10 3,11 2,10 1,9 2,10 3))", 0, default_accepted_error);
204 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(2 3,3 2,2 1,1 2,2 3))", 0, default_accepted_error);
205 DIST2DTEST(cs2,
"CURVEPOLYGON(CIRCULARSTRING(5 7,6 8,7 7,6 6,5 7))", 2.60555, default_accepted_error);
210 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);
215 DIST2DTEST(
"LINESTRING(10 0,11 1,12 2,13 3,14 4,15 5,16 6)",
216 "LINESTRING(1 1.5,2 3,3 4.5,4 6,5 7.5,6 9)",
217 8.3205, default_accepted_error);
223 "CURVEPOLYGON(CIRCULARSTRING(7874821 8715927,8907663 8715927,8844683 7750316,7937800 7750316,7874821 8715927))",
224 "POINT(5433865 8243495)", 2271704.2698450615, default_accepted_error);
230 double default_accepted_error = 0.00001;
231 double zero_accepted_error = 0.0;
233 DIST3DTEST(
"POINT(0 0 0)",
"MULTIPOINT(0 1.5 0, 0 2 0, 0 2.5 0)", 1.5, default_accepted_error);
234 DIST3DTEST(
"POINT(0 0 0)",
"MULTIPOINT(0 1.5 0, 0 2 0, 0 2.5 0)", 1.5, default_accepted_error);
235 DIST3DTEST(
"POINT(0 0 0)",
"GEOMETRYCOLLECTION(POINT(3 4 0))", 5.0, default_accepted_error);
236 DIST3DTEST(
"POINT(0 0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4 0)))", 5.0, default_accepted_error);
237 DIST3DTEST(
"POINT(0 0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4 0))))", 5.0, default_accepted_error);
238 DIST3DTEST(
"POINT(0 0)",
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", 5.0, default_accepted_error);
239 DIST3DTEST(
"GEOMETRYCOLLECTION(POINT(0 0 0))",
"GEOMETRYCOLLECTION(POINT(3 4 0))", 5.0, default_accepted_error);
240 DIST3DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0 0)))",
241 "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4 0)))",
242 5.0, default_accepted_error);
243 DIST3DTEST(
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(0 0 0)))",
244 "GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4 0)))",
245 5.0, default_accepted_error);
246 DIST3DTEST(
"LINESTRING(-2 0 0, -0.2 0 0)",
"POINT(-2 0 0)", 0, zero_accepted_error);
247 DIST3DTEST(
"LINESTRING(-0.2 0 0, -2 0 0)",
"POINT(-2 0 0)", 0, zero_accepted_error);
248 DIST3DTEST(
"LINESTRING(-1e-8 0 0, -0.2 0 0)",
"POINT(-1e-8 0 0)", 0, zero_accepted_error);
249 DIST3DTEST(
"LINESTRING(-0.2 0 0, -1e-8 0 0)",
"POINT(-1e-8 0 0)", 0, zero_accepted_error);
252 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);
253 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);
254 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);
257 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);
258 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);
259 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);
262 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);
265 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);
268 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);
271 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);
272 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);
273 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);
274 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);
278 "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)))",
279 "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)))",
280 0, zero_accepted_error);
284 "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)))",
285 "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)))",
286 0, zero_accepted_error);
290 "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)))",
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 0, zero_accepted_error);
296 "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)))",
297 "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)))",
298 0, zero_accepted_error);
302 "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 0, zero_accepted_error);
308 "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)))",
310 0, zero_accepted_error);
314 "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)))",
316 1, zero_accepted_error);
320 "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)))",
322 0, zero_accepted_error);
326 "LINESTRING Z (-27974.1264 -110211.5032 148.9768,-27975.4229 -110210.9441 149.0093)",
327 "LINESTRING Z (-27995.4183 -110201.8041 149.3354,-27975.4229 -110210.9441 149.0093)",
328 0, zero_accepted_error);
346 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);
354 CU_ASSERT_EQUAL(
tree_pt(tree, 5, 7.5), 0);
356 CU_ASSERT_EQUAL(
tree_pt(tree, 8, 9), 1);
358 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 5), 0);
360 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 7.5), 0);
362 CU_ASSERT_EQUAL(
tree_pt(tree, 0.2, 7.5), 0);
364 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 0.5), 1);
366 CU_ASSERT_EQUAL(
tree_pt(tree, 2, 7.5), 1);
368 CU_ASSERT_EQUAL(
tree_pt(tree, 7, 7), 1);
377 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);
381 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 6), 1);
383 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 5.5), 1);
385 CU_ASSERT_EQUAL(
tree_pt(tree, -3, 5.5), 0);
387 CU_ASSERT_EQUAL(
tree_pt(tree, 4, 4), 1);
388 CU_ASSERT_EQUAL(
tree_pt(tree, 6, 6), 1);
390 CU_ASSERT_EQUAL(
tree_pt(tree, 4.5, 4), 1);
392 CU_ASSERT_EQUAL(
tree_pt(tree, 8, 0), 1);
393 CU_ASSERT_EQUAL(
tree_pt(tree, 9, 0), 1);
394 CU_ASSERT_EQUAL(
tree_pt(tree, 10, 1), 1);
395 CU_ASSERT_EQUAL(
tree_pt(tree, 9.5, 1), 1);
396 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 10), 1);
398 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 6), 1);
400 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 6), 0);
402 CU_ASSERT_EQUAL(
tree_pt(tree, 5, 5), 0);
404 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 4), 1);
405 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 6), 1);
406 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 9), 1);
418 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 0.5), 1);
420 CU_ASSERT_EQUAL(
tree_pt(tree, 1.5, 0.5), 0);
422 CU_ASSERT_EQUAL(
tree_pt(tree, -1, 1), 0);
424 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 1), 1);
426 CU_ASSERT_EQUAL(
tree_pt(tree, 0.5, 1), 1);
428 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 0.5), 1);
438 CU_ASSERT_EQUAL(
tree_pt(tree, -0.5, 0.5), 0);
440 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 1), 0);
442 CU_ASSERT_EQUAL(
tree_pt(tree, 2, 1), 1);
444 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 1), 1);
446 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 3), 1);
448 CU_ASSERT_EQUAL(
tree_pt(tree, 4, 0), 1);
450 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 3), 1);
452 CU_ASSERT_EQUAL(
tree_pt(tree, 2, 0), 1);
460 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);
464 CU_ASSERT_EQUAL(
tree_pt(tree, -0.5, 3.5), 0);
466 CU_ASSERT_EQUAL(
tree_pt(tree, 6.0, 2.2), 0);
468 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 2), 1);
470 CU_ASSERT_EQUAL(
tree_pt(tree, 1, 0), 1);
472 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 6), 1);
474 CU_ASSERT_EQUAL(
tree_pt(tree, 3, 1), 1);
476 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 2), 1);
478 CU_ASSERT_EQUAL(
tree_pt(tree, 0, 6), 1);
503 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
504 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))"),
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.3 0.7, 0.3 0.8, 0.4 0.8, 0.4 0.7, 0.3 0.7))"),
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, 1.3 0.3, 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((-1 5, 0 5, 0 7, -1 7, -1 5))"),
531 "POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))",
532 "GEOMETRYCOLLECTION(MULTILINESTRING((1 2, 3 2)),POINT(1 2))"),
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((6 3, 8 4)),POINT(5 3))"),
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(1 3.5))"),
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((1.5 4.1, 1.6 2)),POINT(1 3.5))"),
582 #define TDT(w1, w2, d) CU_ASSERT_DOUBLE_EQUAL(test_rect_tree_distance_tree_case(w1, w2), d, 0.00001);
589 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)))";
590 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);
593 TDT(wkt,
"MULTIPOINT(0 1.5,0 2,0 2.5)", 1.5);
594 TDT(wkt,
"GEOMETRYCOLLECTION(POINT(3 4))", 5.0);
595 TDT(wkt,
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4)))", 5.0);
596 TDT(wkt,
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(3 4))))", 5.0);
597 TDT(wkt,
"GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(MULTIPOINT(3 4))))", 5.0);
599 TDT(
"LINESTRING(-2 0, -0.2 0)",
"POINT(-2 0)", 0);
600 TDT(
"LINESTRING(-0.2 0, -2 0)",
"POINT(-2 0)", 0);
601 TDT(
"LINESTRING(-1e-8 0, -0.2 0)",
"POINT(-1e-8 0)", 0);
602 TDT(
"LINESTRING(-0.2 0, -1e-8 0)",
"POINT(-1e-8 0)", 0);
604 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)))";
605 TDT(wkt,
"POINT(3 14)", 1);
606 TDT(wkt,
"POINT(3 8)", 0);
607 TDT(wkt,
"POINT(6 5)", 1);
608 TDT(wkt,
"POINT(6 4)", 0);
610 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)))";
611 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5 7,6 8,7 7,6 6,5 7))", 2.60555);
612 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5 2,6 3,7 2,6 1,5 2))", 1);
613 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(4 2,5 3,6 2,5 1,4 2))", 0);
614 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5 3,6 2,5 1,4 2,5 3))", 0);
615 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(4.5 3,5.5 2,4.5 1,3.5 2,4.5 3))", 0);
616 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(5.5 3,6.5 2,5.5 1,4.5 2,5.5 3))", 0.5);
617 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(10 3,11 2,10 1,9 2,10 3))", 0);
618 TDT(wkt,
"CURVEPOLYGON(CIRCULARSTRING(2 3,3 2,2 1,1 2,2 3))", 0);
620 wkt =
"CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,5 0,0 0)))";
621 TDT(wkt,
"POINT(3 0)", 0.0);
622 TDT(wkt,
"POINT(5 0)", 0.0);
623 TDT(wkt,
"POINT(7 0)", 2.0);
624 TDT(wkt,
"POINT(2.5 3.5)", 1.0);
627 TDT(wkt,
"POINT(0 1)", 1.0);
628 TDT(wkt,
"POINT(1 0)", 1.0);
630 wkt =
"LINESTRING(0 0,1 0)";
631 TDT(wkt,
"LINESTRING(1 0,1 1)", 0.0);
632 TDT(wkt,
"LINESTRING(0 1,1 1)", 1.0);
634 wkt =
"POLYGON((0 0,0 1,1 1,1 0,0 0))";
635 TDT(wkt,
"POINT(2 2)", sqrt(2));
636 TDT(wkt,
"POINT(0.5 0.5)", 0);
637 TDT(wkt,
"POINT(1 1)", 0);
639 wkt =
"POLYGON((0 0,0 10,10 10,10 0,0 0), (4 4,4 6,6 6,6 4,4 4))";
640 TDT(wkt,
"POINT(5 5)", 1);
641 TDT(wkt,
"POLYGON((5 5,5 5.5,5.5 5.5,5.5 5, 5 5))", 0.5);
668 CU_ASSERT_EQUAL(lineout, NULL);
676 CU_ASSERT_EQUAL(lineout, NULL);
682 CU_ASSERT_EQUAL(lineout, NULL);
686 "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)))"
690 CU_ASSERT_EQUAL(lineout, NULL);
694 "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))"
696 CU_ASSERT_FATAL(linein != NULL);
699 CU_ASSERT_EQUAL(lineout, NULL);
703 CU_ASSERT_FATAL(linein != NULL);
706 CU_ASSERT_NOT_EQUAL_FATAL(lineout, NULL);
719 double measure = 105.0;
759 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
766 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
773 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0), 0.000001);
780 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1, 0.000001);
787 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
794 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
801 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
811 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
834 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
842 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
846 A1.
x = -2; A1.
y = -2;
850 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
855 A2.
x = 0; A2.
y = 0.5;
858 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
866 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0., 0.000001);
874 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1, 0.000001);
882 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
891 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1, 0.000001);
901 POINT2D A1, A2, A3, B1, B2, B3;
906 A1.
x = -1.0; A1.
y = 4.0;
907 A2.
x = 0.0; A2.
y = 5.0;
908 A3.
x = 1.0; A3.
y = 4.0;
909 B1.
x = 1.0; B1.
y = 6.0;
910 B2.
x = 6.0; B2.
y = 1.0;
911 B3.
x = 9.0; B3.
y = 7.0;
914 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.0475666, 0.000001);
928 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
937 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
946 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2)-1, 0.000001);
955 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0, 0.000001);
959 A1.
x = -2.0; A1.
y = 0.0;
960 A2.
x = 0.0; A2.
y = 2.0;
961 A3.
x = 2.0; A3.
y = 0.0;
964 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
968 A1.
x = -0.5 / sqrt(2.0); A1.
y = 0.5 / sqrt(2.0);
969 A2.
x = 0.0; A2.
y = 0.5;
970 A3.
x = 0.5 / sqrt(2.0); A3.
y = 0.5 / sqrt(2.0);
973 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
977 A1.
x = -0.5 / sqrt(2.0); A1.
y = -0.5 / sqrt(2.0);
978 A2.
x = -0.5; A2.
y = 0.0;
979 A3.
x = -0.5 / sqrt(2.0); A3.
y = 0.5 / sqrt(2.0);
982 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
986 A1.
x = -0.5 / sqrt(2.0); A1.
y = -0.5 / sqrt(2.0);
987 A2.
x = 0.0; A2.
y = -0.5;
988 A3.
x = 0.5 / sqrt(2.0); A3.
y = -0.5 / sqrt(2.0);
991 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.736813, 0.000001);
995 A1.
x = -1.0; A1.
y = 0.0;
996 A2.
x = 0.0; A2.
y = 1.0;
997 A3.
x = 1.0; A3.
y = 0.0;
1000 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.0, 0.000001);
1003 B1.
x = -10.0; B1.
y = 0.0;
1004 B2.
x = 0.0 ; B2.
y = 10.0;
1005 B3.
x = 10.0 ; B3.
y = 0.0;
1008 A1.
x = -22.0; A1.
y = 0.0;
1009 A2.
x = -17.0; A2.
y = -5.0;
1010 A3.
x = -12.0; A3.
y = 0.0;
1013 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 2.0, 0.000001);
1016 A1.
x = -19.0; A1.
y = 0.0;
1017 A2.
x = -14.0; A2.
y = -5.0;
1018 A3.
x = - 9.0; A3.
y = 0.0;
1021 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1024 A1.
x = -9.0; A1.
y = 0.0;
1025 A2.
x = -4.0; A2.
y = -5.0;
1026 A3.
x = 1.0; A3.
y = 0.0;
1029 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1032 A1.
x = -1.0; A1.
y = 0.0;
1033 A2.
x = 4.0; A2.
y = -5.0;
1034 A3.
x = 9.0; A3.
y = 0.0;
1037 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1040 A1.
x = 1.0; A1.
y = 0.0;
1041 A2.
x = 6.0; A2.
y = -5.0;
1042 A3.
x = 11.0; A3.
y = 0.0;
1045 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1048 A1.
x = 11.0; A1.
y = 0.0;
1049 A2.
x = 16.0; A2.
y = -5.0;
1050 A3.
x = 21.0; A3.
y = 0.0;
1053 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1057 A1.
x = -15.0; A1.
y = -6.0;
1058 A2.
x = -10.0; A2.
y = -1.0;
1059 A3.
x = - 5.0; A3.
y = -6.0;
1062 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1.0, 0.000001);
1065 A1.
x = -5.0; A1.
y = 0.0;
1066 A2.
x = 0.0; A2.
y = 5.0;
1067 A3.
x = 5.0; A3.
y = 0.0;
1070 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 5.0, 0.000001);
1073 A1.
x = -5.0; A1.
y = 0.0;
1074 A2.
x = 0.0; A2.
y = -5.0;
1075 A3.
x = 5.0; A3.
y = 0.0;
1078 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 5.0, 0.000001);
1091 A1.
x = -1; A1.
y = 0;
1092 A2.
x = 0 ; A2.
y = 1;
1093 A3.
x = 1 ; A3.
y = 0;
1097 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1099 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1104 A3.
x = 0; A3.
y = -1;
1108 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1110 CU_ASSERT_DOUBLE_EQUAL(d, M_PI, 0.000001);
1113 A1.
x = -1; A1.
y = 0;
1115 A3.
x = 0; A3.
y = -1;
1119 CU_ASSERT_DOUBLE_EQUAL(d, 3*M_PI_2, 0.000001);
1121 CU_ASSERT_DOUBLE_EQUAL(d, 3*M_PI_2, 0.000001);
1141 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1148 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1151 P.
y = P.
x = 2 * cos(M_PI_4);
1155 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1166 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0), 0.000001);
1173 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1176 P.
x = -1.5; P.
y = 0;
1180 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1183 P.
x = -2.5; P.
y = 0;
1187 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1190 P.
y = -2.5; P.
x = 0;
1194 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1201 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, sqrt(2.0)-1.0, 0.000001);
1224 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1234 "lw_dist2d_ptarray_ptarrayarc called with non-arc input");
1243 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 1, 0.000001);
1252 CU_ASSERT_DOUBLE_EQUAL(dl.
distance, 0.5, 0.000001);
1274 "Both input geometries must have a measure dimension");
1285 "Both input geometries must be linestrings");
1299 "Both input lines must have at least 2 points"
1313 "Both input lines must have at least 2 points"
1551 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.