PostGIS  3.1.6dev-r@@SVN_REVISION@@

◆ test_rect_tree_contains_point()

static void test_rect_tree_contains_point ( void  )
static

Definition at line 337 of file cu_measures.c.

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