PostGIS  3.6.1dev-r@@SVN_REVISION@@

◆ 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)
Definition: cu_measures.c:344
void lwgeom_free(LWGEOM *geom)
Definition: lwgeom.c:1218
#define LW_PARSER_CHECK_NONE
Definition: liblwgeom.h:2146
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: