26 #ifndef MLN_CORE_IMAGE_IMORPH_TR_IMAGE_HH
27 # define MLN_CORE_IMAGE_IMORPH_TR_IMAGE_HH
36 # include <mln/core/internal/image_identity.hh>
37 # include <mln/algebra/vec.hh>
38 # include <mln/value/set.hh>
45 template <
typename S,
typename I,
typename T>
struct tr_image;
51 template <
typename S,
typename I,
typename T>
52 struct data< tr_image<S,I,T> >
54 data(
const S& s,
const I& ima,
const T& tr);
66 template <
typename S,
typename I,
typename T>
67 struct image_< tr_image<S,I,T> >
71 typedef trait::image::value_io::read_only value_io;
72 typedef mln_internal_trait_image_speed_from(I) speed;
82 template <typename S, typename I, typename T>
84 public mln::internal::image_identity< I, S,
tr_image<S,I,T> >
89 mln::internal::image_identity< I, S, tr_image<S,I,T> > super_;
111 tr_image(const S& s, const I& ima, const T& tr);
121 void init_(const S& s, const I& ima, const T& tr);
124 bool is_valid() const;
129 enum { dim_ = site::dim };
130 typedef mln::algebra::vec<dim_, float> vec_t;
133 bool has(
const vec_t& v)
const;
139 mln_value(I) operator()(const psite& p) const;
140 mln_value(I) operator()(const psite& p);
149 const S& domain() const;
154 # ifndef MLN_INCLUDE_ONLY
161 template <
typename S,
typename I,
typename T>
172 template <
typename S,
typename I,
typename T>
179 template <
typename S,
typename I,
typename T>
184 mln_precondition(ima.is_valid());
185 this->data_ =
new internal::data< tr_image<S,I,T> >(s, ima, tr);
188 template <
typename S,
typename I,
typename T>
193 mln_invariant(this->delegatee_()->is_valid());
197 template <
typename S,
typename I,
typename T>
203 algebra::vec<site::dim, float> v2 = this->data_->tr_.inv()(v);
204 for (
unsigned i = 0; i < site::dim; ++i)
205 p[i] = static_cast<int>(v2[i]);
206 return this->delegatee_().has(p);
210 template <
typename S,
typename I,
typename T>
215 algebra::vec<site::dim, float> v = p.to_vec();
216 return this->data_->ima_(this->data_->tr_.inv()(v));
219 template <
typename S,
typename I,
typename T>
222 tr_image<S,I,T>::operator()(const psite& p)
224 algebra::vec<site::dim, float> v = p.to_vec();
225 return this->data_->ima_(this->data_->tr_.inv()(v));
228 template <
typename S,
typename I,
typename T>
233 this->data_->tr_ = tr;
236 template <
typename S,
typename I,
typename T>
241 return this->data_->tr_;
244 template <
typename S,
typename I,
typename T>
249 return this->data_->s_;
253 template <
typename S,
typename I,
typename T>
263 # endif // ! MLN_INCLUDE_ONLY
268 #endif // ! MLN_CORE_IMAGE_IMORPH_TR_IMAGE_HH