402{
403 auto extent =
static_cast<int32_t
>(std::ceil(std::sqrt(radius_sq) *
m_inv_cell));
404
405 auto check_cell = [&](uint64_t
h) {
406 auto it = snap.cells.find(
h);
407 if (it == snap.cells.end()) {
408 return;
409 }
410 for (uint32_t slot : it->second) {
412 if (d_sq <= radius_sq) {
413 out.push_back({ snap.slot_to_id[slot], d_sq });
414 }
415 }
416 };
417
418 if constexpr (std::is_same_v<PointT, glm::vec3>) {
420 for (int32_t dx = -extent; dx <= extent; ++dx) {
421 for (int32_t dy = -extent; dy <= extent; ++dy) {
422 for (int32_t dz = -extent; dz <= extent; ++dz) {
424 }
425 }
426 }
427 } else {
428 uint32_t dims = snap.dimensions;
429 std::vector<int32_t> base_cell(dims);
430 for (uint32_t d = 0; d < dims; ++d) {
431 base_cell[d] =
static_cast<int32_t
>(std::floor(center(d) *
m_inv_cell));
432 }
433
434 std::vector<int32_t> offsets(dims, -extent);
435
436 auto advance = [&]() -> bool {
437 for (uint32_t d = 0; d < dims; ++d) {
438 if (++offsets[d] <= extent) {
439 return true;
440 }
441 offsets[d] = -extent;
442 }
443 return false;
444 };
445
446 do {
447 Eigen::VectorXd probe(dims);
448 for (uint32_t d = 0; d < dims; ++d) {
449 probe(d) = static_cast<double>(base_cell[d] + offsets[d]) + 0.5;
450 }
452 } while (advance());
453 }
454}
uint64_t hash_cell_3d(int32_t cx, int32_t cy, int32_t cz)
uint64_t hash_cell_nd(const Eigen::VectorXd &p, float inv_cell)
std::array< int32_t, 3 > cell_coords_3d(const glm::vec3 &p, float inv_cell)