Go to the documentation of this file.00001
00002 #ifndef vgl_h_matrix_3d_h_
00003 #define vgl_h_matrix_3d_h_
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <vnl/vnl_fwd.h>
00023 #include <vnl/vnl_matrix_fixed.h>
00024 #include <vgl/vgl_homg_point_3d.h>
00025 #include <vgl/vgl_homg_plane_3d.h>
00026 #include <vcl_vector.h>
00027 #include <vcl_iosfwd.h>
00028
00029
00030
00031
00032 template <class T>
00033 class vgl_h_matrix_3d
00034 {
00035 protected:
00036 vnl_matrix_fixed<T,4,4> t12_matrix_;
00037 public:
00038 vgl_h_matrix_3d() {}
00039 ~vgl_h_matrix_3d() {}
00040
00041 vgl_h_matrix_3d(vgl_h_matrix_3d<T> const& M) : t12_matrix_(M.get_matrix()) {}
00042
00043 vgl_h_matrix_3d(vnl_matrix_fixed<T,4,4> const& M) : t12_matrix_(M) {}
00044
00045 vgl_h_matrix_3d(vnl_matrix_fixed<T,3,3> const& M,
00046 vnl_vector_fixed<T,3> const& m);
00047
00048 explicit vgl_h_matrix_3d(T const* M) : t12_matrix_(M) {}
00049
00050 explicit vgl_h_matrix_3d(vcl_istream& s);
00051
00052 explicit vgl_h_matrix_3d(char const* filename);
00053
00054 vgl_h_matrix_3d(vcl_vector<vgl_homg_point_3d<T> > const& points1,
00055 vcl_vector<vgl_homg_point_3d<T> > const& points2);
00056
00057
00058
00059
00060 vgl_homg_point_3d<T> operator()(vgl_homg_point_3d<T> const& p) const;
00061
00062 vgl_homg_point_3d<T> operator* (vgl_homg_point_3d<T> const& p) const {return (*this)(p);}
00063
00064 bool operator==(vgl_h_matrix_3d<T> const& M) const { return t12_matrix_ == M.get_matrix(); }
00065
00066
00067 vgl_homg_plane_3d<T> preimage(vgl_homg_plane_3d<T> const& l) const;
00068 vgl_homg_plane_3d<T> correlation(vgl_homg_point_3d<T> const& p) const;
00069 vgl_homg_point_3d<T> correlation(vgl_homg_plane_3d<T> const& l) const;
00070
00071
00072
00073
00074
00075 vgl_homg_point_3d<T> preimage(vgl_homg_point_3d<T> const& q) const;
00076
00077
00078 vgl_homg_plane_3d<T> operator()(vgl_homg_plane_3d<T> const& l) const;
00079
00080
00081 vgl_homg_plane_3d<T> operator*(vgl_homg_plane_3d<T> const& l) const { return (*this)(l);}
00082
00083
00084 vgl_h_matrix_3d<T> operator * (vgl_h_matrix_3d<T> const& H) const
00085 { return vgl_h_matrix_3d<T>(t12_matrix_* H.t12_matrix_); }
00086
00087
00088
00089
00090 vnl_matrix_fixed<T,4,4> const& get_matrix() const { return t12_matrix_; }
00091
00092 void get (vnl_matrix_fixed<T,4,4>* M) const;
00093
00094
00095 void get (vnl_matrix<T>* M) const;
00096
00097 void get (T* M) const;
00098
00099 T get (unsigned int row_index, unsigned int col_index) const;
00100
00101 vgl_h_matrix_3d get_inverse() const;
00102
00103
00104 vgl_h_matrix_3d& set (unsigned int row_index, unsigned int col_index, T value)
00105 { t12_matrix_[row_index][col_index]=value; return *this; }
00106
00107
00108 vgl_h_matrix_3d& set(T const* M);
00109
00110 vgl_h_matrix_3d& set(vnl_matrix_fixed<T,4,4> const& M);
00111
00112
00113
00114
00115 vgl_h_matrix_3d& set_identity();
00116
00117 vgl_h_matrix_3d& set_translation(T tx, T ty, T tz);
00118
00119
00120
00121
00122
00123
00124
00125 vgl_h_matrix_3d& set_scale(T scale);
00126
00127
00128
00129
00130
00131
00132
00133
00134 vgl_h_matrix_3d& set_affine(vnl_matrix_fixed<T,3,4> const& M34);
00135
00136
00137 vgl_h_matrix_3d& set_rotation_matrix(vnl_matrix_fixed<T,3,3> const& R);
00138
00139
00140
00141 vgl_h_matrix_3d& set_rotation_about_axis(vnl_vector_fixed<T,3> const& axis, T theta);
00142
00143
00144
00145
00146
00147 vgl_h_matrix_3d& set_rotation_roll_pitch_yaw(T yaw, T pitch, T roll);
00148
00149
00150 vgl_h_matrix_3d& set_rotation_euler(T rz1, T ry, T rz2);
00151
00152
00153 void set_reflection_plane(vgl_plane_3d<double> const& p);
00154
00155 bool is_rotation() const;
00156 bool is_identity() const;
00157 bool is_euclidean() const;
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 bool projective_basis(vcl_vector<vgl_homg_point_3d<T> > const& five_points);
00173
00174
00175
00176
00177
00178
00179 bool projective_basis(vcl_vector<vgl_homg_plane_3d<T> > const& five_planes);
00180
00181
00182
00183
00184 vgl_h_matrix_3d<T> get_upper_3x3() const;
00185 vnl_matrix_fixed<T,3,3> get_upper_3x3_matrix() const;
00186
00187
00188 vgl_homg_point_3d<T> get_translation() const;
00189 vnl_vector_fixed<T,3> get_translation_vector() const;
00190
00191
00192 bool read(vcl_istream& s);
00193
00194 bool read(char const* filename);
00195 };
00196
00197
00198 template <class T> vcl_ostream& operator<<(vcl_ostream& s, vgl_h_matrix_3d<T> const& H);
00199
00200 template <class T> vcl_istream& operator>>(vcl_istream& s, vgl_h_matrix_3d<T>& H)
00201 { H.read(s); return s; }
00202
00203 #define VGL_H_MATRIX_3D_INSTANTIATE(T) extern "please include vgl/algo/vgl_h_matrix_3d.txx first"
00204
00205 #endif // vgl_h_matrix_3d_h_