Go to the documentation of this file.00001
00002 #ifndef mbl_thin_plate_spline_3d_h_
00003 #define mbl_thin_plate_spline_3d_h_
00004
00005
00006
00007
00008
00009 #include <vgl/vgl_point_3d.h>
00010 #include <vcl_vector.h>
00011 #include <vnl/vnl_vector.h>
00012 #include <vnl/vnl_matrix.h>
00013 #include <vsl/vsl_binary_io.h>
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
00039
00040
00041 class mbl_thin_plate_spline_3d
00042 {
00043 vnl_vector<double> Wx_,Wy_,Wz_;
00044 double Ax0_, AxX_, AxY_, AxZ_;
00045 double Ay0_, AyX_, AyY_, AyZ_;
00046 double Az0_, AzX_, AzY_, AzZ_;
00047 double energy_x_,energy_y_,energy_z_;
00048
00049 vcl_vector<vgl_point_3d<double> > src_pts_;
00050
00051
00052 vnl_matrix<double> L_inv_;
00053
00054
00055 void build_pure_affine(const vcl_vector<vgl_point_3d<double> >& source_pts,
00056 const vcl_vector<vgl_point_3d<double> >& dest_pts);
00057
00058
00059 void set_params(const vnl_vector<double>& W1,
00060 const vnl_vector<double>& W2,
00061 const vnl_vector<double>& W3);
00062
00063 void set_up_rhs(vnl_vector<double>& Bx,
00064 vnl_vector<double>& By,
00065 vnl_vector<double>& Bz,
00066 const vcl_vector<vgl_point_3d<double> >& dest_pts);
00067
00068
00069 void compute_energy(vnl_vector<double>& W1,
00070 vnl_vector<double>& W2,
00071 vnl_vector<double>& W3,
00072 const vnl_matrix<double>& L);
00073
00074 public:
00075
00076
00077 mbl_thin_plate_spline_3d();
00078
00079
00080 virtual ~mbl_thin_plate_spline_3d();
00081
00082
00083 void build(const vcl_vector<vgl_point_3d<double> >& source_pts,
00084 const vcl_vector<vgl_point_3d<double> >& dest_pts,
00085 bool compute_the_energy=false);
00086
00087
00088
00089
00090 void set_source_pts(const vcl_vector<vgl_point_3d<double> >& source_pts);
00091
00092
00093 void build(const vcl_vector<vgl_point_3d<double> >& dest_pts);
00094
00095
00096 vgl_point_3d<double> operator()(double x, double y, double z) const;
00097
00098
00099 vgl_point_3d<double> operator()(const vgl_point_3d<double>& p) const
00100 { return operator()(p.x(),p.y(),p.z()); }
00101
00102
00103
00104 double bendingEnergyX() const { return energy_x_; }
00105
00106
00107
00108 double bendingEnergyY() const { return energy_y_; }
00109
00110
00111
00112 double bendingEnergyZ() const { return energy_z_; }
00113
00114
00115 short version_no() const;
00116
00117
00118 void print_summary(vcl_ostream& os) const;
00119
00120
00121 void b_write(vsl_b_ostream& bfs) const;
00122
00123
00124 void b_read(vsl_b_istream& bfs);
00125
00126
00127 bool operator==(const mbl_thin_plate_spline_3d& tps) const;
00128 };
00129
00130
00131 void vsl_b_write(vsl_b_ostream& bfs, const mbl_thin_plate_spline_3d& b);
00132
00133
00134 void vsl_b_read(vsl_b_istream& bfs, mbl_thin_plate_spline_3d& b);
00135
00136
00137 vcl_ostream& operator<<(vcl_ostream& os,const mbl_thin_plate_spline_3d& b);
00138
00139 #endif
00140
00141