00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_FUN_X2X_TRANSLATION_HH
00027 # define MLN_FUN_X2X_TRANSLATION_HH
00028
00032
00033 # include <mln/core/concept/function.hh>
00034 # include <mln/fun/internal/x2x_linear_impl.hh>
00035 # include <mln/algebra/vec.hh>
00036 # include <mln/algebra/h_mat.hh>
00037 # include <mln/fun/i2v/all.hh>
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace fun
00044 {
00045
00046 namespace x2x
00047 {
00048
00050
00051 template <unsigned n, typename C>
00052 struct translation
00053 :
00054 fun::internal::x2x_linear_impl_< algebra::vec<n,C>, translation<n,C> >,
00055 public Function_v2v< translation<n,C> >
00056 {
00058 typedef translation<n,C> invert;
00060 invert inv() const;
00061
00063 translation();
00065 translation(const algebra::vec<n,C>& t);
00066
00068 algebra::vec<n,C> operator()(const algebra::vec<n,C>& v) const;
00069
00071 void set_t(const algebra::vec<n,C>& t);
00072
00074 const algebra::vec<n,C>& t() const;
00075
00076 protected:
00077 void update();
00078
00079 algebra::vec<n,C> t_;
00080 };
00081
00082
00083 # ifndef MLN_INCLUDE_ONLY
00084
00085 template <unsigned n, typename C>
00086 inline
00087 translation<n,C>::translation()
00088 {
00089 }
00090
00091 template <unsigned n, typename C>
00092 inline
00093 translation<n,C>::translation(const algebra::vec<n,C>& t)
00094 :t_(t)
00095 {
00096 this->update();
00097 }
00098
00099 template <unsigned n, typename C>
00100 inline
00101 algebra::vec<n,C>
00102 translation<n,C>::operator()(const algebra::vec<n,C>& v) const
00103 {
00104 return v + t_;
00105 }
00106
00107 template <unsigned n, typename C>
00108 inline
00109 translation<n,C>
00110 translation<n,C>::inv() const
00111 {
00112 typename translation::invert res(-t_);
00113
00114 return res;
00115 }
00116
00117 template <unsigned n, typename C>
00118 inline
00119 void
00120 translation<n,C>::set_t(const algebra::vec<n,C>& t)
00121 {
00122 this->t_ = t;
00123 this->update();
00124 }
00125
00126 template <unsigned n, typename C>
00127 inline
00128 const algebra::vec<n,C>&
00129 translation<n,C>::t() const
00130 {
00131 return this->t_;
00132 }
00133
00134 template <unsigned n, typename C>
00135 inline
00136 void
00137 translation<n,C>::update()
00138 {
00139 this->m_ = algebra::h_mat<n,C>::Id;
00140 for (unsigned i = 0; i < n; ++i)
00141 this->m_(i,n) = this->t_[i];
00142 }
00143
00144 # endif // ! MLN_INCLUDE_ONLY
00145
00146
00147 }
00148
00149 }
00150
00151 }
00152
00153
00154 #endif // ! MLN_FUN_X2X_TRANSLATION_HH