#include "quadtree.h"
-static void trap(void)
+static void _trap(int line)
{
if (debug) {
- printf("Trapped, use debugger to get backtrace\n");
+ printf("Trapped from line %d, use debugger to get backtrace\n",
+ line);
fflush(stdout);
exit(1);
}
}
+#define trap() _trap(__LINE__)
+
static int quadtree_compare_coord(const struct vector *a,
const struct vector *b)
{
* one
*/
if (t == tree) {
+ printf("t == tree\n");
ret = quadtree_compare_coord(&tree->pos, &mid);
if (tree->child[ret]) {
t = quadtree_find_nearest(tree->child[ret], &mid,
corner_orig);
} else {
+ printf("Second nearest not found in direction %d\n",
+ ret);
/*
* No suitable match from the right
* direction. Try to find a second nearest
vector_sub(&mid, &t->pos, &sub);
dist = vector_abs(&sub);
+ printf("Setting nearest from %d\n", i);
+ continue;
}
node = quadtree_find_nearest(tree->child[i],
&mid, corner_orig);
t = node;
dist = dist2;
}
+ printf("Re-setting nearest from %d\n", i);
}
if (t == NULL)
corner[0] = corner_orig[0];
corner[1] = corner_orig[1];
- if (quadtree_split_by_node(t, corner, QUADTREE_UPLEFT)) {
+ if (quadtree_split_by_node(t, corner, QUADTREE_UPLEFT))
moved += optimally_move_tree(tree, parent, corner, ops);
- tmp = quadtree_find_nearest(tree, &t->pos, corner);
- if (tmp && tmp != t)
- trap();
-
- }
-
corner[0] = corner_orig[0];
corner[1] = corner_orig[1];
- if (quadtree_split_by_node(t, corner, QUADTREE_UPRIGHT)) {
+ if (quadtree_split_by_node(t, corner, QUADTREE_UPRIGHT))
moved += optimally_move_tree(tree, parent, corner, ops);
- tmp = quadtree_find_nearest(tree, &t->pos, corner);
- if (tmp && tmp != t)
- trap();
-
- }
-
corner[0] = corner_orig[0];
corner[1] = corner_orig[1];
- if (quadtree_split_by_node(t, corner, QUADTREE_DOWNLEFT)) {
+ if (quadtree_split_by_node(t, corner, QUADTREE_DOWNLEFT))
moved += optimally_move_tree(tree, parent, corner, ops);
- tmp = quadtree_find_nearest(tree, &t->pos, corner);
- if (tmp && tmp != t)
- trap();
-
- }
-
corner[0] = corner_orig[0];
corner[1] = corner_orig[1];
- if (quadtree_split_by_node(t, corner, QUADTREE_DOWNRIGHT)) {
+ if (quadtree_split_by_node(t, corner, QUADTREE_DOWNRIGHT))
moved += optimally_move_tree(tree, parent, corner, ops);
- tmp = quadtree_find_nearest(tree, &t->pos, corner);
- if (tmp && tmp != t)
- trap();
-
- }
+ get_middle_point(corner_orig, &mid);
+ tmp = quadtree_find_nearest(tree, &mid, corner_orig);
+ if (tmp && tmp != tree)
+ trap();
out:
if (debug)
if (moved != children) {
printf("Got %d children but %d were moved\n",
children, moved);
+ fflush(stdout);
trap();
}
printf("Delete done, returning parent %p\n", parent);