https://svn.lrde.epita.fr/svn/oln/trunk
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)lrde.epita.fr>
Add milena neighborhood.
* milena/test/main.cc: Update.
* milena/core/neighb2d.hh: New.
* milena/core/neighb.hh: New.
* milena/core/concept/neighborhood.hh: New.
* milena/core/dpoints_qiter.hh: Rename as...
* milena/core/dpoints_piter.hh: ...this.
* milena/core/internal/set_of.hh (operator<<): New;
factor code.
* milena/core/rectangle2d.hh: Update.
* milena/core/window.hh: Update.
core/concept/neighborhood.hh | 39 +++++++++++++++++++++
core/dpoints_piter.hh | 28 +++++++--------
core/internal/set_of.hh | 15 ++++++++
core/neighb.hh | 56 ++++++++++++++++++++++++++++++
core/neighb2d.hh | 79 +++++++++++++++++++++++++++++++++++++++++++
core/rectangle2d.hh | 6 +--
core/window.hh | 25 ++-----------
test/main.cc | 5 ++
8 files changed, 216 insertions(+), 37 deletions(-)
Index: milena/test/main.cc
--- milena/test/main.cc (revision 985)
+++ milena/test/main.cc (working copy)
@@ -7,6 +7,8 @@
#include <core/window2d.hh>
#include <core/rectangle2d.hh>
+#include <core/neighb2d.hh>
+
#include <morpho/erosion.hh>
@@ -29,6 +31,8 @@
0, 1, 0,
1, 0, 0 };
window2d win = mk_window2d(w);
+ std::cout << win << std::endl;
+ std::cout << c8() << std::endl;
/*
{
@@ -56,4 +60,5 @@
image2d<int> ima2 = morpho::erosion(ima, win);
debug::println(ima2);
}
+
}
Index: milena/core/neighb2d.hh
--- milena/core/neighb2d.hh (revision 0)
+++ milena/core/neighb2d.hh (revision 0)
@@ -0,0 +1,79 @@
+#ifndef MLN_CORE_NEIGHB2D_HH
+# define MLN_CORE_NEIGHB2D_HH
+
+# include <cmath>
+# include <core/neighb.hh>
+# include <core/dpoint2d.hh>
+
+
+namespace mln
+{
+
+ typedef neighb_<dpoint2d> neighb2d;
+
+ const neighb2d& c4();
+ const neighb2d& c8();
+ const neighb2d& c2_row();
+ const neighb2d& c2_col();
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ const neighb2d& c4()
+ {
+ static bool flower = true;
+ static neighb2d it;
+ if (flower)
+ {
+ it.insert(mk_dpoint2d(0, 1));
+ it.insert(mk_dpoint2d(1, 0));
+ flower = false;
+ }
+ return it;
+ }
+
+ const neighb2d& c8()
+ {
+ static bool flower = true;
+ static neighb2d it;
+ if (flower)
+ {
+ it.insert(mk_dpoint2d(0, 1));
+ it.insert(mk_dpoint2d(1,-1));
+ it.insert(mk_dpoint2d(1, 0));
+ it.insert(mk_dpoint2d(1, 1));
+ flower = false;
+ }
+ return it;
+ }
+
+ const neighb2d& c2_row()
+ {
+ static bool flower = true;
+ static neighb2d it;
+ if (flower)
+ {
+ it.insert(mk_dpoint2d(0, 1));
+ flower = false;
+ }
+ return it;
+ }
+
+ const neighb2d& c2_col()
+ {
+ static bool flower = true;
+ static neighb2d it;
+ if (flower)
+ {
+ it.insert(mk_dpoint2d(1, 0));
+ flower = false;
+ }
+ return it;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+} // end of namespace mln
+
+
+#endif // ! MLN_CORE_NEIGHB2D_HH
Index: milena/core/dpoints_piter.hh
--- milena/core/dpoints_piter.hh (revision 985)
+++ milena/core/dpoints_piter.hh (working copy)
@@ -1,5 +1,5 @@
-#ifndef MLN_CORE_DPOINTS_QITER_HH
-# define MLN_CORE_DPOINTS_QITER_HH
+#ifndef MLN_CORE_DPOINTS_PITER_HH
+# define MLN_CORE_DPOINTS_PITER_HH
# include <core/concept/piter.hh>
# include <core/concept/genpoint.hh>
@@ -9,7 +9,7 @@
{
template <typename D>
- class dpoints_fwd_qiter : public Piter< dpoints_fwd_qiter<D> >
+ class dpoints_fwd_piter : public Piter< dpoints_fwd_piter<D> >
{
public:
@@ -21,7 +21,7 @@
typedef mln_coord(D) coord;
template <typename Dps, typename Pref>
- dpoints_fwd_qiter(const Dps& dps,
+ dpoints_fwd_piter(const Dps& dps,
const GenPoint<Pref>& p_ref);
operator point() const;
@@ -48,7 +48,7 @@
template <typename D>
template <typename Dps, typename Pref>
- dpoints_fwd_qiter<D>::dpoints_fwd_qiter(const Dps& dps,
+ dpoints_fwd_piter<D>::dpoints_fwd_piter(const Dps& dps,
const GenPoint<Pref>& p_ref)
: dps_(exact(dps).vec()),
p_ref_(* force_exact<Pref>(p_ref).pointer())
@@ -57,7 +57,7 @@
}
template <typename D>
- dpoints_fwd_qiter<D>::operator mln_point(D)() const
+ dpoints_fwd_piter<D>::operator mln_point(D)() const
{
assert(is_valid());
return p_;
@@ -65,28 +65,28 @@
template <typename D>
const mln_point(D)*
- dpoints_fwd_qiter<D>::pointer() const
+ dpoints_fwd_piter<D>::pointer() const
{
return & p_;
}
template <typename D>
bool
- dpoints_fwd_qiter<D>::is_valid() const
+ dpoints_fwd_piter<D>::is_valid() const
{
return i_ != dps_.size();
}
template <typename D>
void
- dpoints_fwd_qiter<D>::invalidate()
+ dpoints_fwd_piter<D>::invalidate()
{
i_ = dps_.size();
}
template <typename D>
void
- dpoints_fwd_qiter<D>::start()
+ dpoints_fwd_piter<D>::start()
{
i_ = 0;
update_p_();
@@ -94,7 +94,7 @@
template <typename D>
void
- dpoints_fwd_qiter<D>::next_()
+ dpoints_fwd_piter<D>::next_()
{
++i_;
update_p_();
@@ -102,7 +102,7 @@
template <typename D>
void
- dpoints_fwd_qiter<D>::update_p_()
+ dpoints_fwd_piter<D>::update_p_()
{
if (is_valid())
p_ = p_ref_ + dps_[i_];
@@ -110,7 +110,7 @@
template <typename D>
mln_coord(D)
- dpoints_fwd_qiter<D>::operator[](unsigned i) const
+ dpoints_fwd_piter<D>::operator[](unsigned i) const
{
return p_[i];
}
@@ -120,4 +120,4 @@
} // end of namespace mln
-#endif // ! MLN_CORE_DPOINTS_QITER_HH
+#endif // ! MLN_CORE_DPOINTS_PITER_HH
Index: milena/core/rectangle2d.hh
--- milena/core/rectangle2d.hh (revision 985)
+++ milena/core/rectangle2d.hh (working copy)
@@ -4,7 +4,7 @@
# include <core/concept/window.hh>
# include <core/internal/set_of.hh>
# include <core/dpoint2d.hh>
-# include <core/dpoints_qiter.hh>
+# include <core/dpoints_piter.hh>
namespace mln
@@ -13,8 +13,8 @@
struct rectangle2d : public Window< rectangle2d >,
public internal::set_of_<dpoint2d>
{
- typedef dpoints_fwd_qiter<dpoint2d> fwd_qiter;
- typedef dpoints_bkd_qiter<dpoint2d> bkd_qiter;
+ typedef dpoints_fwd_piter<dpoint2d> fwd_qiter;
+ typedef dpoints_bkd_piter<dpoint2d> bkd_qiter;
typedef fwd_qiter qiter;
rectangle2d(unsigned half_height, unsigned half_width);
Index: milena/core/neighb.hh
--- milena/core/neighb.hh (revision 0)
+++ milena/core/neighb.hh (revision 0)
@@ -0,0 +1,56 @@
+#ifndef MLN_CORE_NEIGHB_HH
+# define MLN_CORE_NEIGHB_HH
+
+# include <core/concept/neighborhood.hh>
+# include <core/internal/set_of.hh>
+# include <core/dpoint.hh>
+
+
+namespace mln
+{
+
+ // fwd decls
+ template <typename D> class dpoints_fwd_piter;
+ template <typename D> class dpoints_bkd_piter;
+
+
+ template <typename D>
+ struct neighb_ : public Neighborhood< neighb_<D> >,
+ public internal::set_of_<D>
+ {
+ typedef dpoints_fwd_piter<D> fwd_niter;
+ typedef dpoints_bkd_piter<D> bkd_niter;
+ typedef fwd_niter niter;
+
+ neighb_();
+
+ void insert(const D& dp);
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename D>
+ neighb_<D>::neighb_()
+ {
+ }
+
+ template <typename D>
+ void
+ neighb_<D>::insert(const D& dp)
+ {
+ typedef internal::set_of_<D> super;
+ this->super::insert( dp);
+ this->super::insert(-dp);
+ }
+
+
+# endif // ! MLN_INCLUDE_ONLY
+
+} // end of namespace mln
+
+
+# include <core/dpoints_piter.hh>
+
+
+#endif // ! MLN_CORE_NEIGHB_HH
Index: milena/core/concept/neighborhood.hh
--- milena/core/concept/neighborhood.hh (revision 0)
+++ milena/core/concept/neighborhood.hh (revision 0)
@@ -0,0 +1,39 @@
+#ifndef MLN_CORE_CONCEPT_NEIGHBORHOOD_HH
+# define MLN_CORE_CONCEPT_NEIGHBORHOOD_HH
+
+# include <core/concept/object.hh>
+
+
+namespace mln
+{
+
+ template <typename E>
+ struct Neighborhood : public Object<E>
+ {
+ /*
+ typedef niter;
+ typedef fwd_niter;
+ typedef bkd_niter;
+ */
+
+ protected:
+ Neighborhood();
+ };
+
+
+# ifndef MLN_INCLUDE_ONLY
+
+ template <typename E>
+ Neighborhood<E>::Neighborhood()
+ {
+ typedef mln_niter(E) niter;
+ typedef mln_fwd_niter(E) fwd_niter;
+ typedef mln_bkd_niter(E) bkd_niter;
+ }
+
+# endif // ! MLN_INCLUDE_ONLY
+
+} // end of namespace mln
+
+
+#endif // ! MLN_CORE_CONCEPT_NEIGHBORHOOD_HH
Index: milena/core/window.hh
--- milena/core/window.hh (revision 985)
+++ milena/core/window.hh (working copy)
@@ -10,16 +10,16 @@
{
// fwd decls
- template <typename D> class dpoints_fwd_qiter;
- template <typename D> class dpoints_bkd_qiter;
+ template <typename D> class dpoints_fwd_piter;
+ template <typename D> class dpoints_bkd_piter;
template <typename D>
struct window_ : public Window< window_<D> >,
public internal::set_of_<D>
{
- typedef dpoints_fwd_qiter<D> fwd_qiter;
- typedef dpoints_bkd_qiter<D> bkd_qiter;
+ typedef dpoints_fwd_piter<D> fwd_qiter;
+ typedef dpoints_bkd_piter<D> bkd_qiter;
typedef fwd_qiter qiter;
window_();
@@ -28,10 +28,6 @@
bool is_symmetric() const;
};
- template <typename D>
- std::ostream& operator<<(std::ostream& ostr,
- const window_<D>& win);
-
# ifndef MLN_INCLUDE_ONLY
@@ -54,23 +50,12 @@
return false;
}
- template <typename D>
- std::ostream& operator<<(std::ostream& ostr,
- const window_<D>& win)
- {
- ostr << '[';
- for (unsigned i = 0; i < win.nelements(); ++i)
- ostr << win.element(i)
- << (i = win.nelements() - 1 ? ']' : ',');
- return ostr;
- }
-
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln
-# include <core/dpoints_qiter.hh>
+# include <core/dpoints_piter.hh>
#endif // ! MLN_CORE_WINDOW_HH
Index: milena/core/internal/set_of.hh
--- milena/core/internal/set_of.hh (revision 985)
+++ milena/core/internal/set_of.hh (working copy)
@@ -36,6 +36,10 @@
};
+ template <typename E>
+ std::ostream& operator<<(std::ostream& ostr, const
set_of_<E>& s);
+
+
# ifndef MLN_INCLUDE_ONLY
template <typename E>
@@ -98,6 +102,17 @@
std::copy(s_.begin(), s_.end(), std::back_inserter(v_));
}
+ template <typename E>
+ std::ostream& operator<<(std::ostream& ostr,
+ const set_of_<E>& s)
+ {
+ ostr << '[';
+ for (unsigned i = 0; i < s.nelements(); ++i)
+ ostr << s.element(i)
+ << (i = s.nelements() - 1 ? ']' : ',');
+ return ostr;
+ }
+
# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::internal