iMSTK
Interactive Medical Simulation Toolkit
imstkNeighborSearch.cpp
1 /*
2 ** This file is part of the Interactive Medical Simulation Toolkit (iMSTK)
3 ** iMSTK is distributed under the Apache License, Version 2.0.
4 ** See accompanying NOTICE for details.
5 */
6 
7 #include "imstkGridBasedNeighborSearch.h"
8 #include "imstkSpatialHashTableSeparateChaining.h"
9 #include "imstkNeighborSearch.h"
10 #include "imstkParallelUtils.h"
11 
12 namespace imstk
13 {
14 NeighborSearch::NeighborSearch(NeighborSearch::Method searchMethod, double searchRadius /*= 0*/) :
15  m_Method(searchMethod), m_SearchRadius(searchRadius)
16 {
17  if (m_Method == Method::UniformGridBasedSearch)
18  {
19  m_GridBasedSearcher = std::make_shared<GridBasedNeighborSearch>();
20  m_GridBasedSearcher->setSearchRadius(m_SearchRadius);
21  }
22  else
23  {
24  m_SpatialHashSearcher = std::make_shared<SpatialHashTableSeparateChaining>();
25  m_SpatialHashSearcher->setCellSize(m_SearchRadius, m_SearchRadius, m_SearchRadius);
26  }
27 }
28 
29 void
30 NeighborSearch::setSearchRadius(const double searchRadius)
31 {
32  m_SearchRadius = searchRadius;
33  if (m_Method == Method::UniformGridBasedSearch)
34  {
35  m_GridBasedSearcher->setSearchRadius(m_SearchRadius);
36  }
37  else
38  {
39  m_SpatialHashSearcher->setCellSize(m_SearchRadius, m_SearchRadius, m_SearchRadius);
40  }
41 }
42 
43 std::vector<std::vector<size_t>>
45 {
46  std::vector<std::vector<size_t>> result;
47  getNeighbors(result, points, points);
48  return result;
49 }
50 
51 void
52 NeighborSearch::getNeighbors(std::vector<std::vector<size_t>>& result, const VecDataArray<double, 3>& points)
53 {
54  getNeighbors(result, points, points);
55 }
56 
57 void
58 NeighborSearch::getNeighbors(std::vector<std::vector<size_t>>& result, const VecDataArray<double, 3>& setA, const VecDataArray<double, 3>& setB)
59 {
60  if (m_Method == Method::UniformGridBasedSearch)
61  {
62  m_GridBasedSearcher->getNeighbors(result, setA, setB);
63  }
64  else
65  {
66  m_SpatialHashSearcher->clear();
67  m_SpatialHashSearcher->insertPoints(setB);
68 
69  ParallelUtils::parallelFor(setA.size(),
70  [&](const size_t p) {
71  // For each point in setA, find neighbors in setB
72  m_SpatialHashSearcher->getPointsInSphere(result[p], setA[p], m_SearchRadius);
73  });
74  }
75 }
76 } // namespace imstk
Compound Geometry.
std::vector< std::vector< size_t > > getNeighbors(const VecDataArray< double, 3 > &points)
Search neighbors for each points within the search radius.
void setSearchRadius(const double searchRadius)
Set the search radius.
NeighborSearch(Method searchMethod, double searchRadius=0.0)
Constructor.