00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "gdal_alg.h"
00034 #include "cpl_conv.h"
00035
00036 typedef enum
00037 {
00038 VIZ_GEOREF_SPLINE_ZERO_POINTS,
00039 VIZ_GEOREF_SPLINE_ONE_POINT,
00040 VIZ_GEOREF_SPLINE_TWO_POINTS,
00041 VIZ_GEOREF_SPLINE_ONE_DIMENSIONAL,
00042 VIZ_GEOREF_SPLINE_FULL,
00043
00044 VIZ_GEOREF_SPLINE_POINT_WAS_ADDED,
00045 VIZ_GEOREF_SPLINE_POINT_WAS_DELETED
00046
00047 } vizGeorefInterType;
00048
00049
00050 #define VIZGEOREF_MAX_VARS 2
00051
00052 class VizGeorefSpline2D
00053 {
00054 public:
00055
00056 VizGeorefSpline2D(int nof_vars = 1){
00057 x = y = u = NULL;
00058 unused = index = NULL;
00059 for( int i = 0; i < nof_vars; i++ )
00060 {
00061 rhs[i] = NULL;
00062 coef[i] = NULL;
00063 }
00064
00065 _tx = _ty = 0.0;
00066 _ta = 10.0;
00067 _nof_points = 0;
00068 _nof_vars = nof_vars;
00069 _max_nof_points = 0;
00070 _AA = NULL;
00071 _Ainv = NULL;
00072 grow_points();
00073 type = VIZ_GEOREF_SPLINE_ZERO_POINTS;
00074 }
00075
00076 ~VizGeorefSpline2D(){
00077 if ( _AA )
00078 CPLFree(_AA);
00079 if ( _Ainv )
00080 CPLFree(_Ainv);
00081
00082 CPLFree( x );
00083 CPLFree( y );
00084 CPLFree( u );
00085 CPLFree( unused );
00086 CPLFree( index );
00087 for( int i = 0; i < _nof_vars; i++ )
00088 {
00089 CPLFree( rhs[i] );
00090 CPLFree( coef[i] );
00091 }
00092 }
00093
00094 int get_nof_points(){
00095 return _nof_points;
00096 }
00097
00098 void set_toler( double tx, double ty ){
00099 _tx = tx;
00100 _ty = ty;
00101 }
00102
00103 void get_toler( double& tx, double& ty) {
00104 tx = _tx;
00105 ty = _ty;
00106 }
00107
00108 vizGeorefInterType get_interpolation_type ( ){
00109 return type;
00110 }
00111
00112 void dump_data_points()
00113 {
00114 for ( int i = 0; i < _nof_points; i++ )
00115 {
00116 fprintf(stderr, "X = %f Y = %f Vars = ", x[i], y[i]);
00117 for ( int v = 0; v < _nof_vars; v++ )
00118 fprintf(stderr, "%f ", rhs[v][i+3]);
00119 fprintf(stderr, "\n");
00120 }
00121 }
00122 int delete_list()
00123 {
00124 _nof_points = 0;
00125 type = VIZ_GEOREF_SPLINE_ZERO_POINTS;
00126 if ( _AA )
00127 {
00128 CPLFree(_AA);
00129 _AA = NULL;
00130 }
00131 if ( _Ainv )
00132 {
00133 CPLFree(_Ainv);
00134 _Ainv = NULL;
00135 }
00136 return _nof_points;
00137 }
00138
00139 void grow_points();
00140 int add_point( const double Px, const double Py, const double *Pvars );
00141 int delete_point(const double Px, const double Py );
00142 int get_point( const double Px, const double Py, double *Pvars );
00143 bool get_xy(int index, double& x, double& y);
00144 bool change_point(int index, double x, double y, double* Pvars);
00145 void reset(void) { _nof_points = 0; }
00146 int solve(void);
00147
00148 private:
00149 double base_func( const double x1, const double y1,
00150 const double x2, const double y2 );
00151
00152 vizGeorefInterType type;
00153
00154 int _nof_vars;
00155 int _nof_points;
00156 int _max_nof_points;
00157 int _nof_eqs;
00158
00159 double _tx, _ty;
00160 double _ta;
00161 double _dx, _dy;
00162
00163 double *x;
00164 double *y;
00165
00166
00167
00168 double *rhs[VIZGEOREF_MAX_VARS];
00169 double *coef[VIZGEOREF_MAX_VARS];
00170
00171 double *u;
00172 int *unused;
00173 int *index;
00174
00175 double *_AA, *_Ainv;
00176 };
00177
00178