16 result.reserve(points.size());
19 QHash<std::pair<qint64, qint64>, QList<int>> cells;
20 const double distanceSquared = distance * distance;
22 for (qsizetype i = 0; i < points.size(); i++) {
23 const QPointF& point = points[i];
24 const int index =
static_cast<int>(i);
25 if ((distance <= 0.0) || !std::isfinite(point.x()) || !std::isfinite(point.y())) {
30 const qint64 cellX =
static_cast<qint64
>(std::floor(point.x() / distance));
31 const qint64 cellY =
static_cast<qint64
>(std::floor(point.y() / distance));
33 double closestDistanceSquared = std::numeric_limits<double>::infinity();
34 for (qint64 x = cellX - 1; x <= cellX + 1; x++) {
35 for (qint64 y = cellY - 1; y <= cellY + 1; y++) {
36 for (
const int representative : cells.value({x, y})) {
37 const QPointF delta = point - points[representative];
38 const double candidate = QPointF::dotProduct(delta, delta);
39 if ((candidate <= distanceSquared) &&
40 ((candidate < closestDistanceSquared) ||
41 ((candidate == closestDistanceSquared) && (representative < closest)))) {
42 closest = representative;
43 closestDistanceSquared = candidate;
50 result.append(closest);
53 cells[{cellX, cellY}].append(index);