00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00068 #ifndef __vtkThinPlateSplineTransform_h
00069 #define __vtkThinPlateSplineTransform_h
00070
00071 #include "vtkWarpTransform.h"
00072
00073 #define VTK_RBF_CUSTOM 0
00074 #define VTK_RBF_R 1
00075 #define VTK_RBF_R2LOGR 2
00076
00077 class VTK_HYBRID_EXPORT vtkThinPlateSplineTransform : public vtkWarpTransform
00078 {
00079 public:
00080 vtkTypeMacro(vtkThinPlateSplineTransform,vtkWarpTransform);
00081 void PrintSelf(ostream& os, vtkIndent indent);
00082 static vtkThinPlateSplineTransform *New();
00083
00085
00086 vtkGetMacro(Sigma,double);
00087 vtkSetMacro(Sigma,double);
00089
00091
00093 void SetBasis(int basis);
00094 vtkGetMacro(Basis,int);
00095 void SetBasisToR() { this->SetBasis(VTK_RBF_R); };
00096 void SetBasisToR2LogR() { this->SetBasis(VTK_RBF_R2LOGR); };
00097 const char *GetBasisAsString();
00099
00100
00102
00103 both the function and its derivative with respect to r. */
00104 void SetBasisFunction(double (*U)(double r)) {
00105 if (this->BasisFunction == U) { return; }
00106 this->SetBasis(VTK_RBF_CUSTOM);
00107 this->BasisFunction = U;
00108 this->Modified(); };
00109 void SetBasisDerivative(double (*dUdr)(double r, double &dU)) {
00110 this->BasisDerivative = dUdr;
00111 this->Modified(); };
00113
00114
00116
00119 void SetSourceLandmarks(vtkPoints *source);
00120 vtkGetObjectMacro(SourceLandmarks,vtkPoints);
00122
00124
00127 void SetTargetLandmarks(vtkPoints *target);
00128 vtkGetObjectMacro(TargetLandmarks,vtkPoints);
00130
00132 unsigned long GetMTime();
00133
00135 vtkAbstractTransform *MakeTransform();
00136
00137 protected:
00138 vtkThinPlateSplineTransform();
00139 ~vtkThinPlateSplineTransform();
00140
00142 void InternalUpdate();
00143
00145 void InternalDeepCopy(vtkAbstractTransform *transform);
00146
00147 void ForwardTransformPoint(const float in[3], float out[3]);
00148 void ForwardTransformPoint(const double in[3], double out[3]);
00149
00150 void ForwardTransformDerivative(const float in[3], float out[3],
00151 float derivative[3][3]);
00152 void ForwardTransformDerivative(const double in[3], double out[3],
00153 double derivative[3][3]);
00154
00155 double Sigma;
00156 vtkPoints *SourceLandmarks;
00157 vtkPoints *TargetLandmarks;
00158
00159
00160
00161 double (*BasisFunction)(double r);
00162 double (*BasisDerivative)(double r, double& dUdr);
00163
00164 int Basis;
00165
00166 int NumberOfPoints;
00167 double **MatrixW;
00168 private:
00169 vtkThinPlateSplineTransform(const vtkThinPlateSplineTransform&);
00170 void operator=(const vtkThinPlateSplineTransform&);
00171 };
00172
00173 #endif
00174
00175
00176
00177
00178