PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ test_rect_tree_contains_point()

static void test_rect_tree_contains_point ( void  )
static

Definition at line 330 of file cu_measures.c.

331{
332 LWGEOM *poly;
333 RECT_NODE* tree;
334
335 /**********************************************************************
336 * curvepolygon
337 */
338 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);
339 tree = rect_tree_from_lwgeom(poly);
340 // char *wkt = rect_tree_to_wkt(tree);
341 // printf("%s\n", wkt);
342 // lwfree(wkt);
343 // return;
344
345 /* in hole, within arc stroke */
346 CU_ASSERT_EQUAL(tree_pt(tree, 5, 7.5), 0);
347 /* inside */
348 CU_ASSERT_EQUAL(tree_pt(tree, 8, 9), 1);
349 /* outside */
350 CU_ASSERT_EQUAL(tree_pt(tree, -1, 5), 0);
351 /* outside */
352 CU_ASSERT_EQUAL(tree_pt(tree, -1, 7.5), 0);
353 /* outside, within arc stroke */
354 CU_ASSERT_EQUAL(tree_pt(tree, 0.2, 7.5), 0);
355 /* inside, within arc stroke */
356 CU_ASSERT_EQUAL(tree_pt(tree, 0.5, 0.5), 1);
357 /* inside, crossing arc stroke */
358 CU_ASSERT_EQUAL(tree_pt(tree, 2, 7.5), 1);
359 /* touching hole corner */
360 CU_ASSERT_EQUAL(tree_pt(tree, 7, 7), 1);
361
362 rect_tree_free(tree);
363 lwgeom_free(poly);
364
365
366 /**********************************************************************
367 * polygon with hole and concavities
368 */
369 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);
370 tree = rect_tree_from_lwgeom(poly);
371
372 /* inside, many grazings */
373 CU_ASSERT_EQUAL(tree_pt(tree, 3, 6), 1);
374 /* inside */
375 CU_ASSERT_EQUAL(tree_pt(tree, 3, 5.5), 1);
376 /* outside */
377 CU_ASSERT_EQUAL(tree_pt(tree, -3, 5.5), 0);
378 /* touching interior ring */
379 CU_ASSERT_EQUAL(tree_pt(tree, 4, 4), 1);
380 CU_ASSERT_EQUAL(tree_pt(tree, 6, 6), 1);
381 /* touching interior ring */
382 CU_ASSERT_EQUAL(tree_pt(tree, 4.5, 4), 1);
383 /* touching exterior ring */
384 CU_ASSERT_EQUAL(tree_pt(tree, 8, 0), 1);
385 CU_ASSERT_EQUAL(tree_pt(tree, 9, 0), 1);
386 CU_ASSERT_EQUAL(tree_pt(tree, 10, 1), 1);
387 CU_ASSERT_EQUAL(tree_pt(tree, 9.5, 1), 1);
388 CU_ASSERT_EQUAL(tree_pt(tree, 0, 10), 1);
389 /* touching grazing spike */
390 CU_ASSERT_EQUAL(tree_pt(tree, 1, 6), 1);
391 /* outide, many grazings */
392 CU_ASSERT_EQUAL(tree_pt(tree, -1, 6), 0);
393 /* within hole */
394 CU_ASSERT_EQUAL(tree_pt(tree, 5, 5), 0);
395 /* within */
396 CU_ASSERT_EQUAL(tree_pt(tree, 0.5, 4), 1);
397 CU_ASSERT_EQUAL(tree_pt(tree, 0.5, 6), 1);
398 CU_ASSERT_EQUAL(tree_pt(tree, 0.5, 9), 1);
399
400 rect_tree_free(tree);
401 lwgeom_free(poly);
402
403 /**********************************************************************
404 * square
405 */
406 poly = lwgeom_from_wkt("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))", LW_PARSER_CHECK_NONE);
407 tree = rect_tree_from_lwgeom(poly);
408
409 /* inside square */
410 CU_ASSERT_EQUAL(tree_pt(tree, 0.5, 0.5), 1);
411 /* outside square */
412 CU_ASSERT_EQUAL(tree_pt(tree, 1.5, 0.5), 0);
413 /* outside square grazing some edges */
414 CU_ASSERT_EQUAL(tree_pt(tree, -1, 1), 0);
415 /* inside square on corner */
416 CU_ASSERT_EQUAL(tree_pt(tree, 1, 1), 1);
417 /* inside square on top edge */
418 CU_ASSERT_EQUAL(tree_pt(tree, 0.5, 1), 1);
419 /* inside square on side edge */
420 CU_ASSERT_EQUAL(tree_pt(tree, 1, 0.5), 1);
421
422 rect_tree_free(tree);
423 lwgeom_free(poly);
424
425 /* ziggy zaggy horizontal saw tooth polygon */
426 poly = lwgeom_from_wkt("POLYGON((0 0, 1 3, 2 0, 3 3, 4 0, 4 5, 0 5, 0 0))", LW_PARSER_CHECK_NONE);
427 tree = rect_tree_from_lwgeom(poly);
428
429 /* not in, left side */
430 CU_ASSERT_EQUAL(tree_pt(tree, -0.5, 0.5), 0);
431 /* not in, right side */
432 CU_ASSERT_EQUAL(tree_pt(tree, 3, 1), 0);
433 /* inside */
434 CU_ASSERT_EQUAL(tree_pt(tree, 2, 1), 1);
435 /* on left border */
436 CU_ASSERT_EQUAL(tree_pt(tree, 0, 1), 1);
437 /* on left border, grazing */
438 CU_ASSERT_EQUAL(tree_pt(tree, 0, 3), 1);
439 /* on right border */
440 CU_ASSERT_EQUAL(tree_pt(tree, 4, 0), 1);
441 /* on tooth concave */
442 CU_ASSERT_EQUAL(tree_pt(tree, 3, 3), 1);
443 /* on tooth convex */
444 CU_ASSERT_EQUAL(tree_pt(tree, 2, 0), 1);
445
446 rect_tree_free(tree);
447 lwgeom_free(poly);
448
449 /**********************************************************************
450 * ziggy zaggy vertical saw tooth polygon
451 */
452 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);
453 tree = rect_tree_from_lwgeom(poly);
454
455 /* not in, left side */
456 CU_ASSERT_EQUAL(tree_pt(tree, -0.5, 3.5), 0);
457 /* not in, right side */
458 CU_ASSERT_EQUAL(tree_pt(tree, 6.0, 2.2), 0);
459 /* inside */
460 CU_ASSERT_EQUAL(tree_pt(tree, 3, 2), 1);
461 /* on bottom border */
462 CU_ASSERT_EQUAL(tree_pt(tree, 1, 0), 1);
463 /* on top border */
464 CU_ASSERT_EQUAL(tree_pt(tree, 3, 6), 1);
465 /* on tooth concave */
466 CU_ASSERT_EQUAL(tree_pt(tree, 3, 1), 1);
467 /* on tooth convex */
468 CU_ASSERT_EQUAL(tree_pt(tree, 0, 2), 1);
469 /* on tooth convex */
470 CU_ASSERT_EQUAL(tree_pt(tree, 0, 6), 1);
471
472 rect_tree_free(tree);
473 lwgeom_free(poly);
474
475}
static int tree_pt(RECT_NODE *tree, double x, double y)
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1138
#define LW_PARSER_CHECK_NONE
Definition liblwgeom.h:2060
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition lwin_wkt.c:905
RECT_NODE * rect_tree_from_lwgeom(const LWGEOM *lwgeom)
Create a tree index on top an LWGEOM.
Definition lwtree.c:861
void rect_tree_free(RECT_NODE *node)
Recurse from top of node tree and free all children.
Definition lwtree.c:69

References LW_PARSER_CHECK_NONE, lwgeom_free(), lwgeom_from_wkt(), rect_tree_free(), rect_tree_from_lwgeom(), and tree_pt().

Referenced by measures_suite_setup().

Here is the call graph for this function:
Here is the caller graph for this function: