RECT_NODE* tree;
int result;
int boundary = 0;
-
+
/* square */
poly = (LWPOLY*)lwgeom_from_ewkt("POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))", PARSER_CHECK_NONE);
tree = rect_tree_new(poly->rings[0]);
RECT_NODE *tree1, *tree2;
int result;
+ /* total overlap, A == B */
poly1 = (LWPOLY*)lwgeom_from_ewkt("POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))", PARSER_CHECK_NONE);
poly2 = (LWPOLY*)lwgeom_from_ewkt("POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))", PARSER_CHECK_NONE);
tree1 = rect_tree_new(poly1->rings[0]);
rect_tree_free(tree1);
rect_tree_free(tree2);
+ /* hiding between the tines of the comb */
poly1 = (LWPOLY*)lwgeom_from_ewkt("POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))", PARSER_CHECK_NONE);
poly2 = (LWPOLY*)lwgeom_from_ewkt("POLYGON((0.3 0.7, 0.3 0.8, 0.4 0.8, 0.4 0.7, 0.3 0.7))", PARSER_CHECK_NONE);
tree1 = rect_tree_new(poly1->rings[0]);
rect_tree_free(tree1);
rect_tree_free(tree2);
+ /* between the tines, but with a corner overlapping */
poly1 = (LWPOLY*)lwgeom_from_ewkt("POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))", PARSER_CHECK_NONE);
poly2 = (LWPOLY*)lwgeom_from_ewkt("POLYGON((0.3 0.7, 0.3 0.8, 0.4 0.8, 1.3 0.3, 0.3 0.7))", PARSER_CHECK_NONE);
tree1 = rect_tree_new(poly1->rings[0]);
lwpoly_free(poly2);
rect_tree_free(tree1);
rect_tree_free(tree2);
-/*
+
+ /* Just touching the top left corner of the comb */
poly1 = (LWPOLY*)lwgeom_from_ewkt("POLYGON((0 0, 3 1, 0 2, 3 3, 0 4, 3 5, 0 6, 5 6, 5 0, 0 0))", PARSER_CHECK_NONE);
poly2 = (LWPOLY*)lwgeom_from_ewkt("POLYGON((-1 5, 0 5, 0 7, -1 7, -1 5))", PARSER_CHECK_NONE);
tree1 = rect_tree_new(poly1->rings[0]);
lwpoly_free(poly2);
rect_tree_free(tree1);
rect_tree_free(tree2);
-*/
+
}
int rect_tree_intersects_tree(const RECT_NODE *n1, const RECT_NODE *n2)
{
+ LWDEBUGF(4,"n1 (%.9g %.9g,%.9g %.9g) vs n2 (%.9g %.9g,%.9g %.9g)",n1->xmin,n1->ymin,n1->xmax,n1->ymax,n2->xmin,n2->ymin,n2->xmax,n2->ymax);
/* There can only be an edge intersection if the rectangles overlap */
- if( ! ( FP_GTEQ(n1->xmin, n2->xmax) || FP_GTEQ(n2->xmin, n1->xmax) || FP_GTEQ(n1->ymin, n2->ymax) || FP_GTEQ(n2->ymin, n1->ymax) ) )
+ if( ! ( FP_GT(n1->xmin, n2->xmax) || FP_GT(n2->xmin, n1->xmax) || FP_GT(n1->ymin, n2->ymax) || FP_GT(n2->ymin, n1->ymax) ) )
{
+ LWDEBUG(4," interaction found");
/* We can only test for a true intersection if the nodes are both leaf nodes */
if( rect_node_is_leaf(n1) && rect_node_is_leaf(n2) )
{
+ LWDEBUG(4," leaf node test");
/* Check for true intersection */
if( lw_segment_intersects(n1->p1, n1->p2, n2->p1, n2->p2) )
return LW_TRUE;
}
else
{
+ LWDEBUG(4," internal node found, recursing");
/* Recurse to children */
if( rect_node_is_leaf(n1) )
{
}
else
{
+ LWDEBUG(4," no interaction found");
return LW_FALSE;
}
}