HighMap library (C++)
Loading...
Searching...
No Matches
interpolate2d.hpp
Go to the documentation of this file.
1/* Copyright (c) 2023 Otto Link. Distributed under the terms of the GNU General
2 Public License. The full license is in the file LICENSE, distributed with
3 this software. */
4
18#pragma once
19#include <cstddef>
20#include <map>
21#include <vector>
22
23extern "C" // order matters
24{
25#include "config.h"
26//
27#include "nn.h"
28//
29#include "nncommon.h"
30//
31#include "delaunay.h"
32}
33
34#include "highmap/array.hpp"
35
36namespace hmap
37{
38
55
57{
58public:
61
62 void build(const std::vector<float> &xin, const std::vector<float> &yin);
63
64 void setup_output_points(const std::vector<float> &x,
65 const std::vector<float> &y);
66
67 void interpolate(const std::vector<float> &values_in,
68 std::vector<float> &values_out) const;
69
70private:
71 nnai *handle = nullptr;
72 delaunay *d = nullptr;
73 std::vector<double> xout;
74 std::vector<double> yout;
75 size_t nout = 0;
76};
77
94inline float bilinear_interp(float f00,
95 float f10,
96 float f01,
97 float f11,
98 float u,
99 float v)
100{
101 float a10 = f10 - f00;
102 float a01 = f01 - f00;
103 float a11 = f11 - f10 - f01 + f00;
104 return f00 + a10 * u + a01 * v + a11 * u * v;
105}
106
107inline float cubic_interpolate(float p[4], float x)
108{
109 return p[1] + 0.5 * x *
110 (p[2] - p[0] +
111 x * (2.0 * p[0] - 5.0 * p[1] + 4.0 * p[2] - p[3] +
112 x * (3.0 * (p[1] - p[2]) + p[3] - p[0])));
113}
114
148Array harmonic_interpolation(const Array &array,
149 const Array &mask_fixed_values,
150 int iterations_max = 500,
151 float tolerance = 1e-5f,
152 float omega = 0.f);
153
176Array harmonic_interpolation(const Array &array,
177 const Array &mask_fixed_values,
178 const Array &dx,
179 const Array &dy,
180 int iterations_max = 500,
181 float tolerance = 1e-5f,
182 float omega = 0.f);
183
211Array interpolate2d(glm::ivec2 shape,
212 const std::vector<float> &x,
213 const std::vector<float> &y,
214 const std::vector<float> &values,
215 InterpolationMethod2D interpolation_method,
216 const Array *p_noise_x = nullptr,
217 const Array *p_noise_y = nullptr,
218 glm::vec4 bbox = {0.f, 1.f, 0.f, 1.f});
219
238Array interpolate2d_delaunay(glm::ivec2 shape,
239 const std::vector<float> &x,
240 const std::vector<float> &y,
241 const std::vector<float> &values,
242 const Array *p_noise_x = nullptr,
243 const Array *p_noise_y = nullptr,
244 glm::vec4 bbox = {0.f, 1.f, 0.f, 1.f},
245 float fill_value = 0.f);
246
251Array interpolate2d_delaunay_gradient(glm::ivec2 shape,
252 const std::vector<float> &x,
253 const std::vector<float> &y,
254 const std::vector<float> &values,
255 const Array *p_noise_x = nullptr,
256 const Array *p_noise_y = nullptr,
257 glm::vec4 bbox = {0.f, 1.f, 0.f, 1.f},
258 float fill_value = 0.f,
259 float gradient_scaling = 1.f);
260
264Array interpolate2d_gaussian(glm::ivec2 shape,
265 const std::vector<float> &x,
266 const std::vector<float> &y,
267 const std::vector<float> &values,
268 const Array *p_noise_x = nullptr,
269 const Array *p_noise_y = nullptr,
270 glm::vec4 bbox = {0.f, 1.f, 0.f, 1.f},
271 float sigma = 0.05f,
272 float radius = 0.f);
273
277Array interpolate2d_idw(glm::ivec2 shape,
278 const std::vector<float> &x,
279 const std::vector<float> &y,
280 const std::vector<float> &values,
281 const Array *p_noise_x = nullptr,
282 const Array *p_noise_y = nullptr,
283 glm::vec4 bbox = {0.f, 1.f, 0.f, 1.f},
284 float distance_exp = 2.f,
285 float radius = 0.f);
286
304Array interpolate2d_nearest(glm::ivec2 shape,
305 const std::vector<float> &x,
306 const std::vector<float> &y,
307 const std::vector<float> &values,
308 const Array *p_noise_x = nullptr,
309 const Array *p_noise_y = nullptr,
310 glm::vec4 bbox = {0.f, 1.f, 0.f, 1.f});
311
315Array interpolate2d_nni(glm::ivec2 shape,
316 const std::vector<float> &x,
317 const std::vector<float> &y,
318 const std::vector<float> &values,
319 const Array *p_noise_x = nullptr,
320 const Array *p_noise_y = nullptr,
321 glm::vec4 bbox = {0.f, 1.f, 0.f, 1.f});
322
323} // namespace hmap
324
325namespace hmap::gpu
326{
327
344Array harmonic_interpolation(const Array &array,
345 const Array &mask_fixed_values,
346 int iterations_max = 500,
347 float tolerance = 1e-5f,
348 float omega = 0.f);
349
363Array harmonic_interpolation(const Array &array,
364 const Array &mask_fixed_values,
365 const Array &dx,
366 const Array &dy,
367 int iterations_max = 500,
368 float tolerance = 1e-5f,
369 float omega = 0.f);
370
371} // namespace hmap::gpu
Declaration of the Array class for 2D floating-point arrays with various mathematical operations and ...
Definition interpolate2d.hpp:57
void build(const std::vector< float > &xin, const std::vector< float > &yin)
Definition natural_neighbor_interpolator.cpp:22
void interpolate(const std::vector< float > &values_in, std::vector< float > &values_out) const
Definition natural_neighbor_interpolator.cpp:47
~NaturalNeighborInterpolator()
Definition natural_neighbor_interpolator.cpp:16
void setup_output_points(const std::vector< float > &x, const std::vector< float > &y)
Definition natural_neighbor_interpolator.cpp:67
Definition blending.hpp:225
Definition algebra.hpp:23
Array interpolate2d_gaussian(glm::ivec2 shape, const std::vector< float > &x, const std::vector< float > &y, const std::vector< float > &values, const Array *p_noise_x=nullptr, const Array *p_noise_y=nullptr, glm::vec4 bbox={0.f, 1.f, 0.f, 1.f}, float sigma=0.05f, float radius=0.f)
2D interpolation using the Gaussian kernel method.
Definition interpolate2d_gaussian.cpp:18
Array interpolate2d_idw(glm::ivec2 shape, const std::vector< float > &x, const std::vector< float > &y, const std::vector< float > &values, const Array *p_noise_x=nullptr, const Array *p_noise_y=nullptr, glm::vec4 bbox={0.f, 1.f, 0.f, 1.f}, float distance_exp=2.f, float radius=0.f)
2D interpolation using the IDW method.
Definition interpolate2d_idw.cpp:19
Array interpolate2d_nearest(glm::ivec2 shape, const std::vector< float > &x, const std::vector< float > &y, const std::vector< float > &values, const Array *p_noise_x=nullptr, const Array *p_noise_y=nullptr, glm::vec4 bbox={0.f, 1.f, 0.f, 1.f})
2D interpolation using the nearest neighbor method.
Definition interpolate2d_nearest.cpp:15
InterpolationMethod2D
Enumeration of 2D interpolation methods.
Definition interpolate2d.hpp:47
@ ITP2D_IDW
Inverse Distance Weighting.
Definition interpolate2d.hpp:50
@ ITP2D_DELAUNAY
Delaunay triangulation method for 2D interpolation.
Definition interpolate2d.hpp:48
@ ITP2D_NNI
Natural Neighbor Interpolation.
Definition interpolate2d.hpp:52
@ ITP2D_DELAUNAY_GRADIENT
Delaunay triangulation + linear gradient.
Definition interpolate2d.hpp:53
@ ITP2D_GAUSSIAN
Gaussian Distance Weighting.
Definition interpolate2d.hpp:51
@ ITP2D_NEAREST
Nearest point method for 2D interpolation.
Definition interpolate2d.hpp:49
Array interpolate2d_delaunay_gradient(glm::ivec2 shape, const std::vector< float > &x, const std::vector< float > &y, const std::vector< float > &values, const Array *p_noise_x=nullptr, const Array *p_noise_y=nullptr, glm::vec4 bbox={0.f, 1.f, 0.f, 1.f}, float fill_value=0.f, float gradient_scaling=1.f)
2D interpolation using a smoother version of the Delaunay triangulation method.
Definition interpolate2d_delaunay_gradient.cpp:14
Array interpolate2d_nni(glm::ivec2 shape, const std::vector< float > &x, const std::vector< float > &y, const std::vector< float > &values, const Array *p_noise_x=nullptr, const Array *p_noise_y=nullptr, glm::vec4 bbox={0.f, 1.f, 0.f, 1.f})
2D interpolation using the Natural Neighbor Interpolation method.
Definition interpolate2d_nni.cpp:16
Array harmonic_interpolation(const Array &array, const Array &mask_fixed_values, int iterations_max=500, float tolerance=1e-5f, float omega=0.f)
Perform harmonic interpolation on a 2D array using the Successive Over-Relaxation (SOR) method.
Definition harmonic_interpolation.cpp:13
Array interpolate2d_delaunay(glm::ivec2 shape, const std::vector< float > &x, const std::vector< float > &y, const std::vector< float > &values, const Array *p_noise_x=nullptr, const Array *p_noise_y=nullptr, glm::vec4 bbox={0.f, 1.f, 0.f, 1.f}, float fill_value=0.f)
2D interpolation using the Delaunay triangulation method.
Definition interpolate2d_delaunay.cpp:14
float bilinear_interp(float f00, float f10, float f01, float f11, float u, float v)
Compute the bilinear interpolated value from four input values.
Definition interpolate2d.hpp:94
Array interpolate2d(glm::ivec2 shape, const std::vector< float > &x, const std::vector< float > &y, const std::vector< float > &values, InterpolationMethod2D interpolation_method, const Array *p_noise_x=nullptr, const Array *p_noise_y=nullptr, glm::vec4 bbox={0.f, 1.f, 0.f, 1.f})
Generic 2D interpolation function.
Definition interpolate2d.cpp:14
float cubic_interpolate(float p[4], float x)
Definition interpolate2d.hpp:107