🎉
This commit is contained in:
Binary file not shown.
@ -11,6 +11,9 @@
|
|||||||
#include "euclidean_distance.h"
|
#include "euclidean_distance.h"
|
||||||
#include "coord_query.h"
|
#include "coord_query.h"
|
||||||
|
|
||||||
|
struct record* closest_point;
|
||||||
|
double closest_point_distance;
|
||||||
|
|
||||||
int lon_comp_func(const void* a, const void* b) {
|
int lon_comp_func(const void* a, const void* b) {
|
||||||
return (
|
return (
|
||||||
((struct record*)a)->lon - ((struct record*)b)->lon
|
((struct record*)a)->lon - ((struct record*)b)->lon
|
||||||
@ -78,40 +81,42 @@ void free_kdtree(struct node* data) {
|
|||||||
free_kdtree(right);
|
free_kdtree(right);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct record* lookup(struct record* closest, double query[2], struct node* tree) {
|
void lookup(double query[2], struct node* tree) {
|
||||||
if (tree == NULL) {
|
if (tree == NULL) {
|
||||||
return closest;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
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_coords[2] = {closest_point->lon, closest_point->lat};
|
||||||
double closest_dist = calc_euclidean(query, closest_coords);
|
closest_point_distance = calc_euclidean(query, closest_coords);
|
||||||
if (dist < closest_dist) {
|
if (dist < closest_point_distance) {
|
||||||
closest = tree->record;
|
closest_point = tree->record;
|
||||||
}
|
}
|
||||||
|
|
||||||
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_point_distance > fabs(diff)) {
|
||||||
closest = lookup(closest, query, tree->left);
|
lookup(query, tree->left);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diff <= 0 || closest_dist > fabs(diff)) {
|
if (diff <= 0 || closest_point_distance > fabs(diff)) {
|
||||||
closest = lookup(closest, query, tree->right);
|
lookup(query, tree->right);
|
||||||
}
|
}
|
||||||
|
|
||||||
return closest;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
closest_point = data->record;
|
||||||
double query[2] = {lon, lat};
|
double query[2] = {lon, lat};
|
||||||
|
double compare_coord[2] = {data->point[0], data->point[1]};
|
||||||
|
closest_point_distance = calc_euclidean(query, compare_coord);
|
||||||
|
|
||||||
closest = lookup(closest, query, data);
|
lookup(query, data);
|
||||||
|
|
||||||
return closest;
|
return closest_point;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
Reference in New Issue
Block a user