Anti-Grain Geometry Tutorial
agg_bspline.h
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
Definition: agg_arc.cpp:24