/vol/vipdata/irtk/image++/include/irtkBSplineInterpolateImageFunction.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _IRTKBSPLINEINTERPOLATEIMAGEFUNCTION_H
00014
00015 #define _IRTKBSPLINEINTERPOLATEIMAGEFUNCTION_H
00016
00029 class irtkBSplineInterpolateImageFunction : public irtkInterpolateImageFunction
00030 {
00031
00032 private:
00033
00035 int _SplineDegree;
00036
00038 int _x;
00039
00041 int _y;
00042
00044 int _z;
00045
00047 int _t;
00048
00050 int _xhalf;
00051
00053 int _yhalf;
00054
00056 int _zhalf;
00057
00059 irtkRealImage _coeff;
00060
00062 static double InitialAntiCausalCoefficient(double *, int, double z);
00063
00065 static double InitialCausalCoefficient(double *, int, double, double);
00066
00068 static void ConvertToInterpolationCoefficients(double *, int, double *, int, double);
00069
00071 void ComputeCoefficients();
00072
00073 public:
00074
00076 irtkBSplineInterpolateImageFunction(int = 3);
00077
00079 ~irtkBSplineInterpolateImageFunction();
00080
00082 virtual const char *NameOfClass();
00083
00085 virtual void Initialize();
00086
00088 virtual void PutSplineDegree(int SplineDegree);
00089
00091 virtual int GetSplineDegree();
00092
00094 virtual double Evaluate(double, double, double, double = 0);
00095
00099 virtual double EvaluateInside(double, double, double, double = 0);
00100
00101 };
00102
00103 inline void irtkBSplineInterpolateImageFunction::PutSplineDegree(int SplineDegree)
00104 {
00105 if ((SplineDegree < 2) || (SplineDegree > 5)) {
00106 cerr << "irtkBSplineInterpolateImageFunction::PutSplineDegree: Unsupported spline degree\n";
00107 exit(1);
00108 }
00109 _SplineDegree = SplineDegree;
00110 }
00111
00112 inline int irtkBSplineInterpolateImageFunction::GetSplineDegree()
00113 {
00114 return _SplineDegree;
00115 }
00116
00117 #endif