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_CORE_IMAGE_IMORPH_TR_IMAGE_HH
00027 # define MLN_CORE_IMAGE_IMORPH_TR_IMAGE_HH
00028 
00033 
00034 # include <cmath>
00035 
00036 # include <mln/core/internal/image_identity.hh>
00037 # include <mln/algebra/vec.hh>
00038 # include <mln/value/set.hh>
00039 
00040 
00041 namespace mln
00042 {
00043 
00044   
00045   template <typename S, typename I, typename T> struct tr_image;
00046 
00047   namespace internal
00048   {
00049 
00051     template <typename S, typename I, typename T>
00052     struct data< tr_image<S,I,T> >
00053     {
00054       data(const S& s, const I& ima, const T& tr);
00055 
00056       I ima_;
00057       T tr_;
00058       S s_;
00059     };
00060 
00061   } 
00062 
00063   namespace trait
00064   {
00065 
00066     template <typename S, typename I, typename T>
00067     struct image_< tr_image<S,I,T> >
00068       : public image_<I> 
00069     {
00070       
00071       typedef trait::image::value_io::read_only value_io;
00072       typedef mln_internal_trait_image_speed_from(I) speed; 
00073     };
00074 
00075   } 
00076 
00077 
00081   
00082   template <typename S, typename I, typename T>
00083   struct tr_image :
00084     public mln::internal::image_identity< I, S, tr_image<S,I,T> >
00085   {
00086 
00088     typedef
00089     mln::internal::image_identity< I, S, tr_image<S,I,T> > super_;
00090 
00092     typedef mln_psite(I) psite;
00093 
00095     typedef mln_site(I) site;
00096 
00098     typedef mln_value(I) value;
00099 
00101     typedef mln_value(I) lvalue; 
00102 
00104     typedef mln_value(I) rvalue;
00105 
00107     typedef tr_image< S, tag::image_<I>, T> skeleton;
00108 
00109 
00111     tr_image(const S& s, const I& ima, const T& tr);
00112     
00113 
00114 
00115 
00116 
00117 
00118     tr_image();
00119 
00121     void init_(const S& s, const I& ima, const T& tr);
00122 
00124     bool is_valid() const;
00125 
00127     using super_::has;
00128 
00129     enum { dim_ = site::dim };
00130     typedef mln::algebra::vec<dim_, float> vec_t;
00131 
00133     bool has(const vec_t& v) const;
00134 
00137     
00138 
00139     mln_value(I) operator()(const psite& p) const;
00140     mln_value(I) operator()(const psite& p);
00141 
00143     void set_tr(T& tr);
00144 
00146     const T& tr() const;
00147 
00149     const S& domain() const;
00150   };
00151 
00152 
00153 
00154 # ifndef MLN_INCLUDE_ONLY
00155 
00156   namespace internal
00157   {
00158 
00159     
00160 
00161     template <typename S, typename I, typename T>
00162     inline
00163     data< tr_image<S,I,T> >::data(const S& s, const I& ima, const T& tr)
00164       : ima_(ima),
00165         tr_(tr),
00166         s_(s)
00167     {
00168     }
00169 
00170   } 
00171 
00172   template <typename S, typename I, typename T>
00173   inline
00174   tr_image<S,I,T>::tr_image(const S& s, const I& ima, const T& tr)
00175   {
00176     init_(s, ima, tr);
00177   }
00178 
00179   template <typename S, typename I, typename T>
00180   inline
00181   void
00182   tr_image<S,I,T>::init_(const S& s, const I& ima, const T& tr)
00183   {
00184     mln_precondition(ima.is_valid());
00185     this->data_ = new internal::data< tr_image<S,I,T> >(s, ima, tr);
00186   }
00187 
00188   template <typename S, typename I, typename T>
00189   inline
00190   bool
00191   tr_image<S,I,T>::is_valid() const
00192   {
00193     mln_invariant(this->delegatee_()->is_valid());
00194     return true;
00195   }
00196 
00197   template <typename S, typename I, typename T>
00198   inline
00199   bool
00200   tr_image<S,I,T>::has(const vec_t& v) const
00201   {
00202     mln_psite(I) p;
00203     algebra::vec<site::dim, float> v2 = this->data_->tr_.inv()(v);
00204     for (unsigned i = 0; i < site::dim; ++i)
00205       p[i] = static_cast<int>(v2[i]);
00206     return this->delegatee_().has(p);
00207   }
00208 
00209 
00210   template <typename S, typename I, typename T>
00211   inline
00212   mln_value(I)
00213   tr_image<S,I,T>::operator()(const psite& p) const
00214   {
00215     algebra::vec<site::dim, float> v = p.to_vec();
00216     return this->data_->ima_(this->data_->tr_.inv()(v));
00217   }
00218 
00219   template <typename S, typename I, typename T>
00220   inline
00221   mln_value(I)
00222   tr_image<S,I,T>::operator()(const psite& p)
00223   {
00224     algebra::vec<site::dim, float> v = p.to_vec();
00225     return this->data_->ima_(this->data_->tr_.inv()(v));
00226   }
00227 
00228   template <typename S, typename I, typename T>
00229   inline
00230   void
00231   tr_image<S,I,T>::set_tr(T& tr)
00232   {
00233     this->data_->tr_ = tr;
00234   }
00235 
00236   template <typename S, typename I, typename T>
00237   inline
00238   const T&
00239   tr_image<S,I,T>::tr() const
00240   {
00241     return this->data_->tr_;
00242   }
00243 
00244   template <typename S, typename I, typename T>
00245   inline
00246   const S&
00247   tr_image<S,I,T>::domain() const
00248   {
00249     return this->data_->s_;
00250   }
00251 
00252 
00253   template <typename S, typename I, typename T>
00254   inline
00255   tr_image<S,I,T>
00256   transposed_image(const Site_Set<S>& s, const Image<I>& ima,
00257                    const Function_v2v<T>& t)
00258   {
00259     tr_image<S,I,T> tmp(exact(s), exact(ima), exact(t));
00260     return tmp;
00261   }
00262 
00263 # endif // ! MLN_INCLUDE_ONLY
00264 
00265 } 
00266 
00267 
00268 #endif // ! MLN_CORE_IMAGE_IMORPH_TR_IMAGE_HH