/*! \file kdtree.h * \brief Include file for the kdtree library */ /* Code from: https://github.com/joergdietrich/libkdtree Uwe Schulzweida, 20150720: changed data pointer to unsigned int changed *point to point[KD_MAX_DIM] changed *location to location[KD_MAX_DIM] changed *min to min[KD_MAX_DIM] changed *max to max[KD_MAX_DIM] _compPoints: compare index if points[axis] are equal replace qsortR by libc:qsort (speedup 25%) */ #ifndef _KDTREE_H_ #define _KDTREE_H_ #include #include #include #include #include #include #define KD_FLOAT 1 #define KD_INT 2 #define KD_DOUBLE 3 #define KD_LONG 4 #define KD_TYPE KD_FLOAT //#define KD_TYPE KD_INT #if KD_TYPE == KD_INT typedef int kdata_t; # define KDATA_SFAC 44000. # define KDATA_SCALE(x) ((int) lround(KDATA_SFAC*(x))) # define KDATA_INVSCALE(x) ((x)/KDATA_SFAC) # define KDATA_ABS(x) abs(x) #elif KD_TYPE == KD_FLOAT typedef float kdata_t; # define KDATA_SCALE(x) (x) # define KDATA_INVSCALE(x) (x) # define KDATA_ABS(x) fabsf(x) #elif KD_TYPE == KD_DOUBLE typedef double kdata_t; # define KDATA_SCALE(x) (x) # define KDATA_INVSCALE(x) (x) # define KDATA_ABS(x) fabs(x) #elif KD_TYPE == KD_LONG typedef long kdata_t; # define KDATA_SFAC 3000000. # define KDATA_SCALE(x) (lround(KDATA_SFAC*(x))) # define KDATA_INVSCALE(x) ((x)/KDATA_SFAC) # define KDATA_ABS(x) labs(x) #endif #define KD_MAX_DIM 3 typedef struct kd_point { kdata_t point[KD_MAX_DIM]; unsigned index; } kd_point; static inline int qcmp(struct kd_point *a, struct kd_point *b, int axis) { int ret = (a->point[axis] > b->point[axis]) ? 1 : (a->point[axis] < b->point[axis]) ? -1 : 0; if ( ret == 0 ) ret = (a->index > b->index) ? 1 : (a->index < b->index) ? -1 : 0; return ret; } /*! * \struct kdNode * \brief kd-tree node structure definition */ typedef struct kdNode { struct kdNode *left; /*!