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_MAKE_ATTACHMENT_HH
00027 # define MLN_MAKE_ATTACHMENT_HH
00028
00032
00033 # include <mln/core/image/complex_image.hh>
00034 # include <mln/make/cell.hh>
00035 # include <mln/topo/is_facet.hh>
00036
00037 namespace mln
00038 {
00039
00040 namespace make
00041 {
00042
00057 template <unsigned D, typename G, typename V>
00058 p_set< complex_psite<D, G> >
00059 attachment(const complex_psite<D, G>& f,
00060 const complex_image<D, G, V>& ima);
00061
00062
00063 # ifndef MLN_INCLUDE_ONLY
00064
00065 template <unsigned D, typename G, typename V>
00066 inline
00067 p_set< complex_psite<D, G> >
00068 attachment(const complex_psite<D, G>& f,
00069 const complex_image<D, G, V>& ima)
00070 {
00071 mln_precondition(topo::is_facet(f));
00072 mlc_equal(V, bool)::check();
00073
00074 typedef complex_psite<D, G> psite;
00075 typedef p_set<psite> faces_t;
00076
00077 faces_t f_hat = make::cell(f);
00078 faces_t att_f;
00079
00080 typedef complex_lower_higher_neighborhood<D, G> adj_nbh_t;
00081 adj_nbh_t adj_nbh;
00082 mln_piter(faces_t) g(f_hat);
00083 mln_niter(adj_nbh_t) n(adj_nbh, g);
00084 for_all(g)
00085 for_all(n)
00086 if (ima(n) && !f_hat.has(n))
00087 {
00088 att_f.insert(g);
00089 break;
00090 }
00091 return att_f;
00092 }
00093
00094 # endif // MLN_INCLUDE_ONLY
00095
00096 }
00097
00098 }
00099
00100 #endif // ! MLN_MAKE_ATTACHMENT_HH