114 double const query_pt[2] = {x, y};
118 std::vector<unsigned int> indices(k);
119 std::vector<double> sq_dists(k);
121 long unsigned int num_found =
m_kdtree->knnSearch(query_pt, k,
126 throw std::runtime_error(
"knnSearch found no neighbors");
135 double sum_weights = 0.0;
136 double sum_weighted_values = 0.0;
144 for (
size_t i = 0; i < num_found; i++)
146 double weight = 1.0 / sq_dists[i];
147 sum_weights += weight;
148 sum_weighted_values += weight *
m_values[indices[i]];
155 for (
size_t i = 0; i < num_found; i++)
157 double dist = std::sqrt(sq_dists[i]);
158 double weight = 1.0 / std::pow(dist,
m_power);
159 sum_weights += weight;
160 sum_weighted_values += weight *
m_values[indices[i]];
164 return sum_weighted_values / sum_weights;
168 std::vector<double>& results)
const
170 results.resize(query_points.size());
177 std::vector<unsigned int> indices(k);
178 std::vector<double> sq_dists(k);
180 #pragma omp for schedule(guided, 128) nowait
181 for (
size_t i = 0; i < query_points.size(); i++)
183 double const query_pt[2] = {query_points[i].x, query_points[i].y};
185 long unsigned int num_found =
m_kdtree->knnSearch(query_pt, k,
203 double sum_weights = 0.0;
204 double sum_weighted_values = 0.0;
208 for (
size_t j = 0; j < num_found; j++)
210 double weight = 1.0 / sq_dists[j];
211 sum_weights += weight;
212 sum_weighted_values += weight *
m_values[indices[j]];
217 for (
size_t j = 0; j < num_found; j++)
219 double dist = std::sqrt(sq_dists[j]);
220 double weight = 1.0 / std::pow(dist,
m_power);
221 sum_weights += weight;
222 sum_weighted_values += weight *
m_values[indices[j]];
226 results[i] = sum_weighted_values / sum_weights;
231 std::vector<unsigned int> indices(k);
232 std::vector<double> sq_dists(k);
234 for (
size_t i = 0; i < query_points.size(); i++)
236 results[i] =
Interpolate(query_points[i].x, query_points[i].y);
294 double& result_x,
double& result_y,
295 std::vector<unsigned int>& indices,
296 std::vector<double>& sq_dists)
const
298 double const query_pt[2] = {x, y};
301 long unsigned int num_found =
m_kdtree->knnSearch(query_pt, k,
307 result_x = result_y = 0.0;
320 double sum_weights = 0.0;
321 double sum_weighted_x = 0.0;
322 double sum_weighted_y = 0.0;
326 for (
size_t i = 0; i < num_found; i++)
328 double weight = 1.0 / sq_dists[i];
329 sum_weights += weight;
330 sum_weighted_x += weight *
m_values_x[indices[i]];
331 sum_weighted_y += weight *
m_values_y[indices[i]];
336 for (
size_t i = 0; i < num_found; i++)
338 double dist = std::sqrt(sq_dists[i]);
339 double weight = 1.0 / std::pow(dist,
m_power);
340 sum_weights += weight;
341 sum_weighted_x += weight *
m_values_x[indices[i]];
342 sum_weighted_y += weight *
m_values_y[indices[i]];
346 result_x = sum_weighted_x / sum_weights;
347 result_y = sum_weighted_y / sum_weights;
351 std::vector<double>& results_x,
352 std::vector<double>& results_y)
const
354 size_t const n = query_points.size();
368 std::vector<unsigned int> indices(k);
369 std::vector<double> sq_dists(k);
371 #pragma omp for schedule(guided, 128) nowait
372 for (
size_t i = 0; i < query_points.size(); i++)
375 results_x[i], results_y[i],
381 std::vector<unsigned int> indices(k);
382 std::vector<double> sq_dists(k);
384 for (
size_t i = 0; i < query_points.size(); i++)
387 results_x[i], results_y[i],