This commit is contained in:
Nikolaj
2021-10-06 16:54:21 +02:00
parent a8aaf7a884
commit 45f5abaea1
2 changed files with 13 additions and 11 deletions

Binary file not shown.

View File

@ -78,36 +78,38 @@ void free_kdtree(struct node* data) {
free_kdtree(right); free_kdtree(right);
} }
void lookup(struct record** closest, double closest_dist, double query[2], struct node* tree) { struct record* lookup(struct record* closest, double query[2], struct node* tree) {
if (tree == NULL) { if (tree == NULL) {
return; return closest;
} }
double compare_coord[2] = {tree->point[0], tree->point[1]}; double compare_coord[2] = {tree->point[0], tree->point[1]};
double dist = calc_euclidean(query, compare_coord); double dist = calc_euclidean(query, compare_coord);
double closest_coords[2] = {closest->lon, closest->lat};
double closest_dist = calc_euclidean(query, closest_coords);
if (dist < closest_dist) { if (dist < closest_dist) {
closest = &tree->record; closest = tree->record;
closest_dist = dist;
} }
double diff = tree->point[tree->axis] - query[tree->axis]; double diff = tree->point[tree->axis] - query[tree->axis];
if (diff >= 0 || closest_dist > fabs(diff)) { if (diff >= 0 || closest_dist > fabs(diff)) {
lookup(closest, closest_dist, query, tree->left); closest = lookup(closest, query, tree->left);
} else if (diff <= 0 || closest_dist > fabs(diff)) {
lookup(closest, closest_dist, query, tree->right);
} }
return; if (diff <= 0 || closest_dist > fabs(diff)) {
closest = lookup(closest, query, tree->right);
}
return closest;
} }
const struct record* lookup_kdtree(struct node *data, double lon, double lat) { const struct record* lookup_kdtree(struct node *data, double lon, double lat) {
struct record* closest = data->record; struct record* closest = data->record;
double compare_coord[2] = {data->point[0], data->point[1]};
double query[2] = {lon, lat}; double query[2] = {lon, lat};
double closest_dist = calc_euclidean(query, compare_coord);
lookup(&closest, closest_dist, query, data); closest = lookup(closest, query, data);
return closest; return closest;
} }