Go to the documentation of this file.00001
00002 #ifndef mbl_thin_plate_spline_2d_h_
00003 #define mbl_thin_plate_spline_2d_h_
00004
00005
00006
00007
00008
00009 #include <vgl/vgl_point_2d.h>
00010 #include <vnl/vnl_vector.h>
00011 #include <vnl/vnl_matrix.h>
00012 #include <vsl/vsl_binary_io.h>
00013 #include <vcl_vector.h>
00014 #include <vcl_iosfwd.h>
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 class mbl_thin_plate_spline_2d
00044 {
00045 vnl_vector<double> Wx_,Wy_;
00046 double Ax0_, AxX_, AxY_;
00047 double Ay0_, AyX_, AyY_;
00048 double energy_x_,energy_y_;
00049
00050 bool return_pure_affine_;
00051
00052 vcl_vector<vgl_point_2d<double> > src_pts_;
00053
00054
00055 vnl_matrix<double> L_inv_;
00056
00057
00058 void build_pure_affine(const vcl_vector<vgl_point_2d<double> >& source_pts,
00059 const vcl_vector<vgl_point_2d<double> >& dest_pts);
00060
00061
00062 void set_params(const vnl_vector<double>& W1,
00063 const vnl_vector<double>& W2);
00064
00065 void set_up_rhs(vnl_vector<double>& Bx,
00066 vnl_vector<double>& By,
00067 const vcl_vector<vgl_point_2d<double> >& dest_pts);
00068
00069
00070 void compute_energy(vnl_vector<double>& W1,
00071 vnl_vector<double>& W2,
00072 const vnl_matrix<double>& L);
00073
00074 public:
00075
00076
00077 mbl_thin_plate_spline_2d();
00078
00079
00080 virtual ~mbl_thin_plate_spline_2d();
00081
00082
00083 void build(const vcl_vector<vgl_point_2d<double> >& source_pts,
00084 const vcl_vector<vgl_point_2d<double> >& dest_pts,
00085 bool compute_the_energy=false);
00086
00087
00088
00089
00090 void set_source_pts(const vcl_vector<vgl_point_2d<double> >& source_pts);
00091
00092
00093 const vcl_vector<vgl_point_2d<double> >& src_pts() const
00094 { return src_pts_; }
00095
00096
00097
00098 void build(const vcl_vector<vgl_point_2d<double> >& dest_pts);
00099
00100
00101 vgl_point_2d<double> operator()(double x, double y) const;
00102
00103
00104 vgl_point_2d<double> operator()(const vgl_point_2d<double>& p) const
00105 { return operator()(p.x(),p.y()); }
00106
00107
00108
00109 double bendingEnergyX() const { return energy_x_; }
00110
00111
00112
00113 double bendingEnergyY() const { return energy_y_; }
00114
00115
00116
00117
00118 void set_pure_affine(bool val) { return_pure_affine_ = val; }
00119
00120
00121 short version_no() const;
00122
00123
00124 void print_summary(vcl_ostream& os) const;
00125
00126
00127 void b_write(vsl_b_ostream& bfs) const;
00128
00129
00130 void b_read(vsl_b_istream& bfs);
00131
00132
00133 bool operator==(const mbl_thin_plate_spline_2d& tps) const;
00134 };
00135
00136
00137 void vsl_b_write(vsl_b_ostream& bfs, const mbl_thin_plate_spline_2d& b);
00138
00139
00140 void vsl_b_read(vsl_b_istream& bfs, mbl_thin_plate_spline_2d& b);
00141
00142
00143 vcl_ostream& operator<<(vcl_ostream& os,const mbl_thin_plate_spline_2d& b);
00144
00145 #endif
00146
00147