00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __rdGCVSpline_h__
00010 #define __rdGCVSpline_h__
00011
00012
00013
00014 #include "rdTools.h"
00015 #include "rdFunction.h"
00016
00017
00018
00019
00047 class RDTOOLS_API rdGCVSpline : public rdFunction
00048 {
00049
00050
00051
00052 public:
00053 static const char PROP_HALF_ORDER[];
00054 static const char PROP_ERROR_VARIANCE[];
00055 static const char PROP_X[];
00056 static const char PROP_COEFF[];
00057 static const char PROP_WEIGHTS[];
00058 static const char PROP_WK[];
00059 protected:
00061 int _halfOrder;
00063 int _n;
00066 double *_x;
00068 double *_weights;
00070 double *_coefficients;
00073 double _errorVariance;
00076 int _knotIndex;
00078 int _nw;
00080 double *_wk;
00082 double *_workEval;
00083
00084
00085
00086
00087
00088 public:
00089
00090
00091
00092 rdGCVSpline();
00093 rdGCVSpline(int aDegree,int aN,const double *aTimes,const double *aValues,
00094 const char *aName=NULL,double aErrorVariance=0.0);
00095 rdGCVSpline(IDOM_Element *aElement);
00096 rdGCVSpline(const rdGCVSpline &aSpline);
00097 virtual ~rdGCVSpline();
00098 virtual rdFunction* copy() const;
00099 virtual rdFunction* copy(IDOM_Element *aElement) const;
00100 private:
00101 void setNull();
00102 void setEqual(const rdGCVSpline &aSpline);
00103
00104
00105
00106
00107 public:
00108 rdGCVSpline& operator=(const rdGCVSpline &aSpline);
00109
00110
00111
00112
00113 void setDegree(int aDegree);
00114 public:
00115 int getDegree();
00116 int getOrder();
00117 int getHalfOrder();
00118 int getN();
00119 double getMinX();
00120 double getMaxX();
00121 const double* getX();
00122 int getNW();
00123 const double* getWorkArray();
00124 const double* getCoefficients();
00125
00126
00127
00128
00129
00130 virtual void updateBoundingBox();
00131 virtual double
00132 evaluate(int aDerivOrder,double aX=0.0,double aY=0.0,double aZ=0.0);
00133
00134
00135
00136
00137 virtual void updateObject(bool aDeep=true);
00138 virtual void updateNode(bool aDeep=true);
00139 virtual void generateNode(IDOM_Element *aParent);
00140 void updateData();
00141
00142
00143 };
00144
00145
00146
00147 #endif // __rdGCVSpline_h__