NearestNeighborSearch3.h
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:3k
源码类别:

并行计算

开发平台:

Visual C++

  1. /*
  2.     FastGrid (formerly AutoGrid)
  3.     Copyright (C) 2009 The Scripps Research Institute. All rights reserved.
  4.     Copyright (C) 2009 Masaryk University. All rights reserved.
  5.     AutoGrid is a Trade Mark of The Scripps Research Institute.
  6.     This program is free software; you can redistribute it and/or
  7.     modify it under the terms of the GNU General Public License
  8.     as published by the Free Software Foundation; either version 2
  9.     of the License, or (at your option) any later version.
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program; if not, write to the Free Software
  16.     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17. */
  18. #pragma once
  19. #include "ann/ANN.h"
  20. // Given a set of points, this class can find the nearest neighbor point from the given position in space.
  21. template<typename T>
  22. class NearestNeighborSearch3
  23. {
  24. public:
  25.     NearestNeighborSearch3(): releaseCoords(false), coords(0), tree(0), pointarray(0) {}
  26.     ~NearestNeighborSearch3()
  27.     {
  28.         if (tree)
  29.             delete tree;
  30.         if (pointarray)
  31.             delete [] pointarray;
  32.         if (releaseCoords && coords)
  33.             switch (stride)
  34.             {
  35.             case 3:
  36.                 delete [] (Vec3<T>*)coords;
  37.                 break;
  38.             case 4:
  39.                 delete [] (Vec4<T>*)coords;
  40.                 break;
  41.             }
  42.     }
  43.     void create(const Vec3<T> *points, int num, bool releaseCoordsOnDestroy = false)
  44.     {
  45.         create(&points->x, 3, num, releaseCoordsOnDestroy);
  46.     }
  47.     void create(const Vec4<T> *points, int num, bool releaseCoordsOnDestroy = false)
  48.     {
  49.         create(&points->x, 4, num, releaseCoordsOnDestroy);
  50.     }
  51.     int searchNearest(const Vec3<T> &point) const
  52.     {
  53.         int result;
  54.         double d;
  55.         const_cast<ANNkd_tree*>(tree)->annkSearch(const_cast<double*>(&point.x), 1, &result, &d, 0);
  56.         return result;
  57.     }
  58.     T getDistanceSqrOfNearest2(const Vec3<T> &point) const
  59.     {
  60.         int result[2];
  61.         double d[2];
  62.         const_cast<ANNkd_tree*>(tree)->annkSearch(const_cast<double*>(&point.x), 2, result, d, 0);
  63.         return Vec3<T>::DistanceSqr(*(Vec3<T>*)&coords[result[0]*stride], *(Vec3<T>*)&coords[result[1]*stride]);
  64.     }
  65. private:
  66.     bool releaseCoords;
  67.     int stride;
  68.     const T *coords;
  69.     ANNkd_tree *tree;
  70.     ANNpointArray pointarray;
  71.     void create(const T *points, int stride, int num, bool releaseCoordsOnDestroy)
  72.     {
  73.         this->stride = stride;
  74.         releaseCoords = releaseCoordsOnDestroy;
  75.         coords = points;
  76.         pointarray = new ANNpoint[num];
  77.         for (int i = 0; i < num; i++)
  78.             pointarray[i] = const_cast<double*>(&coords[i*stride]);
  79.         tree = new ANNkd_tree(pointarray, num, 3);
  80.     }
  81. };
  82. typedef NearestNeighborSearch3<int32> NearestNeighborSearch3i;
  83. typedef NearestNeighborSearch3<float> NearestNeighborSearch3f;
  84. typedef NearestNeighborSearch3<double> NearestNeighborSearch3d;