00001 #ifndef BALL_MATHS_CUBICSPLINE2D_H
00002 #define BALL_MATHS_CUBICSPLINE2D_H
00003
00004 #include <set>
00005 #include <map>
00006
00007 #ifndef BALL_MATHS_CUBICSPLINE1D_H
00008 # include <BALL/MATHS/cubicSpline1D.h>
00009 #endif
00010
00011 #ifndef BALL_COMMON_EXCEPTION_H
00012 #include <BALL/COMMON/exception.h>
00013 #endif
00014
00015 namespace BALL
00016 {
00017 class BALL_EXPORT CubicSpline2D
00018 {
00019 public:
00020
00021 static const int VERBOSITY_LEVEL_DEBUG;
00022 static const int VERBOSITY_LEVEL_CRITICAL;
00023
00024 BALL_CREATE(CubicSpline2D)
00025
00026
00030
00033 CubicSpline2D();
00034
00035
00052 CubicSpline2D(const std::vector<std::vector<float> >& sample_positions_x,
00053 const std::vector<float>& sample_positions_y,
00054 const std::vector<std::vector<float> >& sample_values,
00055 bool return_average = false,
00056 bool is_natural = true,
00057 const std::vector<float>& x_lower_derivatives = std::vector<float>(),
00058 const std::vector<float>& x_upper_derivatives = std::vector<float>(),
00059 float y_lower_derivative = 0.,
00060 float y_upper_derivative = 0.,
00061 int verbosity = VERBOSITY_LEVEL_DEBUG);
00062
00063
00064
00081 CubicSpline2D(const std::vector<std::vector<float> >& sample_positions_x,
00082 const std::vector<float>& sample_positions_y,
00083 const std::vector<std::vector<float> >& sample_values,
00084 const std::vector<float>& x_default_values,
00085 float y_default_value,
00086 const std::vector<float>& x_lower_bounds,
00087 const std::vector<float>& x_upper_bounds,
00088 float y_lower_bound,
00089 float y_upper_bound,
00090 bool is_natural = true,
00091 const std::vector<float>& x_lower_derivatives = std::vector<float>(),
00092 const std::vector<float>& x_upper_derivatives = std::vector<float>(),
00093 float y_lower_derivative = 0.0,
00094 float y_upper_derivative = 0.0,
00095 int verbosity = VERBOSITY_LEVEL_DEBUG);
00096
00097
00098
00099
00100
00117 CubicSpline2D(const std::vector<float>& sample_positions_x,
00118 const std::vector<float>& sample_positions_y,
00119 const std::vector<std::vector<float> >& sample_values,
00120 bool return_average = false,
00121 bool is_natural = true,
00122 const std::vector<float>& x_lower_derivatives = std::vector<float>(),
00123 const std::vector<float>& x_upper_derivatives = std::vector<float>(),
00124 float y_lower_derivative = 0.,
00125 float y_upper_derivative = 0.,
00126 int verbosity = VERBOSITY_LEVEL_DEBUG);
00127
00144 CubicSpline2D(const std::vector<float>& sample_positions_x,
00145 const std::vector<float>& sample_positions_y,
00146 const std::vector<std::vector<float> >& sample_values,
00147 const std::vector<float>& x_default_values,
00148 float y_default_value,
00149 const std::vector<float>& x_lower_bounds,
00150 const std::vector<float>& x_upper_bounds,
00151 float y_lower_bound,
00152 float y_upper_bound,
00153 bool is_natural = true,
00154 const std::vector<float>& x_lower_derivatives = std::vector<float>(),
00155 const std::vector<float>& x_upper_derivatives = std::vector<float>(),
00156 float y_lower_derivative = 0.0,
00157 float y_upper_derivative = 0.0,
00158 int verbosity = VERBOSITY_LEVEL_DEBUG);
00159
00160
00163 CubicSpline2D(const CubicSpline2D& cs2D);
00164
00167 virtual ~CubicSpline2D();
00168
00170 void setVerbosity(int verbosity);
00171
00182 float operator () (float x, float y);
00183
00187 float getXDefaultValue(Index x) const;
00188
00191 float getYDefaultValue() const {return y_default_value_;}
00192
00193
00194 void setXDefaultValues(vector<float> x_default_values) {x_default_values_ = x_default_values;}
00195
00196
00197 void setYDefaultValue(float y_default_value) {y_default_value_ = y_default_value;}
00198
00199
00200
00201 void setYLowerBound(float lb) {y_lower_bound_ = lb;}
00202 void setYUpperBound(float ub) {y_upper_bound_ = ub;}
00203
00204 float getYLowerBound() {return y_lower_bound_;}
00205 float getYUpperBound() {return y_upper_bound_;}
00206
00207 void setXLowerBounds(vector<float> lb) {x_lower_bounds_ = lb;}
00208 void setXUpperBounds(vector<float> ub) {x_upper_bounds_ = ub;}
00209
00212 const vector<float>& getXLowerBounds() const {return x_lower_bounds_ ;}
00213
00216 const vector<float>& getXUpperBounds() const {return x_upper_bounds_;}
00217
00221 float getXLowerBounds(Index x) const;
00222
00226 float getXUpperBounds(Index x) const;
00227
00230 bool isXNatural(Index x);
00231 vector<bool> isXNatural() const {return x_is_natural_;}
00232
00236 void makeXNatural(Index x, bool recompute = true);
00237
00241 void makeAllXNatural(bool recompute = true);
00242
00247 void makeYNatural(bool y_is_natural, bool recompute = true);
00248
00251 bool isYNatural() {return y_is_natural_;}
00252
00253
00254 void setXLowerDerivatives(vector<float> ld, bool recompute = true);
00255 void setXUpperDerivatives(vector<float> ud, bool recompute = true);
00256
00260 float getXLowerDerivatives(Index x);
00261
00265 float getXUpperDerivatives(Index x);
00266
00267 vector<float>& getXLowerDerivatives() {return x_lower_derivatives_;}
00268 vector<float>& getXUpperDerivatives() {return x_upper_derivatives_;}
00269
00270
00271 void setYLowerDerivative (float ld, bool recompute = true);
00272 void setYUpperDerivative (float ud, bool recompute = true);
00273
00274
00275 float getYLowerDerivative() {return y_lower_derivative_;}
00276 float getYUpperDerivative() {return y_upper_derivative_;}
00277
00278
00282 CubicSpline1D& getSpline(Position i);
00283
00287 const CubicSpline1D& getSpline(Position i) const;
00288
00289 Size getNumberOfSplines() const {return splines_.size();}
00290
00291 private :
00292
00301 void createBiCubicSpline();
00302
00303
00304
00305 std::vector< std::vector<float> > sample_positions_x_;
00306
00307
00308 std::vector<float> sample_positions_y_;
00309
00310
00311 std::vector<CubicSpline1D> splines_;
00312
00313
00314 std::vector<std::vector<float> > sample_values_;
00315
00316
00317
00318
00319
00320
00321 bool return_average_;
00322
00328 std::vector<float> x_default_values_;
00329
00335 float y_default_value_;
00336
00340 float default_value_;
00341
00342
00343 vector<float> x_lower_bounds_;
00344
00345
00346 vector<float> x_upper_bounds_;
00347
00348
00349 float y_lower_bound_;
00350
00351
00352 float y_upper_bound_;
00353
00354
00355
00356 vector<bool> x_is_natural_;
00357
00358
00359 bool y_is_natural_;
00360
00361
00362
00363 vector<float> x_lower_derivatives_;
00364
00365
00366 vector<float> x_upper_derivatives_;
00367
00368
00369 float y_lower_derivative_;
00370
00371
00372 float y_upper_derivative_;
00373
00375 int verbosity_;
00376 };
00377
00378
00379
00380 }
00381 #endif