7 #include "imstkGridBasedNeighborSearch.h" 8 #include "imstkParallelUtils.h" 15 m_SearchRadius = radius;
16 m_SearchRadiusSqr = radius * radius;
19 std::vector<std::vector<size_t>>
22 std::vector<std::vector<size_t>> result;
36 LOG_IF(FATAL, (std::abs(m_SearchRadius) < 1e-8)) <<
"Neighbor search radius is zero";
41 ParallelUtils::findAABB(setB, lowerCorner, upperCorner);
44 upperCorner += Vec3d(m_SearchRadius, m_SearchRadius, m_SearchRadius) * 0.1;
47 m_Grid.initialize(lowerCorner, upperCorner, m_SearchRadius);
50 ParallelUtils::parallelFor(m_Grid.getAllCellData().size(),
51 [&](
const size_t cellIdx)
53 m_Grid.getCellData(cellIdx).particleIndices.resize(0);
57 ParallelUtils::parallelFor(setB.size(),
60 auto& cellData = m_Grid.getCellData(setB[p]);
62 cellData.particleIndices.push_back(p);
63 cellData.lock.unlock();
67 result.resize(setA.size());
68 ParallelUtils::parallelFor(setA.size(),
71 auto& pneighbors = result[p];
76 const auto ppos = setA[p];
77 const auto cellIdx = m_Grid.template getCell3DIndices<int>(ppos);
79 for (
int k = -1; k <= 1; ++k)
81 int cellZ = cellIdx[2] + k;
82 if (!m_Grid.template isValidCellIndex<2>(cellZ))
86 for (
int j = -1; j <= 1; ++j)
88 int cellY = cellIdx[1] + j;
89 if (!m_Grid.template isValidCellIndex<1>(cellY))
93 for (
int i = -1; i <= 1; ++i)
95 int cellX = cellIdx[0] + i;
96 if (!m_Grid.template isValidCellIndex<0>(cellX))
102 for (
auto q : m_Grid.getCellData(cellX, cellY, cellZ).particleIndices)
104 const auto qpos = setB[q];
105 const Vec3d diff = ppos - qpos;
106 const auto d2 = diff[0] * diff[0] + diff[1] * diff[1] + diff[2] * diff[2];
107 if (d2 < m_SearchRadiusSqr)
void setSearchRadius(const double radius)
Set the search radius.
void push_back(const ValueType &val)
Append the data array to hold the new value, resizes if neccesary.
std::vector< std::vector< size_t > > getNeighbors(const VecDataArray< double, 3 > &points)
Search neighbors for each points within the search radius.