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