82 self->size[2] = (10 * M_PI / 180);
87 self->node_max_count = max_size;
111 self->leaf_count = 0;
112 self->node_count = 0;
124 key[0] = floor(pose.
v[0] / self->size[0]);
125 key[1] = floor(pose.
v[1] / self->size[1]);
126 key[2] = floor(pose.
v[2] / self->size[2]);
163 key[0] = floor(pose.
v[0] / self->size[0]);
164 key[1] = floor(pose.
v[1] / self->size[1]);
165 key[2] = floor(pose.
v[2] / self->size[2]);
181 key[0] = floor(pose.
v[0] / self->size[0]);
182 key[1] = floor(pose.
v[1] / self->size[1]);
183 key[2] = floor(pose.
v[2] / self->size[2]);
198 if (key_a[0] != key_b[0])
200 if (key_a[1] != key_b[1])
203 if (key_a[2] != key_b[2])
227 int split, max_split;
232 assert(self->node_count < self->node_max_count);
233 node =
self->nodes +
self->node_count++;
243 for (i = 0; i < 3; i++)
244 node->
key[i] = key[i];
247 self->leaf_count += 1;
256 node->
value += value;
266 for (i = 0; i < 3; i++)
268 split = abs(key[i] - node->
key[i]);
269 if (split > max_split)
291 self->leaf_count -= 1;
369 int queue_count, cluster_count;
373 queue = calloc(self->node_count,
sizeof(queue[0]));
376 for (i = 0; i <
self->node_count; i++)
378 node =
self->nodes + i;
382 assert(queue_count < self->node_count);
383 queue[queue_count++] = node;
393 while (queue_count > 0)
395 node = queue[--queue_count];
402 node->
cluster = cluster_count++;
421 for (i = 0; i < 3 * 3 * 3; i++)
423 nkey[0] = node->
key[0] + (i / 9) - 1;
424 nkey[1] = node->
key[1] + ((i % 9) / 3) - 1;
425 nkey[2] = node->
key[2] + ((i % 9) % 3) - 1;
451 #ifdef INCLUDE_RTKGUI
455 void pf_kdtree_draw(
pf_kdtree_t *
self, rtk_fig_t *fig)
457 if (self->root != NULL)
458 pf_kdtree_draw_node(
self, self->root, fig);
472 ox = (node->
key[0] + 0.5) *
self->size[0];
473 oy = (node->
key[1] + 0.5) *
self->size[1];
475 rtk_fig_rectangle(fig, ox, oy, 0.0, self->size[0], self->size[1], 0);
480 snprintf(text,
sizeof(text),
"%d", node->
cluster);
481 rtk_fig_text(fig, ox, oy, 0.0, text);
487 pf_kdtree_draw_node(
self, node->
children[0], fig);
488 pf_kdtree_draw_node(
self, node->
children[1], fig);