iMSTK
Interactive Medical Simulation Toolkit
imstkGridBasedNeighborSearch.h
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 #pragma once
8 
9 #include "imstkSpinLock.h"
10 #include "imstkUniformSpatialGrid.h"
11 #include "imstkVecDataArray.h"
12 
13 namespace imstk
14 {
19 {
20 public:
21  GridBasedNeighborSearch() = default;
22 
27  GridBasedNeighborSearch(const double radius) : m_SearchRadius(radius), m_SearchRadiusSqr(radius * radius) {}
28 
33  void setSearchRadius(const double radius);
34 
38  double getSearchRadius() const { return m_SearchRadius; }
39 
45  std::vector<std::vector<size_t>> getNeighbors(const VecDataArray<double, 3>& points);
46 
52  void getNeighbors(std::vector<std::vector<size_t>>& result, const VecDataArray<double, 3>& points);
53 
60  void getNeighbors(std::vector<std::vector<size_t>>& result, const VecDataArray<double, 3>& setA, const VecDataArray<double, 3>& setB);
61 
62 private:
63  double m_SearchRadius = 0.0;
64  double m_SearchRadiusSqr = 0.0;
65 
66  // Data store in each grid cell
67  // This entire struct can be replaced by tbb::concurrent_vector<size_t>, however, with lower performance
68  struct CellData
69  {
70  std::vector<size_t> particleIndices; // Store list of particles
71  ParallelUtils::SpinLock lock; // An atomic lock for thread-safe writing
72  };
74 };
75 } // namespace imstk
The SpinLock class.
Definition: imstkSpinLock.h:20
void setSearchRadius(const double radius)
Set the search radius.
double getSearchRadius() const
Get the search radius.
Compound Geometry.
Class for searching neighbors using regular grid.
std::vector< std::vector< size_t > > getNeighbors(const VecDataArray< double, 3 > &points)
Search neighbors for each points within the search radius.
GridBasedNeighborSearch(const double radius)
Construct class with search radius.
Class for handling data in 3D grid.