{
switch (direction) {
case 0: /* up */
- case 1: /* right */
- return MAX(a, b);
- case 2: /* down */
case 3: /* left */
return MIN(a, b);
+ case 1: /* right */
+ case 2: /* down */
+ return MAX(a, b);
}
trap();
ch1 = node->child[0];
ch2 = node->child[1];
break;
- case 1: /* left */
+ case 1: /* right */
ch1 = node->child[1];
ch2 = node->child[3];
break;
ch1 = node->child[2];
ch2 = node->child[3];
break;
- case 3: /* right */
+ case 3: /* left */
ch1 = node->child[0];
ch2 = node->child[2];
break;
}
if (ch1)
- return maxv_by_dir(ch1, direction);
+ return quadtree_get_max_dimension(ch1, direction);
if (ch2)
- return maxv_by_dir(ch2, direction);
+ return quadtree_get_max_dimension(ch2, direction);
return maxv_by_dir(node, direction);
}
static void quadtree_get_tree_dimensions(struct quadtree *node,
struct vector *corner)
{
- corner[0].y = quadtree_get_max_dimension(node, 0);
+ corner[0].y = quadtree_get_max_dimension(node, 2);
corner[0].x = quadtree_get_max_dimension(node, 1);
- corner[1].y = quadtree_get_max_dimension(node, 2);
+ corner[1].y = quadtree_get_max_dimension(node, 0);
corner[1].x = quadtree_get_max_dimension(node, 3);
}
static int is_within(struct vector *pos, struct vector *corner)
{
- if (pos->x > corner[1].x && pos->x < corner[0].x &&
- pos->y > corner[1].y && pos->y < corner[0].y)
+ if ((pos->x >= corner[1].x) && (pos->x <= corner[0].x) &&
+ (pos->y >= corner[1].y) && (pos->y <= corner[0].y))
return 1;
return 0;
}
{
switch (dir) {
case QUADTREE_UPLEFT:
- corner[0].x = node->pos.x;
- corner[1].y = node->pos.y;
+ corner[0] = node->pos;
break;
case QUADTREE_UPRIGHT:
- corner[1] = node->pos;
+ corner[0].x = node->pos.x;
+ corner[1].y = node->pos.y;
break;
case QUADTREE_DOWNRIGHT:
- corner[0].y = node->pos.y;
- corner[1].x = node->pos.x;
+ corner[1] = node->pos;
break;
case QUADTREE_DOWNLEFT:
- corner[0] = node->pos;
+ corner[0].x = node->pos.x;
+ corner[1].y = node->pos.y;
break;
default:
trap();
int i;
/* Detach from the tree */
- for (i = 0; i < 4; i++) {
- if (node->parent->child[i] == node) {
- node->parent->child[i] = 0;
- break;
+ if (node->parent)
+ for (i = 0; i < 4; i++) {
+ if (node->parent->child[i] == node) {
+ node->parent->child[i] = 0;
+ break;
+ }
}
- }
if (i == 4)
trap();
dist = dist2;
}
}
+
+ if (t == NULL)
+ return;
}
}
* spatial middle coordinates of the tree.
*/
+ if (debug) {
+ printf("Relocating node %p under parent %p\n", t, parent);
+ printf("There are %d child nodes left\n", tree->children);
+ fflush(stdout);
+ }
_quadtree_del(t, tree);
quadtree_add(parent, t, ops);
+ tree->children--;
+ if (!tree->children)
+ return;
+
/*
* Now split the search rectangle in quadtres and do the same
* with all of the quarters.
fflush(stdout);
}
- /* Get the outer limits of the area belongin to the node */
- quadtree_get_tree_dimensions(node, corner);
-
- /*
- * We are deleting the root node. This means we have to select
- * a new root node and reconstruct the entire tree under it
- * again.
- */
if (!node->parent) {
+ /*
+ * We are deleting the root node. This means we have
+ * to select a new root node and reconstruct the
+ * entire tree under it again.
+ */
+ if (debug) {
+ printf("Deleting root node\n");
+ fflush(stdout);
+ }
for (i = 0; i < 4; i++) {
if (!node->child[i])
continue;
parent = node->child[i];
+ _quadtree_del(parent, node);
parent->parent = 0;
+ quadtree_recalculate_parent_stats(parent, ops);
+ break;
}
} else {
/*
* tree. Fix the stats.
*/
quadtree_recalculate_parent_stats(node->parent, ops);
-
- parent = quadtree_find_parent(parent);
}
+ validate_tree(parent);
+
+ if (!node->children)
+ goto out;
/*
* Now we are ready to prepare for relocating the nodes under
* the parent.
quadtree_get_tree_dimensions(node, corner);
optimally_move_tree(node, parent, corner, ops);
+ if (debug) {
+ printf("Delete done, returning parent %p\n", parent);
+ fflush(stdout);
+ }
+
+out:
+ parent = quadtree_find_parent(parent);
validate_tree(parent);
return parent;
}