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_DETACHMENT_HH
00027 # define MLN_MAKE_DETACHMENT_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
00063 template <unsigned D, typename G, typename V>
00064 p_set< complex_psite<D, G> >
00065 detachment(const complex_psite<D, G>& f,
00066 const complex_image<D, G, V>& ima);
00067
00068
00069 # ifndef MLN_INCLUDE_ONLY
00070
00071 template <unsigned D, typename G, typename V>
00072 inline
00073 p_set< complex_psite<D, G> >
00074 detachment(const complex_psite<D, G>& f,
00075 const complex_image<D, G, V>& ima)
00076 {
00077 mln_precondition(topo::is_facet(f));
00078 mlc_equal(V, bool)::check();
00079
00080 typedef complex_psite<D, G> psite;
00081 typedef p_set<psite> faces_t;
00082
00083 faces_t f_hat = make::cell(f);
00084
00085 faces_t detach_f = f_hat;
00086
00087 typedef complex_lower_higher_neighborhood<D, G> adj_nbh_t;
00088 adj_nbh_t adj_nbh;
00089 mln_piter(faces_t) g(f_hat);
00090 mln_niter(adj_nbh_t) n(adj_nbh, g);
00091 for_all(g)
00092 for_all(n)
00093 if (ima(n) && !f_hat.has(n))
00094 {
00095 detach_f.remove(g);
00096 break;
00097 }
00098 return detach_f;
00099 }
00100
00101 # endif // MLN_INCLUDE_ONLY
00102
00103 }
00104
00105 }
00106
00107 #endif // ! MLN_MAKE_DETACHMENT_HH