1 //---------------------------------------------------------------------------- 2 // Anti-Grain Geometry - Version 2.4 3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com) 4 // 5 // Permission to copy, use, modify, sell and distribute this software 6 // is granted provided this copyright notice appears in all copies. 7 // This software is provided "as is" without express or implied 8 // warranty, and with no claim as to its suitability for any purpose. 9 // 10 //---------------------------------------------------------------------------- 11 // Contact: mcseem@antigrain.com 12 // mcseemagg@yahoo.com 13 // http://www.antigrain.com 14 //---------------------------------------------------------------------------- 15 // 16 // class bspline 17 // 18 //---------------------------------------------------------------------------- 19 20 #ifndef AGG_BSPLINE_INCLUDED 21 #define AGG_BSPLINE_INCLUDED 22 23 #include "agg_array.h" 24 25 namespace agg 26 { 27 //----------------------------------------------------------------bspline 28 // A very simple class of Bi-cubic Spline interpolation. 29 // First call init(num, x[], y[]) where num - number of source points, 30 // x, y - arrays of X and Y values respectively. Here Y must be a function 31 // of X. It means that all the X-coordinates must be arranged in the ascending 32 // order. 33 // Then call get(x) that calculates a value Y for the respective X. 34 // The class supports extrapolation, i.e. you can call get(x) where x is 35 // outside the given with init() X-range. Extrapolation is a simple linear 36 // function. 37 // 38 // See Implementation agg_bspline.cpp 39 //------------------------------------------------------------------------ 40 class bspline 41 { 42 public: 43 bspline(); 44 bspline(int num); 45 bspline(int num, const double* x, const double* y); 46 47 void init(int num); 48 void add_point(double x, double y); 49 void prepare(); 50 51 void init(int num, const double* x, const double* y); 52 53 double get(double x) const; 54 double get_stateful(double x) const; 55 56 private: 57 bspline(const bspline&); 58 const bspline& operator = (const bspline&); 59 60 static void bsearch(int n, const double *x, double x0, int *i); 61 double extrapolation_left(double x) const; 62 double extrapolation_right(double x) const; 63 double interpolation(double x, int i) const; 64 65 int m_max; 66 int m_num; 67 double* m_x; 68 double* m_y; 69 pod_array<double> m_am; 70 mutable int m_last_idx; 71 }; 72 73 74 } 75 76 #endif 77