27 #ifndef MLN_CORE_POINT_HH
28 # define MLN_CORE_POINT_HH
40 # include <mln/core/def/coord.hh>
41 # include <mln/core/concept/proxy.hh>
42 # include <mln/core/concept/gpoint.hh>
43 # include <mln/core/internal/coord_impl.hh>
45 # include <mln/metal/bool.hh>
46 # include <mln/metal/is_not.hh>
47 # include <mln/algebra/vec.hh>
48 # include <mln/metal/converts_to.hh>
49 # include <mln/algebra/h_vec.hh>
50 # include <mln/util/yes.hh>
57 template <
typename G,
typename C>
struct point;
58 template <
typename G,
typename C>
struct dpoint;
71 template <
typename G,
typename C>
83 template <
typename G,
typename C>
85 public internal::mutable_coord_impl_< G::dim, C, point<G,C> >
95 enum {
dim = G::dim };
137 template <
typename C2>
145 explicit point(C ind);
147 point(C sli, C row, C col);
161 template <
typename F>
208 template <
typename G,
typename C1,
typename C2>
218 template <
typename P,
typename E>
221 template <
typename G,
typename C,
typename E>
228 const E& exact_()
const;
238 template <
typename G,
typename C>
241 template <
typename C>
242 const util::yes&
cut_(
const point<grid::tick,C>&
p);
246 # ifndef MLN_INCLUDE_ONLY
249 template <
typename G,
typename C>
254 return this->coord_[i];
257 template <
typename G,
typename C>
262 return this->coord_[i];
265 template <
typename G,
typename C>
270 return this->coord_[dim - 1];
273 template <
typename G,
typename C>
278 return this->coord_[dim - 1];
284 template <
typename G,
typename C>
290 template <
typename G,
typename C>
291 template <
typename C2>
299 template <
typename G,
typename C>
307 template <
typename G,
typename C>
311 metal::bool_<(dim == 1)>::check();
315 template <
typename G,
typename C>
319 metal::bool_<(dim == 2)>::check();
324 template <
typename G,
typename C>
328 metal::bool_<(dim == 3)>::check();
334 template <
typename G,
typename C>
335 template <
typename F>
339 mlc_converts_to(mln_result(F), C)::check();
340 const F& f =
exact(f_);
341 for (
unsigned i = 0; i < dim; ++i)
342 coord_[i] = static_cast<C>( f(i) );
345 template <
typename G,
typename C>
352 template <
typename G,
typename C>
361 template <
typename G,
typename C>
365 metal::bool_<(dim == 1)>::check();
369 template <
typename G,
typename C>
374 metal::bool_<(dim == 1)>::check();
379 template <
typename G,
typename C>
383 metal::bool_<(dim == 1)>::check();
387 template <
typename G,
typename C>
392 metal::bool_<(dim == 1)>::check();
397 template <
typename G,
typename C>
404 template <
typename G,
typename C>
405 const point<G,C> point<G,C>::origin =
all_to(0);
407 template <
typename G,
typename C>
412 for (
unsigned i = 0; i < dim; ++i)
413 coord_[i] = static_cast<C>(coord_[i] + dp[i]);
417 template <
typename G,
typename C>
422 for (
unsigned i = 0; i < dim; ++i)
427 template <
typename G,
typename C>
434 template <
typename G,
typename C>
436 typename point<G,C>::vec
444 for (
unsigned i = dim - 2; i < dim; ++i)
445 tmp[j++] = mln::internal::convert_data<float>(coord_[i]);
446 for (
unsigned i = 2; i < dim; ++i, ++j)
447 tmp[j] = mln::internal::convert_data<float>(coord_[i-j]);
455 template <
typename G,
typename C>
457 typename point<G,C>::h_vec
468 for (
unsigned i = dim - 2; i < dim; ++i)
469 tmp[j++] = coord_[i];
471 for (
unsigned i = 2; i < dim; ++i, ++j)
472 tmp[j] = coord_[i-j];
481 template <
typename G,
typename C>
486 static const point<G,C> the_(
all_to(mln_max(C)));
490 template <
typename G,
typename C>
495 static const point<G,C> the_(
all_to(mln_min(C)));
499 template <
typename G,
typename C>
510 template <
typename G,
typename C1,
typename C2>
513 from_to_(
const point<G,C1>& from, point<G,C2>& to)
515 mlc_converts_to(C1,C2)::check();
516 enum { dim = G::dim };
518 for (
unsigned i = 0; i < dim; ++i)
519 to[i] = mln::internal::convert_data<C2>(from[i]);
526 template <
typename G,
typename C,
typename E>
531 return internal::force_exact<const E>(*this);
534 template <
typename G,
typename C,
typename E>
536 typename point<G,C>::vec
539 return exact_().get_subject().to_vec();
542 template <
typename G,
typename C,
typename E>
546 return exact_().get_subject();
551 template <
typename G,
typename C>
554 cut_(
const point<G,C>&
p)
559 template <
typename C>
562 cut_(
const point<grid::tick,C>& p)
569 # endif // ! MLN_INCLUDE_ONLY
575 #endif // ! MLN_CORE_POINT_HH