private static List<double[]> findNeighbors(
      List<double[]> data, double[] target, double maxDistance, int maxN) {
    List<double[]> ret = new ArrayList<double[]>();

    List<double[]> found = new ArrayList<double[]>();
    GrowQueue_F64 distances = new GrowQueue_F64();
    GrowQueue_I32 indexes = new GrowQueue_I32();

    for (int i = 0; i < data.size(); i++) {
      double[] d = data.get(i);

      double dx = d[0] - target[0];
      double dy = d[1] - target[1];

      double dist = dx * dx + dy * dy;
      if (dist <= maxDistance) {
        distances.add(dist);
        found.add(d);
      }
    }

    indexes.resize(distances.size);

    maxN = Math.min(maxN, distances.size);

    QuickSelectArray.selectIndex(distances.data, maxN, distances.size, indexes.data);

    for (int i = 0; i < maxN; i++) {
      ret.add(found.get(indexes.data[i]));
    }

    return ret;
  }