--- a/src/bd_search.cpp Tue Jul 14 09:25:24 2009 -0700
+++ b/src/bd_search.cpp Fri Jul 17 13:54:30 2009 -0700
@@ -36,6 +36,8 @@
// bd_shrink::ann_search - search a shrinking node
//----------------------------------------------------------------------
+ANNpoint ANNkdQ; // query point
+ANNmin_k *ANNkdPointMK; // set of k closest points
void ANNbd_shrink::ann_search(ANNdist box_dist)
{
// check dist calc term cond.
--- a/src/kd_search.cpp Tue Jul 14 09:25:24 2009 -0700
+++ b/src/kd_search.cpp Fri Jul 17 13:54:30 2009 -0700
@@ -77,10 +77,8 @@
//----------------------------------------------------------------------
int ANNkdDim; // dimension of space
-ANNpoint ANNkdQ; // query point
double ANNkdMaxErr; // max tolerable squared error
ANNpointArray ANNkdPts; // the points
-ANNmin_k *ANNkdPointMK; // set of k closest points
//----------------------------------------------------------------------
// annkSearch - search for the k nearest neighbors
@@ -93,6 +91,8 @@
ANNdistArray dd, // the approximate nearest neighbor
double eps) // the error bound
{
+ ANNpoint ANNkdQ; // query point
+ ANNmin_k *ANNkdPointMK; // set of k closest points
ANNkdDim = dim; // copy arguments to static equivs
ANNkdQ = q;
@@ -108,7 +108,7 @@
ANNkdPointMK = new ANNmin_k(k); // create set for closest k points
// search starting at the root
- root->ann_search(annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim));
+ root->ann_search(ANNkdQ, ANNkdPointMK, annBoxDistance(q, bnd_box_lo, bnd_box_hi, dim));
for (int i = 0; i < k; i++) { // extract the k-th closest points
dd[i] = ANNkdPointMK->ith_smallest_key(i);
@@ -121,7 +121,7 @@
// kd_split::ann_search - search a splitting node
//----------------------------------------------------------------------
-void ANNkd_split::ann_search(ANNdist box_dist)
+void ANNkd_split::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist)
{
// check dist calc term condition
if (ANNmaxPtsVisited != 0 && ANNptsVisited > ANNmaxPtsVisited) return;
@@ -130,7 +130,7 @@
ANNcoord cut_diff = ANNkdQ[cut_dim] - cut_val;
if (cut_diff < 0) { // left of cutting plane
- child[ANN_LO]->ann_search(box_dist);// visit closer child first
+ child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first
ANNcoord box_diff = cd_bnds[ANN_LO] - ANNkdQ[cut_dim];
if (box_diff < 0) // within bounds - ignore
@@ -141,11 +141,11 @@
// visit further child if close enough
if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key())
- child[ANN_HI]->ann_search(box_dist);
+ child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);
}
else { // right of cutting plane
- child[ANN_HI]->ann_search(box_dist);// visit closer child first
+ child[ANN_HI]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);// visit closer child first
ANNcoord box_diff = ANNkdQ[cut_dim] - cd_bnds[ANN_HI];
if (box_diff < 0) // within bounds - ignore
@@ -156,7 +156,7 @@
// visit further child if close enough
if (box_dist * ANNkdMaxErr < ANNkdPointMK->max_key())
- child[ANN_LO]->ann_search(box_dist);
+ child[ANN_LO]->ann_search(ANNkdQ, ANNkdPointMK, box_dist);
}
ANN_FLOP(10) // increment floating ops
@@ -169,7 +169,7 @@
// some fine tuning to replace indexing by pointer operations.
//----------------------------------------------------------------------
-void ANNkd_leaf::ann_search(ANNdist box_dist)
+void ANNkd_leaf::ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist box_dist)
{
register ANNdist dist; // distance to data point
register ANNcoord* pp; // data coordinate pointer
--- a/src/kd_search.h Tue Jul 14 09:25:24 2009 -0700
+++ b/src/kd_search.h Fri Jul 17 13:54:30 2009 -0700
@@ -39,10 +39,10 @@
//----------------------------------------------------------------------
extern int ANNkdDim; // dimension of space (static copy)
-extern ANNpoint ANNkdQ; // query point (static copy)
+// extern ANNpoint ANNkdQ; // query point (static copy)
extern double ANNkdMaxErr; // max tolerable squared error
extern ANNpointArray ANNkdPts; // the points (static copy)
-extern ANNmin_k *ANNkdPointMK; // set of k closest points
+// extern ANNmin_k *ANNkdPointMK; // set of k closest points
extern int ANNptsVisited; // number of points visited
#endif
--- a/src/kd_tree.h Tue Jul 14 09:25:24 2009 -0700
+++ b/src/kd_tree.h Fri Jul 17 13:54:30 2009 -0700
@@ -28,6 +28,7 @@
#define ANN_kd_tree_H
#include <ANN/ANNx.h> // all ANN includes
+#include "pr_queue_k.h" // k-element priority queue
using namespace std; // make std:: available
@@ -47,7 +48,8 @@
public:
virtual ~ANNkd_node() {} // virtual distroyer
- virtual void ann_search(ANNdist) = 0; // tree search
+ virtual void ann_search(ANNdist) {} // tree search
+ virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist) {} // tree search
virtual void ann_pri_search(ANNdist) = 0; // priority search
virtual void ann_FR_search(ANNdist) = 0; // fixed-radius search
@@ -110,7 +112,7 @@
virtual void print(int level, ostream &out);// print node
virtual void dump(ostream &out); // dump node
- virtual void ann_search(ANNdist); // standard search
+ virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search
virtual void ann_pri_search(ANNdist); // priority search
virtual void ann_FR_search(ANNdist); // fixed-radius search
};
@@ -176,7 +178,7 @@
virtual void print(int level, ostream &out);// print node
virtual void dump(ostream &out); // dump node
- virtual void ann_search(ANNdist); // standard search
+ virtual void ann_search(ANNpoint& ANNkdQ, ANNmin_k* ANNkdPointMK, ANNdist); // standard search
virtual void ann_pri_search(ANNdist); // priority search
virtual void ann_FR_search(ANNdist); // fixed-radius search
};