/******************************************************************************
 **	Filename:	kdtree.h
 **	Purpose:	Definition of K-D tree access routines.
 **	Author:		Dan Johnson
 **	History:	3/11/89, DSJ, Created.
 **			5/23/89, DSJ, Added circular feature capability.
 **
 **	(c) Copyright Hewlett-Packard Company, 1988.
 ** Licensed under the Apache License, Version 2.0 (the "License");
 ** you may not use this file except in compliance with the License.
 ** You may obtain a copy of the License at
 ** http://www.apache.org/licenses/LICENSE-2.0
 ** Unless required by applicable law or agreed to in writing, software
 ** distributed under the License is distributed on an "AS IS" BASIS,
 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 ** See the License for the specific language governing permissions and
 ** limitations under the License.
 ******************************************************************************/
#ifndef   KDTREE_H
#define   KDTREE_H

/**----------------------------------------------------------------------------
          Include Files and Type Defines
----------------------------------------------------------------------------**/
#include "general.h"
#include "cutil.h"
#include "ocrfeatures.h"

/*
NOTE:  All circular parameters of all keys must be in the range

Min <= Param < Max

where Min and Max are specified in the KeyDesc parameter passed to
MakeKDTree.  All KD routines assume that this is true and will not operate
correctly if circular parameters outside the specified range are used.
*/

typedef struct kdnode
{
  FLOAT32 *Key;                  /* search key */
  char *Data;                    /* data that corresponds to key */
  FLOAT32 BranchPoint;           /* needed to make deletes work efficiently */
  FLOAT32 LeftBranch;            /* used to optimize search pruning */
  FLOAT32 RightBranch;           /* used to optimize search pruning */
  struct kdnode *Left;           /* ptrs for KD tree structure */
  struct kdnode *Right;
}


KDNODE;

typedef struct
{
  inT16 KeySize;                 /* number of dimensions in the tree */
  KDNODE Root;                   /* Root.Left points to actual root node */
  PARAM_DESC KeyDesc[1];         /* description of each dimension */
}


KDTREE;

typedef enum {                   /* used for walking thru KD trees */
  preorder, postorder, endorder, leaf
}


VISIT;

/*----------------------------------------------------------------------------
            Macros
-----------------------------------------------------------------------------*/
#define RootOf(T)   ((T)->Root.Left->Data)

/**----------------------------------------------------------------------------
          Public Function Prototypes
----------------------------------------------------------------------------**/
KDTREE *MakeKDTree (inT16 KeySize, PARAM_DESC KeyDesc[]);

void KDStore(KDTREE *Tree, FLOAT32 *Key, void *Data);

void KDDelete (KDTREE * Tree, FLOAT32 Key[], void *Data);

int KDNearestNeighborSearch (KDTREE * Tree,
FLOAT32 Query[],
int QuerySize,
FLOAT32 MaxDistance,
void *NBuffer, FLOAT32 DBuffer[]);

void KDWalk(KDTREE *Tree, void_proc Action);

void FreeKDTree(KDTREE *Tree);

/**----------------------------------------------------------------------------
          Private Function Prototypes
----------------------------------------------------------------------------**/
int Equal (FLOAT32 Key1[], FLOAT32 Key2[]);

KDNODE *MakeKDNode (FLOAT32 Key[], char *Data, int Index);

void FreeKDNode(KDNODE *Node);

void Search(int Level, KDNODE *SubTree);

FLOAT32 ComputeDistance (register int N,
register PARAM_DESC Dim[],
register FLOAT32 p1[], register FLOAT32 p2[]);

void FindMaxDistance();

int QueryIntersectsSearch();

int QueryInSearch();

void Walk(KDNODE *SubTree, inT32 Level);

void FreeSubTree(KDNODE *SubTree);
#endif
