/src/gdal/alg/thinplatespline.h
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * $Id$ |
3 | | * |
4 | | * Project: GDAL Warp API |
5 | | * Purpose: Declarations for 2D Thin Plate Spline transformer. |
6 | | * Author: VIZRT Development Team. |
7 | | * |
8 | | * This code was provided by Gilad Ronnen (gro at visrt dot com) with |
9 | | * permission to reuse under the following license. |
10 | | * |
11 | | ****************************************************************************** |
12 | | * Copyright (c) 2004, VIZRT Inc. |
13 | | * |
14 | | * SPDX-License-Identifier: MIT |
15 | | ****************************************************************************/ |
16 | | |
17 | | #ifndef THINPLATESPLINE_H_INCLUDED |
18 | | #define THINPLATESPLINE_H_INCLUDED |
19 | | |
20 | | #ifndef DOXYGEN_SKIP |
21 | | |
22 | | #include "gdal_alg.h" |
23 | | #include "cpl_conv.h" |
24 | | |
25 | | typedef enum |
26 | | { |
27 | | VIZ_GEOREF_SPLINE_ZERO_POINTS, |
28 | | VIZ_GEOREF_SPLINE_ONE_POINT, |
29 | | VIZ_GEOREF_SPLINE_TWO_POINTS, |
30 | | VIZ_GEOREF_SPLINE_ONE_DIMENSIONAL, |
31 | | VIZ_GEOREF_SPLINE_FULL, |
32 | | |
33 | | VIZ_GEOREF_SPLINE_POINT_WAS_ADDED, |
34 | | VIZ_GEOREF_SPLINE_POINT_WAS_DELETED |
35 | | } vizGeorefInterType; |
36 | | |
37 | | // #define VIZ_GEOREF_SPLINE_MAX_POINTS 40 |
38 | 0 | #define VIZGEOREF_MAX_VARS 2 |
39 | | |
40 | | class VizGeorefSpline2D |
41 | | { |
42 | | bool grow_points(); |
43 | | |
44 | | public: |
45 | | explicit VizGeorefSpline2D(int nof_vars = 1) |
46 | 0 | : type(VIZ_GEOREF_SPLINE_ZERO_POINTS), _nof_vars(nof_vars), |
47 | 0 | _nof_points(0), _max_nof_points(0), _nof_eqs(0), |
48 | | #if 0 |
49 | | _tx(0.0), |
50 | | _ty(0.0), |
51 | | _ta(10.0), |
52 | | #endif |
53 | 0 | _dx(0.0), _dy(0.0), x(nullptr), y(nullptr), u(nullptr), |
54 | 0 | unused(nullptr), index(nullptr), x_mean(0), y_mean(0) |
55 | 0 | { |
56 | 0 | for (int i = 0; i < VIZGEOREF_MAX_VARS; i++) |
57 | 0 | { |
58 | 0 | rhs[i] = nullptr; |
59 | 0 | coef[i] = nullptr; |
60 | 0 | } |
61 | |
|
62 | 0 | grow_points(); |
63 | 0 | } |
64 | | |
65 | | ~VizGeorefSpline2D() |
66 | 0 | { |
67 | 0 | CPLFree(x); |
68 | 0 | CPLFree(y); |
69 | 0 | CPLFree(u); |
70 | 0 | CPLFree(unused); |
71 | 0 | CPLFree(index); |
72 | 0 | for (int i = 0; i < _nof_vars; i++) |
73 | 0 | { |
74 | 0 | CPLFree(rhs[i]); |
75 | 0 | CPLFree(coef[i]); |
76 | 0 | } |
77 | 0 | } |
78 | | |
79 | | #if 0 |
80 | | int get_nof_points(){ |
81 | | return _nof_points; |
82 | | } |
83 | | |
84 | | void set_toler( double tx, double ty ){ |
85 | | _tx = tx; |
86 | | _ty = ty; |
87 | | } |
88 | | |
89 | | void get_toler( double& tx, double& ty) { |
90 | | tx = _tx; |
91 | | ty = _ty; |
92 | | } |
93 | | |
94 | | vizGeorefInterType get_interpolation_type ( ){ |
95 | | return type; |
96 | | } |
97 | | |
98 | | void dump_data_points() |
99 | | { |
100 | | for ( int i = 0; i < _nof_points; i++ ) |
101 | | { |
102 | | fprintf(stderr, "X = %f Y = %f Vars = ", x[i], y[i]); |
103 | | for ( int v = 0; v < _nof_vars; v++ ) |
104 | | fprintf(stderr, "%f ", rhs[v][i+3]); |
105 | | fprintf(stderr, "\n"); |
106 | | } |
107 | | } |
108 | | |
109 | | int delete_list() |
110 | | { |
111 | | _nof_points = 0; |
112 | | type = VIZ_GEOREF_SPLINE_ZERO_POINTS; |
113 | | if ( _AA ) |
114 | | { |
115 | | CPLFree(_AA); |
116 | | _AA = NULL; |
117 | | } |
118 | | if ( _Ainv ) |
119 | | { |
120 | | CPLFree(_Ainv); |
121 | | _Ainv = NULL; |
122 | | } |
123 | | return _nof_points; |
124 | | } |
125 | | #endif |
126 | | |
127 | | bool add_point(const double Px, const double Py, const double *Pvars); |
128 | | int get_point(const double Px, const double Py, double *Pvars); |
129 | | #if 0 |
130 | | int delete_point(const double Px, const double Py ); |
131 | | bool get_xy(int index, double& x, double& y); |
132 | | bool change_point(int index, double x, double y, double* Pvars); |
133 | | void reset(void) { _nof_points = 0; } |
134 | | #endif |
135 | | int solve(void); |
136 | | |
137 | | private: |
138 | | vizGeorefInterType type; |
139 | | |
140 | | const int _nof_vars; |
141 | | int _nof_points; |
142 | | int _max_nof_points; |
143 | | int _nof_eqs; |
144 | | |
145 | | #if 0 |
146 | | // Disabled because the methods that use there is disabled. |
147 | | double _tx, _ty; |
148 | | double _ta; |
149 | | #endif |
150 | | |
151 | | double _dx, _dy; |
152 | | |
153 | | double *x; // [VIZ_GEOREF_SPLINE_MAX_POINTS+3]; |
154 | | double *y; // [VIZ_GEOREF_SPLINE_MAX_POINTS+3]; |
155 | | |
156 | | // double rhs[VIZ_GEOREF_SPLINE_MAX_POINTS+3][VIZGEOREF_MAX_VARS]; |
157 | | // double coef[VIZ_GEOREF_SPLINE_MAX_POINTS+3][VIZGEOREF_MAX_VARS]; |
158 | | double *rhs[VIZGEOREF_MAX_VARS]; |
159 | | double *coef[VIZGEOREF_MAX_VARS]; |
160 | | |
161 | | double *u; // [VIZ_GEOREF_SPLINE_MAX_POINTS]; |
162 | | int *unused; // [VIZ_GEOREF_SPLINE_MAX_POINTS]; |
163 | | int *index; // [VIZ_GEOREF_SPLINE_MAX_POINTS]; |
164 | | |
165 | | double x_mean; |
166 | | double y_mean; |
167 | | |
168 | | private: |
169 | | CPL_DISALLOW_COPY_ASSIGN(VizGeorefSpline2D) |
170 | | }; |
171 | | |
172 | | #endif /* #ifndef DOXYGEN_SKIP */ |
173 | | |
174 | | #endif /* THINPLATESPLINE_H_INCLUDED */ |