PostGIS  3.0.6dev-r@@SVN_REVISION@@

◆ 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)
Definition: cu_measures.c:323
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: