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

并行计算

开发平台:

Visual C++

  1. //----------------------------------------------------------------------
  2. // File: bd_pr_search.cpp
  3. // Programmer: David Mount
  4. // Description: Priority search for bd-trees
  5. // Last modified: 01/04/05 (Version 1.0)
  6. //----------------------------------------------------------------------
  7. // Copyright (c) 1997-2005 University of Maryland and Sunil Arya and
  8. // David Mount.  All Rights Reserved.
  9. // 
  10. // This software and related documentation is part of the Approximate
  11. // Nearest Neighbor Library (ANN).  This software is provided under
  12. // the provisions of the Lesser GNU Public License (LGPL).  See the
  13. // file ../ReadMe.txt for further information.
  14. // 
  15. // The University of Maryland (U.M.) and the authors make no
  16. // representations about the suitability or fitness of this software for
  17. // any purpose.  It is provided "as is" without express or implied
  18. // warranty.
  19. //----------------------------------------------------------------------
  20. //History:
  21. // Revision 0.1  03/04/98
  22. // Initial release
  23. //----------------------------------------------------------------------
  24. #include "bd_tree.h" // bd-tree declarations
  25. #include "kd_pr_search.h" // kd priority search declarations
  26. //----------------------------------------------------------------------
  27. // Approximate priority searching for bd-trees.
  28. // See the file kd_pr_search.cc for general information on the
  29. // approximate nearest neighbor priority search algorithm.  Here
  30. // we include the extensions for shrinking nodes.
  31. //----------------------------------------------------------------------
  32. //----------------------------------------------------------------------
  33. // bd_shrink::ann_search - search a shrinking node
  34. //----------------------------------------------------------------------
  35. void ANNbd_shrink::ann_pri_search(ANNdist box_dist)
  36. {
  37. ANNdist inner_dist = 0; // distance to inner box
  38. for (int i = 0; i < n_bnds; i++) { // is query point in the box?
  39. if (bnds[i].out(ANNprQ)) { // outside this bounding side?
  40. // add to inner distance
  41. inner_dist = (ANNdist) ANN_SUM(inner_dist, bnds[i].dist(ANNprQ));
  42. }
  43. }
  44. if (inner_dist <= box_dist) { // if inner box is closer
  45. if (child[ANN_OUT] != KD_TRIVIAL) // enqueue outer if not trivial
  46. ANNprBoxPQ->insert(box_dist,child[ANN_OUT]);
  47. // continue with inner child
  48. child[ANN_IN]->ann_pri_search(inner_dist);
  49. }
  50. else { // if outer box is closer
  51. if (child[ANN_IN] != KD_TRIVIAL) // enqueue inner if not trivial
  52. ANNprBoxPQ->insert(inner_dist,child[ANN_IN]);
  53. // continue with outer child
  54. child[ANN_OUT]->ann_pri_search(box_dist);
  55. }
  56. ANN_FLOP(3*n_bnds) // increment floating ops
  57. ANN_SHR(1) // one more shrinking node
  58. }