00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef KDTREE_H
00020 #define KDTREE_H
00021
00025 #include "general.h"
00026 #include "cutil.h"
00027 #include "ocrfeatures.h"
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 typedef struct kdnode
00040 {
00041 FLOAT32 *Key;
00042 char *Data;
00043 FLOAT32 BranchPoint;
00044 FLOAT32 LeftBranch;
00045 FLOAT32 RightBranch;
00046 struct kdnode *Left;
00047 struct kdnode *Right;
00048 }
00049
00050
00051 KDNODE;
00052
00053 typedef struct
00054 {
00055 inT16 KeySize;
00056 KDNODE Root;
00057 PARAM_DESC KeyDesc[1];
00058 }
00059
00060
00061 KDTREE;
00062
00063 typedef enum {
00064 preorder, postorder, endorder, leaf
00065 }
00066
00067
00068 VISIT;
00069
00070
00071
00072
00073 #define RootOf(T) ((T)->Root.Left->Data)
00074
00078 KDTREE *MakeKDTree (inT16 KeySize, PARAM_DESC KeyDesc[]);
00079
00080 void KDStore(KDTREE *Tree, FLOAT32 *Key, void *Data);
00081
00082 void KDDelete (KDTREE * Tree, FLOAT32 Key[], void *Data);
00083
00084 int KDNearestNeighborSearch (KDTREE * Tree,
00085 FLOAT32 Query[],
00086 int QuerySize,
00087 FLOAT32 MaxDistance,
00088 void *NBuffer, FLOAT32 DBuffer[]);
00089
00090 void KDWalk(KDTREE *Tree, void_proc Action);
00091
00092 void FreeKDTree(KDTREE *Tree);
00093
00097 int Equal (FLOAT32 Key1[], FLOAT32 Key2[]);
00098
00099 KDNODE *MakeKDNode (FLOAT32 Key[], char *Data, int Index);
00100
00101 void FreeKDNode(KDNODE *Node);
00102
00103 void Search(int Level, KDNODE *SubTree);
00104
00105 FLOAT32 ComputeDistance (register int N,
00106 register PARAM_DESC Dim[],
00107 register FLOAT32 p1[], register FLOAT32 p2[]);
00108
00109 void FindMaxDistance();
00110
00111 int QueryIntersectsSearch();
00112
00113 int QueryInSearch();
00114
00115 void Walk(KDNODE *SubTree, inT32 Level);
00116
00117 void FreeSubTree(KDNODE *SubTree);
00118 #endif