KrisLibrary  1.0.0
BSpline.h
1 #ifndef SPLINE_BSPLINE_H
2 #define SPLINE_BSPLINE_H
3 
4 #include <KrisLibrary/math/sparsevector.h>
5 #include <KrisLibrary/math/sparsematrix.h>
6 #include <vector>
7 
8 namespace Spline {
9 
10 using namespace Math;
11 
23 {
25  void SetUniformKnots(size_t numCps,size_t degree,Real h=One);
26 
28  void SetClosedKnots(size_t numCps,size_t degree,Real h=One);
29 
31  int Degree() const { return (int)knots.size()-numControlPoints-1; }
32 
35  std::pair<int,int> Support(int k) const { return std::pair<int,int>(k-Degree(),k); }
38  std::pair<int,int> Domain(int k) const { return std::pair<int,int>(k,k+Degree()); }
39 
40  Real StartTime() const { return knots[Degree()]; }
41  Real EndTime() const { return knots[knots.size()-Degree()-1]; }
42 
44  int GetKnot(Real t) const;
45 
49  void Evaluate(Real t,SparseVector& basis) const;
50 
58  void Evaluate(int k,SparseMatrix& basis) const;
59 
63  void Deriv(Real t,SparseVector& basis) const;
64 
68  void Deriv2(Real t,SparseVector& basis) const;
69 
71  void EvaluateWithDerivs(Real t,SparseVector& b,SparseVector& db) const;
72  void EvaluateWithDerivs(Real t,SparseVector& b,SparseVector& db,SparseVector& ddb) const;
73 
75  //(db[0] contains the regular spline coefficients)
76  void EvaluateWithDerivs(Real t,std::vector<SparseVector >& db) const;
77 
78  bool IsValid() const;
79 
80  int numControlPoints;
81  std::vector<Real> knots;
82 };
83 
84 struct BSpline
85 {
86  BSpline();
87  int Degree() const { return basis.Degree(); }
88  void SetConstant(const Vector& value);
89  void Evaluate(Real t,Vector& value) const;
90  void Deriv(Real t,Vector& value) const;
91  void Deriv(Real t,int k,Vector& value) const;
92  bool IsValid() const;
93 
94  BSplineBasis basis;
95  std::vector<Vector> cps;
96 };
97 
113 Real CoxDeBoor(int i,int p,Real t,const std::vector<Real>& u);
114 
122 void CoxDeBoor(int i,int p,Real t,const std::vector<Real>& u,Real N[]);
123 
126 void CoxDeBoorDeriv(int i,int p,Real t,const std::vector<Real>& u,Real N[],Real dN[]);
127 
129 void CoxDeBoorDeriv2(int i,int p,Real t,const std::vector<Real>& u,Real N[],Real dN[],Real ddN[]);
130 
134 void CoxDeBoorDerivN(int i,int p,Real t,int n,const std::vector<Real>& u,Real** N);
135 
141 void CoxDeBoorBasis(int base,int i,int p,const std::vector<Real>& u,Real B[]);
142 
148 void CoxDeBoorBasis2(int base,int p,const std::vector<Real>& u,Real** B);
149 
150 std::istream& operator >> (std::istream& in,BSpline& spline);
151 std::ostream& operator << (std::ostream& in,const BSpline& spline);
152 
153 } // namespace Spline
154 
155 #endif
std::pair< int, int > Domain(int k) const
Definition: BSpline.h:38
std::pair< int, int > Support(int k) const
Definition: BSpline.h:35
Defines the B-spline basis for a given knot vector, number of control points.
Definition: BSpline.h:22
int Degree() const
Returns the degree p.
Definition: BSpline.h:31
Definition: SparseVectorTemplate.h:14
Definition: BSpline.cpp:9
Contains all definitions in the Math package.
Definition: WorkspaceBound.h:12
Definition: BSpline.h:84