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

◆ test_rect_tree_contains_point()

static void test_rect_tree_contains_point ( void  )
static

Definition at line 351 of file cu_measures.c.

352{
353 LWGEOM *poly;
354 RECT_NODE* tree;
355
356 /**********************************************************************
357 * curvepolygon
358 */
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);
360 tree = rect_tree_from_lwgeom(poly);
361 // char *wkt = rect_tree_to_wkt(tree);
362 // printf("%s\n", wkt);
363 // lwfree(wkt);
364 // return;
365
366 /* in hole, within arc stroke */
367 CU_ASSERT_EQUAL(tree_pt(tree, 5, 7.5), 0);
368 /* inside */
369 CU_ASSERT_EQUAL(tree_pt(tree, 8, 9), 1);
370 /* outside */
371 CU_ASSERT_EQUAL(tree_pt(tree, -1, 5), 0);
372 /* outside */
373 CU_ASSERT_EQUAL(tree_pt(tree, -1, 7.5), 0);
374 /* outside, within arc stroke */
375 CU_ASSERT_EQUAL(tree_pt(tree, 0.2, 7.5), 0);
376 /* inside, within arc stroke */
377 CU_ASSERT_EQUAL(tree_pt(tree, 0.5, 0.5), 1);
378 /* inside, crossing arc stroke */
379 CU_ASSERT_EQUAL(tree_pt(tree, 2, 7.5), 1);
380 /* touching hole corner */
381 CU_ASSERT_EQUAL(tree_pt(tree, 7, 7), 1);
382
383 rect_tree_free(tree);
384 lwgeom_free(poly);
385
386
387 /**********************************************************************
388 * polygon with hole and concavities
389 */
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);
391 tree = rect_tree_from_lwgeom(poly);
392
393 /* inside, many grazings */
394 CU_ASSERT_EQUAL(tree_pt(tree, 3, 6), 1);
395 /* inside */
396 CU_ASSERT_EQUAL(tree_pt(tree, 3, 5.5), 1);
397 /* outside */
398 CU_ASSERT_EQUAL(tree_pt(tree, -3, 5.5), 0);
399 /* touching interior ring */
400 CU_ASSERT_EQUAL(tree_pt(tree, 4, 4), 1);
401 CU_ASSERT_EQUAL(tree_pt(tree, 6, 6), 1);
402 /* touching interior ring */
403 CU_ASSERT_EQUAL(tree_pt(tree, 4.5, 4), 1);
404 /* touching exterior ring */
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);
410 /* touching grazing spike */
411 CU_ASSERT_EQUAL(tree_pt(tree, 1, 6), 1);
412 /* outide, many grazings */
413 CU_ASSERT_EQUAL(tree_pt(tree, -1, 6), 0);
414 /* within hole */
415 CU_ASSERT_EQUAL(tree_pt(tree, 5, 5), 0);
416 /* within */
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);
420
421 rect_tree_free(tree);
422 lwgeom_free(poly);
423
424 /**********************************************************************
425 * square
426 */
427 poly = lwgeom_from_wkt("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))", LW_PARSER_CHECK_NONE);
428 tree = rect_tree_from_lwgeom(poly);
429
430 /* inside square */
431 CU_ASSERT_EQUAL(tree_pt(tree, 0.5, 0.5), 1);
432 /* outside square */
433 CU_ASSERT_EQUAL(tree_pt(tree, 1.5, 0.5), 0);
434 /* outside square grazing some edges */
435 CU_ASSERT_EQUAL(tree_pt(tree, -1, 1), 0);
436 /* inside square on corner */
437 CU_ASSERT_EQUAL(tree_pt(tree, 1, 1), 1);
438 /* inside square on top edge */
439 CU_ASSERT_EQUAL(tree_pt(tree, 0.5, 1), 1);
440 /* inside square on side edge */
441 CU_ASSERT_EQUAL(tree_pt(tree, 1, 0.5), 1);
442
443 rect_tree_free(tree);
444 lwgeom_free(poly);
445
446 /* ziggy zaggy horizontal saw tooth polygon */
447 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);
448 tree = rect_tree_from_lwgeom(poly);
449
450 /* not in, left side */
451 CU_ASSERT_EQUAL(tree_pt(tree, -0.5, 0.5), 0);
452 /* not in, right side */
453 CU_ASSERT_EQUAL(tree_pt(tree, 3, 1), 0);
454 /* inside */
455 CU_ASSERT_EQUAL(tree_pt(tree, 2, 1), 1);
456 /* on left border */
457 CU_ASSERT_EQUAL(tree_pt(tree, 0, 1), 1);
458 /* on left border, grazing */
459 CU_ASSERT_EQUAL(tree_pt(tree, 0, 3), 1);
460 /* on right border */
461 CU_ASSERT_EQUAL(tree_pt(tree, 4, 0), 1);
462 /* on tooth concave */
463 CU_ASSERT_EQUAL(tree_pt(tree, 3, 3), 1);
464 /* on tooth convex */
465 CU_ASSERT_EQUAL(tree_pt(tree, 2, 0), 1);
466
467 rect_tree_free(tree);
468 lwgeom_free(poly);
469
470 /**********************************************************************
471 * ziggy zaggy vertical saw tooth polygon
472 */
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);
474 tree = rect_tree_from_lwgeom(poly);
475
476 /* not in, left side */
477 CU_ASSERT_EQUAL(tree_pt(tree, -0.5, 3.5), 0);
478 /* not in, right side */
479 CU_ASSERT_EQUAL(tree_pt(tree, 6.0, 2.2), 0);
480 /* inside */
481 CU_ASSERT_EQUAL(tree_pt(tree, 3, 2), 1);
482 /* on bottom border */
483 CU_ASSERT_EQUAL(tree_pt(tree, 1, 0), 1);
484 /* on top border */
485 CU_ASSERT_EQUAL(tree_pt(tree, 3, 6), 1);
486 /* on tooth concave */
487 CU_ASSERT_EQUAL(tree_pt(tree, 3, 1), 1);
488 /* on tooth convex */
489 CU_ASSERT_EQUAL(tree_pt(tree, 0, 2), 1);
490 /* on tooth convex */
491 CU_ASSERT_EQUAL(tree_pt(tree, 0, 6), 1);
492
493 rect_tree_free(tree);
494 lwgeom_free(poly);
495
496}
static int tree_pt(RECT_NODE *tree, double x, double y)
void lwgeom_free(LWGEOM *geom)
Definition lwgeom.c:1246
#define LW_PARSER_CHECK_NONE
Definition liblwgeom.h:2149
LWGEOM * lwgeom_from_wkt(const char *wkt, const char check)
Definition lwin_wkt.c:940
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: