10 #ifndef vtk_m_exec_PointLocatorSparseGrid_h
11 #define vtk_m_exec_PointLocatorSparseGrid_h
32 typename vtkm::cont::CoordinateSystem::MultiplexerArrayType::ReadPortalType;
45 , Dxdydz((max - Min) / Dims)
48 , CellLower(cellLower)
49 , CellUpper(cellUpper)
68 vtkm::Id3 ijk = (queryPoint - this->Min) / this->Dxdydz;
70 ijk = vtkm::Min(ijk, this->Dims -
vtkm::Id3(1));
72 nearestNeighborId = -1;
73 distance2 = vtkm::Infinity<vtkm::FloatDefault>();
75 this->FindInCell(queryPoint, ijk, nearestNeighborId, distance2);
78 vtkm::Id maxLevel = vtkm::Max(vtkm::Max(this->Dims[0], this->Dims[1]), this->Dims[2]);
80 for (level = 1; (nearestNeighborId < 0) && (level < maxLevel); ++level)
82 this->FindInBox(queryPoint, ijk, level, nearestNeighborId, distance2);
88 this->FindInBox(queryPoint, ijk, level, nearestNeighborId, distance2);
107 vtkm::Id cellId = ijk[0] + (ijk[1] * this->Dims[0]) + (ijk[2] * this->Dims[0] * this->Dims[1]);
108 vtkm::Id lower = this->CellLower.Get(cellId);
109 vtkm::Id upper = this->CellUpper.Get(cellId);
110 for (
vtkm::Id index = lower; index < upper; index++)
112 vtkm::Id pointid = this->PointIds.Get(index);
115 if (distance2 < nearestDistance2)
117 nearestNeighborId = pointid;
118 nearestDistance2 = distance2;
129 if ((boxCenter[0] - level) >= 0)
132 queryPoint, boxCenter -
vtkm::Id3(level, 0, 0), level, nearestNeighborId, nearestDistance2);
134 if ((boxCenter[0] + level) < this->Dims[0])
137 queryPoint, boxCenter +
vtkm::Id3(level, 0, 0), level, nearestNeighborId, nearestDistance2);
140 if ((boxCenter[1] - level) >= 0)
143 queryPoint, boxCenter -
vtkm::Id3(0, level, 0), level, nearestNeighborId, nearestDistance2);
145 if ((boxCenter[1] + level) < this->Dims[1])
148 queryPoint, boxCenter +
vtkm::Id3(0, level, 0), level, nearestNeighborId, nearestDistance2);
151 if ((boxCenter[2] - level) >= 0)
154 queryPoint, boxCenter -
vtkm::Id3(0, 0, level), level, nearestNeighborId, nearestDistance2);
156 if ((boxCenter[2] + level) < this->Dims[2])
159 queryPoint, boxCenter +
vtkm::Id3(0, 0, level), level, nearestNeighborId, nearestDistance2);
172 for (
vtkm::Id index = 0; index < numInPlane; ++index)
175 vtkm::Id3(index % mod[0], index % mod[1], index % mod[2]) + origin;
176 if ((ijk[0] >= 0) && (ijk[0] < this->Dims[0]) && (ijk[1] >= 0) && (ijk[1] < this->Dims[1]) &&
177 (ijk[2] >= 0) && (ijk[2] < this->Dims[2]))
179 this->FindInCell(queryPoint, ijk, nearestNeighborId, nearestDistance2);
192 vtkm::Id3 div = { yWidth * zWidth, yWidth * zWidth, yWidth };
194 vtkm::Id3 origin = { 0, -level, -level };
195 vtkm::Id numInPlane = yWidth * zWidth;
197 queryPoint, planeCenter, div, mod, origin, numInPlane, nearestNeighborId, nearestDistance2);
208 vtkm::Id3 div = { xWidth * zWidth, xWidth * zWidth, xWidth };
210 vtkm::Id3 origin = { -level + 1, 0, -level };
211 vtkm::Id numInPlane = xWidth * zWidth;
213 queryPoint, planeCenter, div, mod, origin, numInPlane, nearestNeighborId, nearestDistance2);
224 vtkm::Id3 div = { xWidth * yWidth, xWidth, xWidth * yWidth };
226 vtkm::Id3 origin = { -level + 1, -level + 1, 0 };
227 vtkm::Id numInPlane = xWidth * yWidth;
229 queryPoint, planeCenter, div, mod, origin, numInPlane, nearestNeighborId, nearestDistance2);
236 #endif // vtk_m_exec_PointLocatorSparseGrid_h