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 25namespace 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