GRASS 8 Programmer's Manual 8.6.0dev(2026)-c83afef6d3
Loading...
Searching...
No Matches
interp.c
Go to the documentation of this file.
1/*!
2 \file lib/raster/interp.c
3
4 \brief Raster Library - Interpolation methods
5
6 SPDX-FileCopyrightText: 2001-2009,2013 GRASS Development Team
7 SPDX-License-Identifier: GPL-2.0-or-later
8
9 \author Original author CERL
10 */
11
12#include <math.h>
13#include <string.h>
14
15#include <grass/gis.h>
16#include <grass/raster.h>
17#include <grass/glocale.h>
18
20{
21 return u * (c1 - c0) + c0;
22}
23
25 DCELL c11)
26{
29
30 return Rast_interp_linear(v, c0, c1);
31}
32
34{
35 return (u * (u * (u * (c3 - 3 * c2 + 3 * c1 - c0) +
36 (-c3 + 4 * c2 - 5 * c1 + 2 * c0)) +
37 (c2 - c0)) +
38 2 * c1) /
39 2;
40}
41
54
55DCELL Rast_interp_lanczos(double u, double v, DCELL *c)
56{
57 double uweight[5], vweight[5], d, d_pi;
58 double usum, vsum;
59 DCELL c0, c1, c2, c3, c4;
60 double sind, sincd1, sincd2;
61
62 d_pi = u * M_PI;
63 sind = 2 * sin(d_pi);
64 sincd1 = sind * sin(d_pi / 2);
65 uweight[2] = (u == 0 ? 1 : sincd1 / (d_pi * d_pi));
66 usum = uweight[2];
67
68 d = u + 2;
69 d_pi = d * M_PI;
70 if (d > 2)
71 uweight[0] = 0.;
72 else
73 uweight[0] = (d == 0 ? 1 : -sincd1 / (d_pi * d_pi));
74 usum += uweight[0];
75
76 d = u + 1.;
77 d_pi = d * M_PI;
78 sincd2 = sind * sin(d_pi / 2);
79 uweight[1] = (d == 0 ? 1 : -sincd2 / (d_pi * d_pi));
80 usum += uweight[1];
81
82 d = u - 1.;
83 d_pi = d * M_PI;
84 uweight[3] = (d == 0 ? 1 : sincd2 / (d_pi * d_pi));
85 usum += uweight[3];
86
87 d = u - 2.;
88 d_pi = d * M_PI;
89 if (d < -2)
90 uweight[4] = 0.;
91 else
92 uweight[4] = (d == 0 ? 1 : -sincd1 / (d_pi * d_pi));
93 usum += uweight[4];
94
95 d_pi = v * M_PI;
96 sind = 2 * sin(d_pi);
97 sincd1 = sind * sin(d_pi / 2);
98 vweight[2] = (v == 0 ? 1 : sincd1 / (d_pi * d_pi));
99 vsum = vweight[2];
100
101 d = v + 2;
102 d_pi = d * M_PI;
103 if (d > 2)
104 vweight[0] = 0;
105 else
106 vweight[0] = (d == 0 ? 1 : -sincd1 / (d_pi * d_pi));
107 vsum += vweight[0];
108
109 d = v + 1.;
110 d_pi = d * M_PI;
111 sincd2 = sind * sin(d_pi / 2);
112 vweight[1] = (d == 0 ? 1 : -sincd2 / (d_pi * d_pi));
113 vsum += vweight[1];
114
115 d = v - 1.;
116 d_pi = d * M_PI;
117 vweight[3] = (d == 0 ? 1 : sincd2 / (d_pi * d_pi));
118 vsum += vweight[3];
119
120 d = v - 2.;
121 d_pi = d * M_PI;
122 if (d < -2)
123 vweight[4] = 0;
124 else
125 vweight[4] = (d == 0 ? 1 : -sincd1 / (d_pi * d_pi));
126 vsum += vweight[4];
127
128 c0 = (c[0] * uweight[0] + c[1] * uweight[1] + c[2] * uweight[2] +
129 c[3] * uweight[3] + c[4] * uweight[4]);
130 c1 = (c[5] * uweight[0] + c[6] * uweight[1] + c[7] * uweight[2] +
131 c[8] * uweight[3] + c[9] * uweight[4]);
132 c2 = (c[10] * uweight[0] + c[11] * uweight[1] + c[12] * uweight[2] +
133 c[13] * uweight[3] + c[14] * uweight[4]);
134 c3 = (c[15] * uweight[0] + c[16] * uweight[1] + c[17] * uweight[2] +
135 c[18] * uweight[3] + c[19] * uweight[4]);
136 c4 = (c[20] * uweight[0] + c[21] * uweight[1] + c[22] * uweight[2] +
137 c[23] * uweight[3] + c[24] * uweight[4]);
138
139 return ((c0 * vweight[0] + c1 * vweight[1] + c2 * vweight[2] +
140 c3 * vweight[3] + c4 * vweight[4]) /
141 (usum * vsum));
142}
143
145 DCELL c3)
146{
147 return (u * (u * (u * (c3 - 3 * c2 + 3 * c1 - c0) +
148 (3 * c2 - 6 * c1 + 3 * c0)) +
149 (3 * c2 - 3 * c0)) +
150 c2 + 4 * c1 + c0) /
151 6;
152}
153
167
168/*!
169 \brief Get interpolation method from the option.
170
171 Calls G_fatal_error() on unknown interpolation method.
172
173 Supported methods:
174 - NEAREST
175 - BILINEAR
176 - CUBIC
177
178 \code
179 int interp_method
180 struct Option *opt_method;
181
182 opt_method = G_define_standard_option(G_OPT_R_INTERP_TYPE);
183
184 if (G_parser(argc, argv))
185 exit(EXIT_FAILURE);
186
187 interp_method = G_option_to_interp_type(opt_method);
188 \endcode
189
190 \param option pointer to interpolation option
191
192 \return interpolation method code
193 */
195{
196 int interp_type;
197
199 if (option->answer) {
200 if (strcmp(option->answer, "nearest") == 0) {
202 }
203 else if (strcmp(option->answer, "bilinear") == 0) {
205 }
206 else if (strcmp(option->answer, "bicubic") == 0) {
208 }
209 }
210
212 G_fatal_error(_("Unknown interpolation method: %s"), option->answer);
213
214 return interp_type;
215}
void void void void G_fatal_error(const char *,...) __attribute__((format(printf
double DCELL
Definition gis.h:632
#define M_PI
Definition gis.h:154
#define _(str)
Definition glocale.h:10
int Rast_option_to_interp_type(const struct Option *option)
Get interpolation method from the option.
Definition interp.c:194
DCELL Rast_interp_cubic(double u, DCELL c0, DCELL c1, DCELL c2, DCELL c3)
Definition interp.c:33
DCELL Rast_interp_bilinear(double u, double v, DCELL c00, DCELL c01, DCELL c10, DCELL c11)
Definition interp.c:24
DCELL Rast_interp_bicubic_bspline(double u, double v, DCELL c00, DCELL c01, DCELL c02, DCELL c03, DCELL c10, DCELL c11, DCELL c12, DCELL c13, DCELL c20, DCELL c21, DCELL c22, DCELL c23, DCELL c30, DCELL c31, DCELL c32, DCELL c33)
Definition interp.c:154
DCELL Rast_interp_linear(double u, DCELL c0, DCELL c1)
Definition interp.c:19
DCELL Rast_interp_cubic_bspline(double u, DCELL c0, DCELL c1, DCELL c2, DCELL c3)
Definition interp.c:144
DCELL Rast_interp_lanczos(double u, double v, DCELL *c)
Definition interp.c:55
DCELL Rast_interp_bicubic(double u, double v, DCELL c00, DCELL c01, DCELL c02, DCELL c03, DCELL c10, DCELL c11, DCELL c12, DCELL c13, DCELL c20, DCELL c21, DCELL c22, DCELL c23, DCELL c30, DCELL c31, DCELL c32, DCELL c33)
Definition interp.c:42
#define INTERP_BILINEAR
Definition raster.h:21
#define INTERP_NEAREST
Definition raster.h:20
#define INTERP_UNKNOWN
Interpolation methods.
Definition raster.h:19
#define INTERP_BICUBIC
Definition raster.h:22
Structure that stores option information.
Definition gis.h:560