PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ test_rect_tree_contains_point()

static void test_rect_tree_contains_point ( void  )
static

Definition at line 338 of file cu_measures.c.

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