00001 // **************************************************************************** 00002 // This file is part of the Integrating Vision Toolkit (IVT). 00003 // 00004 // The IVT is maintained by the Karlsruhe Institute of Technology (KIT) 00005 // (www.kit.edu) in cooperation with the company Keyetech (www.keyetech.de). 00006 // 00007 // Copyright (C) 2014 Karlsruhe Institute of Technology (KIT). 00008 // All rights reserved. 00009 // 00010 // Redistribution and use in source and binary forms, with or without 00011 // modification, are permitted provided that the following conditions are met: 00012 // 00013 // 1. Redistributions of source code must retain the above copyright 00014 // notice, this list of conditions and the following disclaimer. 00015 // 00016 // 2. Redistributions in binary form must reproduce the above copyright 00017 // notice, this list of conditions and the following disclaimer in the 00018 // documentation and/or other materials provided with the distribution. 00019 // 00020 // 3. Neither the name of the KIT nor the names of its contributors may be 00021 // used to endorse or promote products derived from this software 00022 // without specific prior written permission. 00023 // 00024 // THIS SOFTWARE IS PROVIDED BY THE KIT AND CONTRIBUTORS “AS IS” AND ANY 00025 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 00026 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00027 // DISCLAIMED. IN NO EVENT SHALL THE KIT OR CONTRIBUTORS BE LIABLE FOR ANY 00028 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 00029 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00030 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00031 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00032 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 00033 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00034 // **************************************************************************** 00035 // **************************************************************************** 00036 // Filename: KdUtils.h 00037 // Author: Kai Welke 00038 // Date: 14.04.2005 00039 // **************************************************************************** 00040 00041 00042 #ifndef _KD_UTILS_H_ 00043 #define _KD_UTILS_H_ 00044 00045 00046 // **************************************************************************** 00047 // Necessary includes 00048 // **************************************************************************** 00049 00050 #include <new> // for explicitly using correct new/delete operators on VC DSPs 00051 #include <math.h> 00052 #include "KdStructs.h" 00053 00054 00055 00056 // **************************************************************************** 00057 // Functions 00058 // **************************************************************************** 00059 00060 // find smallest enclosing rectangle 00061 // used to find initial bounding box for recursion in build process 00062 KdBoundingBox CalculateEnclosingBoundingBox(float **ppValues, int nDimension, int nSize) 00063 { 00064 KdBoundingBox EnclosingBox; 00065 EnclosingBox.nDimension = nDimension; 00066 EnclosingBox.pfLow = new float[nDimension]; 00067 EnclosingBox.pfHigh = new float[nDimension]; 00068 00069 // find boundings for each dimension 00070 for (int d = 0; d < nDimension; d++) 00071 { 00072 // init lower and upper bound 00073 float fLow = ppValues[0][d]; 00074 float fHigh = ppValues[0][d]; 00075 00076 // find smallest and highest element 00077 for (int i = 0; i < nSize; i++) 00078 { 00079 if (ppValues[i][d] < fLow) 00080 { 00081 fLow = ppValues[i][d]; 00082 } 00083 else if (ppValues[i][d] > fHigh) 00084 { 00085 fHigh = ppValues[i][d]; 00086 } 00087 } 00088 00089 // store in Box 00090 EnclosingBox.pfLow[d] = fLow; 00091 EnclosingBox.pfHigh[d] = fHigh; 00092 } 00093 00094 return EnclosingBox; 00095 } 00096 00097 00098 // calculate distance form query point to bounding box 00099 // used once to initiate recursion for BBF search 00100 float GetDistanceFromBox(KdBoundingBox BoundingBox, const float *pValues, int nDimension) 00101 { 00102 register float fDistance = 0.0f; 00103 00104 for (register int d = 0; d < nDimension; d++) 00105 { 00106 if (pValues[d] < BoundingBox.pfLow[d]) 00107 { 00108 // point is below lower bound so adjust distance 00109 const float fTemp = BoundingBox.pfLow[d] - pValues[d]; 00110 fDistance += powf(fTemp, 2); 00111 } 00112 else if (pValues[d] > BoundingBox.pfHigh[d]) 00113 { 00114 // point is above upper bound so adjust distance 00115 const float fTemp = pValues[d] - BoundingBox.pfHigh[d]; 00116 fDistance += powf(fTemp, 2); 00117 } 00118 } 00119 00120 return fDistance; 00121 } 00122 00123 00124 00125 #endif /* _KD_UTILS_H_ */