// Loops through a list of pt_dist and finds the one with the smallest distance pt_dist get_min(std::vector<pt_dist *> v) { int len = (int)(v.size()); pt_dist pd_min; if (len == 0) { return pt_dist(); } else { pd_min = *(v.at(0)); } for (int i = 1; i < len; i++) { pd_min = pd_min.dist < v.at(i)->dist ? pd_min : *(v.at(i)); } return pd_min; }
void closest(struct KD_TREE *tree, struct Node *u, int k, struct Point *x, int h[], int *mndist) { if (u == NULL || heuristic(tree, h) >= *mndist) return ; int dist = pt_dist(&(u->pid), x), old; *mndist = min(*mndist, dist), old = h[k]; if (x->d[k] < u->pid.d[k]) { closest(tree, u->lson, (k+1)%tree->kD, x, h, mndist); h[k] = abs(x->d[k] - u->pid.d[k]); closest(tree, u->rson, (k+1)%tree->kD, x, h, mndist); h[k] = old; } else { closest(tree, u->rson, (k+1)%tree->kD, x, h, mndist); h[k] = abs(x->d[k] - u->pid.d[k]); closest(tree, u->lson, (k+1)%tree->kD, x, h, mndist); h[k] = old; } }