27 #ifndef MLN_CORE_IMAGE_IMORPH_TR_IMAGE_HH
28 # define MLN_CORE_IMAGE_IMORPH_TR_IMAGE_HH
37 # include <mln/core/internal/image_identity.hh>
38 # include <mln/algebra/vec.hh>
39 # include <mln/value/set.hh>
46 template <
typename S,
typename I,
typename T>
struct tr_image;
54 template <
typename S,
typename I,
typename T>
55 struct data< tr_image<S,I,
T> >
57 data(
const S& s,
const I& ima,
const T& tr);
69 template <
typename S,
typename I,
typename T>
70 struct image_< tr_image<S,I,
T> >
74 typedef trait::image::value_io::read_only
value_io;
75 typedef mln_internal_trait_image_speed_from(I)
speed;
85 template <typename S, typename I, typename
T>
87 public mln::internal::image_identity< I, S,
tr_image<S,I,
T> >
114 tr_image(const S& s, const I& ima, const T& tr);
125 void init_(const S& s, const I& ima, const T& tr);
129 bool is_valid() const;
134 enum { dim_ = site::dim };
138 bool has(
const vec_t& v)
const;
144 mln_value(I) operator()(const
psite&
p) const;
145 mln_value(I) operator()(const
psite&
p);
154 const S& domain() const;
159 template <typename S, typename I, typename T>
166 template <typename I, typename T>
172 # ifndef MLN_INCLUDE_ONLY
179 template <
typename S,
typename I,
typename T>
190 template <
typename S,
typename I,
typename T>
192 tr_image<S,I,T>::tr_image(
const S& s,
const I& ima,
const T& tr)
197 template <
typename S,
typename I,
typename T>
200 tr_image<S,I,T>::init_(
const S& s,
const I& ima,
const T& tr)
202 mln_precondition(ima.is_valid());
203 this->data_ =
new internal::data< tr_image<S,I,T> >(s, ima, tr);
206 template <
typename S,
typename I,
typename T>
209 tr_image<S,I,T>::is_valid()
const
211 mln_invariant(this->delegatee_()->is_valid());
215 template <
typename S,
typename I,
typename T>
218 tr_image<S,I,T>::has(
const vec_t& v)
const
221 algebra::vec<
site::dim,
float> v2 = this->data_->tr_.inv()(v);
222 for (
unsigned i = 0; i <
site::dim; ++i)
223 p[i] = static_cast<
int>(v2[i]);
224 return this->delegatee_().has(p);
228 template <typename S, typename I, typename T>
231 tr_image<S,I,T>::operator()(const
psite& p)
const
233 algebra::vec<site::dim, float> v = p.to_vec();
234 return this->data_->ima_(this->data_->tr_.inv()(v));
237 template <
typename S,
typename I,
typename T>
240 tr_image<S,I,T>::operator()(const
psite& p)
242 algebra::vec<site::dim, float> v = p.to_vec();
243 return this->data_->ima_(this->data_->tr_.inv()(v));
246 template <
typename S,
typename I,
typename T>
249 tr_image<S,I,T>::set_tr(T& tr)
251 this->data_->tr_ = tr;
254 template <
typename S,
typename I,
typename T>
257 tr_image<S,I,T>::tr()
const
259 return this->data_->tr_;
262 template <
typename S,
typename I,
typename T>
265 tr_image<S,I,T>::domain()
const
267 return this->data_->s_;
271 template <
typename S,
typename I,
typename T>
274 transposed_image(
const Site_Set<S>& s,
const Image<I>& ima,
275 const Function_v2v<T>& t)
284 template <
typename S,
typename I,
typename T>
286 apply_tr(
const Site_Set<S>& s,
const Image<I>& ima,
287 const Function_v2v<T>& tr)
293 template <
typename I,
typename T>
294 tr_image<mln_domain(I), I, T>
295 apply_tr(
const Image<I>& ima,
const Function_v2v<T>& tr)
302 # endif // ! MLN_INCLUDE_ONLY
307 #endif // ! MLN_CORE_IMAGE_IMORPH_TR_IMAGE_HH