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, mln_domain(I), tr_image<S,I,T> >
00085 {
00086
00088 typedef
00089 mln::internal::image_identity< I, mln_domain(I), 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