124 lines
4.6 KiB
Text
124 lines
4.6 KiB
Text
//----------------------------------------------------------------------
|
|
// File: kd_util.h
|
|
// Programmer: Sunil Arya and David Mount
|
|
// Description: Common utilities for kd- trees
|
|
// Last modified: 01/04/05 (Version 1.0)
|
|
//----------------------------------------------------------------------
|
|
// Copyright (c) 1997-2005 University of Maryland and Sunil Arya and
|
|
// David Mount. All Rights Reserved.
|
|
//
|
|
// This software and related documentation is part of the Approximate
|
|
// Nearest Neighbor Library (ANN). This software is provided under
|
|
// the provisions of the Lesser GNU Public License (LGPL). See the
|
|
// file ../ReadMe.txt for further information.
|
|
//
|
|
// The University of Maryland (U.M.) and the authors make no
|
|
// representations about the suitability or fitness of this software for
|
|
// any purpose. It is provided "as is" without express or implied
|
|
// warranty.
|
|
//----------------------------------------------------------------------
|
|
// History:
|
|
// Revision 0.1 03/04/98
|
|
// Initial release
|
|
//----------------------------------------------------------------------
|
|
|
|
#ifndef ANN_kd_util_H
|
|
#define ANN_kd_util_H
|
|
|
|
#include "kd_tree.h" // kd-tree declarations
|
|
|
|
//----------------------------------------------------------------------
|
|
// externally accessible functions
|
|
//----------------------------------------------------------------------
|
|
|
|
double annAspectRatio( // compute aspect ratio of box
|
|
int dim, // dimension
|
|
const ANNorthRect &bnd_box); // bounding cube
|
|
|
|
void annEnclRect( // compute smallest enclosing rectangle
|
|
ANNpointArray pa, // point array
|
|
ANNidxArray pidx, // point indices
|
|
int n, // number of points
|
|
int dim, // dimension
|
|
ANNorthRect &bnds); // bounding cube (returned)
|
|
|
|
void annEnclCube( // compute smallest enclosing cube
|
|
ANNpointArray pa, // point array
|
|
ANNidxArray pidx, // point indices
|
|
int n, // number of points
|
|
int dim, // dimension
|
|
ANNorthRect &bnds); // bounding cube (returned)
|
|
|
|
ANNdist annBoxDistance( // compute distance from point to box
|
|
const ANNpoint q, // the point
|
|
const ANNpoint lo, // low point of box
|
|
const ANNpoint hi, // high point of box
|
|
int dim); // dimension of space
|
|
|
|
ANNcoord annSpread( // compute point spread along dimension
|
|
ANNpointArray pa, // point array
|
|
ANNidxArray pidx, // point indices
|
|
int n, // number of points
|
|
int d); // dimension to check
|
|
|
|
void annMinMax( // compute min and max coordinates along dim
|
|
ANNpointArray pa, // point array
|
|
ANNidxArray pidx, // point indices
|
|
int n, // number of points
|
|
int d, // dimension to check
|
|
ANNcoord& min, // minimum value (returned)
|
|
ANNcoord& max); // maximum value (returned)
|
|
|
|
int annMaxSpread( // compute dimension of max spread
|
|
ANNpointArray pa, // point array
|
|
ANNidxArray pidx, // point indices
|
|
int n, // number of points
|
|
int dim); // dimension of space
|
|
|
|
void annMedianSplit( // split points along median value
|
|
ANNpointArray pa, // points to split
|
|
ANNidxArray pidx, // point indices
|
|
int n, // number of points
|
|
int d, // dimension along which to split
|
|
ANNcoord &cv, // cutting value
|
|
int n_lo); // split into n_lo and n-n_lo
|
|
|
|
void annPlaneSplit( // split points by a plane
|
|
ANNpointArray pa, // points to split
|
|
ANNidxArray pidx, // point indices
|
|
int n, // number of points
|
|
int d, // dimension along which to split
|
|
ANNcoord cv, // cutting value
|
|
int &br1, // first break (values < cv)
|
|
int &br2); // second break (values == cv)
|
|
|
|
void annBoxSplit( // split points by a box
|
|
ANNpointArray pa, // points to split
|
|
ANNidxArray pidx, // point indices
|
|
int n, // number of points
|
|
int dim, // dimension of space
|
|
ANNorthRect &box, // the box
|
|
int &n_in); // number of points inside (returned)
|
|
|
|
int annSplitBalance( // determine balance factor of a split
|
|
ANNpointArray pa, // points to split
|
|
ANNidxArray pidx, // point indices
|
|
int n, // number of points
|
|
int d, // dimension along which to split
|
|
ANNcoord cv); // cutting value
|
|
|
|
void annBox2Bnds( // convert inner box to bounds
|
|
const ANNorthRect &inner_box, // inner box
|
|
const ANNorthRect &bnd_box, // enclosing box
|
|
int dim, // dimension of space
|
|
int &n_bnds, // number of bounds (returned)
|
|
ANNorthHSArray &bnds); // bounds array (returned)
|
|
|
|
void annBnds2Box( // convert bounds to inner box
|
|
const ANNorthRect &bnd_box, // enclosing box
|
|
int dim, // dimension of space
|
|
int n_bnds, // number of bounds
|
|
ANNorthHSArray bnds, // bounds array
|
|
ANNorthRect &inner_box); // inner box (returned)
|
|
|
|
#endif
|