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_EDGE_IMAGE_HH
00027 # define MLN_MAKE_EDGE_IMAGE_HH
00028
00032
00033 # include <mln/core/image/edge_image.hh>
00034 # include <mln/core/image/vertex_image.hh>
00035 # include <mln/core/concept/function.hh>
00036 # include <mln/util/internal/id2element.hh>
00037 # include <mln/data/fill.hh>
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace make
00044 {
00045
00046
00053
00054 template <typename V, typename G>
00055 mln::edge_image<void,V,G>
00056 edge_image(const Graph<G>& g, const fun::i2v::array<V>& fv);
00057
00064
00065 template <typename FV, typename G>
00066 mln::edge_image<void, mln_result(FV), G>
00067 edge_image(const Graph<G>& g, const Function_v2v<FV>& fv);
00068
00069
00077
00078 template <typename FP, typename FV, typename G>
00079 mln::edge_image<mln_result(FP),mln_result(FV),G>
00080 edge_image(const Graph<G>& g_,
00081 const Function_v2v<FP>& fp,
00082 const Function_v2v<FV>& fv);
00083
00084
00085
00094
00095 template <typename P, typename V, typename G, typename FP, typename FV>
00096 mln::edge_image<mln_result(FP),mln_result(FV),G>
00097 edge_image(const mln::vertex_image<P,V,G>& v_ima_,
00098 const p_edges<G,FP> pe,
00099 const Function_vv2v<FV>& fv_);
00100
00101
00102
00111
00112 template <typename P, typename V, typename G, typename FV>
00113 mln::edge_image<void,mln_result(FV),G>
00114 edge_image(const mln::vertex_image<P,V,G>& v_ima_,
00115 const Function_vv2v<FV>& fv_);
00116
00117
00127
00128 template <typename P, typename V, typename G, typename F>
00129 mln::edge_image<void,bool,G>
00130 edge_image(const mln::vertex_image<P,V,G>& v_ima_,
00131 const Function_v2b<F>& fv_);
00132
00133
00134 # ifndef MLN_INCLUDE_ONLY
00135
00136
00137
00138 template <typename V, typename G>
00139 inline
00140 mln::edge_image<void,V,G>
00141 edge_image(const Graph<G>& g, const fun::i2v::array<V>& fv)
00142 {
00143 trace::entering("make::edge_image");
00144 mln_precondition(exact(g).is_valid());
00145
00146 p_edges<G> pe(g);
00147 mln::edge_image<void,V,G> ima(pe, fv);
00148
00149 trace::exiting("make::edge_image");
00150 return ima;
00151 }
00152
00153 template <typename FV, typename G>
00154 mln::edge_image<void,mln_result(FV),G>
00155 edge_image(const Graph<G>& g_,
00156 const Function_v2v<FV>& fv)
00157 {
00158 trace::entering("make::edge_image");
00159 const G& g = exact(g_);
00160 const FV& f = exact(fv);
00161 mln_precondition(g.is_valid());
00162
00163 p_edges<G> pe(g);
00164 typedef mln::edge_image<void,mln_result(FV),G> ima_t;
00165 ima_t ima(pe);
00166
00167 mln_piter(ima_t) e(ima.domain());
00168 for_all(e)
00169 ima(e) = f(e.id());
00170
00171 trace::exiting("make::edge_image");
00172 return ima;
00173 }
00174
00175
00176 template <typename FP, typename FV, typename G>
00177 inline
00178 mln::edge_image<mln_result(FP),mln_result(FV),G>
00179 edge_image(const Graph<G>& g_,
00180 const Function_v2v<FP>& fp,
00181 const Function_v2v<FV>& fv)
00182 {
00183 trace::entering("make::edge_image");
00184 const G& g = exact(g_);
00185 mln_precondition(g.is_valid());
00186
00187 p_edges<G,FP> pe(g,fp);
00188 mln::edge_image<mln_result(FP),mln_result(FV),G> ima(pe, fv);
00189
00190 trace::exiting("make::edge_image");
00191 return ima;
00192 }
00193
00194
00195
00196 template <typename P, typename V, typename G, typename FP, typename FV>
00197 inline
00198 mln::edge_image<mln_result(FP),mln_result(FV),G>
00199 edge_image(const mln::vertex_image<P,V,G>& v_ima_,
00200 const p_edges<G,FP> pe,
00201 const Function_vv2v<FV>& fv_)
00202 {
00203 trace::entering("make::edge_image");
00204
00205 const FV& fv = exact(fv_);
00206 const mln::vertex_image<P,V,G>& v_ima = exact(v_ima_);
00207 mln_precondition(v_ima.is_valid());
00208
00209 typedef mln::edge_image<mln_result(FP),mln_result(FV),G> edge_ima_t;
00210 edge_ima_t ima_e(pe);
00211
00212 mln_piter(edge_ima_t) e(ima_e.domain());
00213 for_all(e)
00214 ima_e(e) = fv(e.element().v1(), e.element().v2());
00215
00216 trace::exiting("make::edge_image");
00217 return ima_e;
00218 }
00219
00220
00221
00222 template <typename P, typename V, typename G, typename FV>
00223 inline
00224 mln::edge_image<void,mln_result(FV),G>
00225 edge_image(const mln::vertex_image<P,V,G>& v_ima_,
00226 const Function_vv2v<FV>& fv_)
00227 {
00228 trace::entering("make::edge_image");
00229
00230 const FV& fv = exact(fv_);
00231 const mln::vertex_image<P,V,G>& v_ima = exact(v_ima_);
00232 mln_precondition(v_ima.is_valid());
00233
00234 p_edges<G> pe(v_ima.domain().graph());
00235 typedef mln::edge_image<void,mln_result(FV),G> edge_ima_t;
00236 edge_ima_t ima_e(pe);
00237
00238 mln_piter(edge_ima_t) e(ima_e.domain());
00239 for_all(e)
00240 ima_e(e) = fv(v_ima(e.element().v1()), v_ima(e.element().v2()));
00241
00242 trace::exiting("make::edge_image");
00243 return ima_e;
00244 }
00245
00246
00247 template <typename P, typename V, typename G, typename F>
00248 inline
00249 mln::edge_image<void,bool,G>
00250 edge_image(const mln::vertex_image<P,V,G>& v_ima_,
00251 const Function_v2b<F>& fv_)
00252 {
00253 trace::entering("make::edge_image");
00254
00255 const F& fv = exact(fv_);
00256 typedef mln::vertex_image<P,V,G> v_ima_t;
00257 const v_ima_t& v_ima = exact(v_ima_);
00258 mln_precondition(v_ima.is_valid());
00259
00260 p_edges<G> pe(v_ima.domain().graph());
00261 typedef mln::edge_image<void,bool,G> edge_ima_t;
00262 edge_ima_t ima_e(pe);
00263 data::fill(ima_e, true);
00264
00265 mln_piter(v_ima_t) p(v_ima.domain());
00266 for_all(p)
00267 if (!fv(v_ima(p)))
00268 {
00269 typename v_ima_t::edge_win_t win;
00270 mln_qiter(v_ima_t::edge_win_t) q(win, p);
00271 for_all(q)
00272 ima_e(q) = false;
00273 }
00274
00275 trace::exiting("make::edge_image");
00276 return ima_e;
00277 }
00278
00279
00280
00281 # endif // ! MLN_INCLUDE_ONLY
00282
00283
00284 }
00285
00286 }
00287
00288 #endif // ! MLN_MAKE_EDGE_IMAGE_HH