00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00041
#ifndef __vtkThinPlateSplineTransform_h
00042
#define __vtkThinPlateSplineTransform_h
00043
00044
#include "vtkWarpTransform.h"
00045
00046 #define VTK_RBF_CUSTOM 0
00047 #define VTK_RBF_R 1
00048 #define VTK_RBF_R2LOGR 2
00049
00050 class VTK_HYBRID_EXPORT vtkThinPlateSplineTransform :
public vtkWarpTransform
00051 {
00052
public:
00053 vtkTypeRevisionMacro(vtkThinPlateSplineTransform,
vtkWarpTransform);
00054
void PrintSelf(ostream& os,
vtkIndent indent);
00055
static vtkThinPlateSplineTransform *
New();
00056
00058
00059 vtkGetMacro(Sigma,
double);
00060 vtkSetMacro(Sigma,
double);
00062
00064
00068
void SetBasis(
int basis);
00069 vtkGetMacro(Basis,
int);
00070 void SetBasisToR() { this->SetBasis(
VTK_RBF_R); };
00071 void SetBasisToR2LogR() { this->SetBasis(
VTK_RBF_R2LOGR); };
00072
const char *GetBasisAsString();
00074
00075
00077
00079 void SetBasisFunction(
double (*U)(
double r)) {
00080
if (this->BasisFunction == U) {
return; }
00081 this->SetBasis(
VTK_RBF_CUSTOM);
00082 this->BasisFunction = U;
00083 this->
Modified(); };
00084 void SetBasisDerivative(
double (*dUdr)(
double r,
double &dU)) {
00085 this->BasisDerivative = dUdr;
00086 this->
Modified(); };
00088
00089
00091
00094
void SetSourceLandmarks(
vtkPoints *source);
00095 vtkGetObjectMacro(SourceLandmarks,
vtkPoints);
00097
00099
00102
void SetTargetLandmarks(
vtkPoints *target);
00103 vtkGetObjectMacro(TargetLandmarks,
vtkPoints);
00105
00107
unsigned long GetMTime();
00108
00110
vtkAbstractTransform *
MakeTransform();
00111
00112
protected:
00113 vtkThinPlateSplineTransform();
00114 ~vtkThinPlateSplineTransform();
00115
00117
void InternalUpdate();
00118
00120
void InternalDeepCopy(
vtkAbstractTransform *transform);
00121
00122
void ForwardTransformPoint(
const float in[3],
float out[3]);
00123
void ForwardTransformPoint(
const double in[3],
double out[3]);
00124
00125
void ForwardTransformDerivative(
const float in[3],
float out[3],
00126
float derivative[3][3]);
00127
void ForwardTransformDerivative(
const double in[3],
double out[3],
00128
double derivative[3][3]);
00129
00130 double Sigma;
00131 vtkPoints *SourceLandmarks;
00132 vtkPoints *TargetLandmarks;
00133
00134
00135
00136 double (*BasisFunction)(
double r);
00137 double (*BasisDerivative)(
double r,
double& dUdr);
00138
00139 int Basis;
00140
00141 int NumberOfPoints;
00142 double **MatrixW;
00143
private:
00144 vtkThinPlateSplineTransform(
const vtkThinPlateSplineTransform&);
00145
void operator=(
const vtkThinPlateSplineTransform&);
00146 };
00147
00148
#endif
00149
00150
00151
00152
00153