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_DEBUG_DRAW_GRAPH_HH
00027 # define MLN_DEBUG_DRAW_GRAPH_HH
00028
00034
00035 # include <mln/core/site_set/p_vertices.hh>
00036 # include <mln/core/site_set/p_edges.hh>
00037 # include <mln/util/line_graph.hh>
00038 # include <mln/util/site_pair.hh>
00039 # include <mln/draw/line.hh>
00040 # include <mln/data/fill.hh>
00041 # include <mln/metal/equal.hh>
00042
00043 namespace mln
00044 {
00045
00046 namespace debug
00047 {
00048
00052
00053
00054
00055
00056
00057
00058
00059
00060 template <typename I, typename G, typename F>
00061 void
00062 draw_graph(Image<I>& ima, const p_vertices<G, F>& pv,
00063 mln_value(I) vcolor, mln_value(I) ecolor);
00064
00065
00069
00070
00071
00072
00073
00074
00075
00076 template <typename I, typename G, typename F, typename V, typename E>
00077 void
00078 draw_graph(Image<I>& ima,
00079 const p_vertices<G, F>& pv,
00080 const Function<V>& vcolor_f_, const Function<E>& ecolor_f_);
00081
00085
00086
00087
00088
00089
00090
00091
00092 template <typename I, typename G, typename F, typename V, typename E>
00093 inline
00094 void
00095 draw_graph(Image<I>& ima,
00096 const p_vertices<util::line_graph<G>, F>& pv,
00097 const Function<V>& vcolor_f_, const Function<E>& ecolor_f_);
00098
00099
00100 # ifndef MLN_INCLUDE_ONLY
00101
00102
00103
00104
00105
00106
00107 template <typename I, typename G, typename F>
00108 inline
00109 void
00110 draw_graph(Image<I>& ima,
00111 const p_edges<G, F>& pe,
00112 mln_value(I) vcolor,
00113 mln_value(I) ecolor)
00114 {
00115 trace::entering("debug::draw_graph");
00116
00117
00118 typedef p_edges<G, F> pe_t;
00119 mln_piter(pe_t) p(pe);
00120 for_all(p)
00121 {
00122 if (exact(ima).has(p.first()) && exact(ima).has(p.second()))
00123 draw::line(exact(ima), p.first(), p.second(), ecolor);
00124 if (exact(ima).has(p.first()))
00125 exact(ima)(p.first()) = vcolor;
00126 if (exact(ima).has(p.second()))
00127 exact(ima)(p.second()) = vcolor;
00128 }
00129
00130 trace::exiting("debug::draw_graph");
00131 }
00132
00133
00134 template <typename I, typename G, typename F>
00135 inline
00136 void
00137 draw_graph(Image<I>& ima,
00138 const p_vertices<G, F>& pv,
00139 mln_value(I) vcolor,
00140 mln_value(I) ecolor)
00141 {
00142 trace::entering("debug::draw_graph");
00143
00144
00145 const G& g = pv.graph();
00146 typedef p_vertices<G, F> pv_t;
00147 mln_edge_iter(G) ei(g);
00148 for_all(ei)
00149 draw::line(exact(ima), pv(ei.v1()), pv(ei.v2()), ecolor);
00150
00151
00152 mln_piter(pv_t) p(pv);
00153 for_all(p)
00154 if (exact(ima).has(p))
00155 exact(ima)(p) = vcolor;
00156
00157 trace::exiting("debug::draw_graph");
00158 }
00159
00160
00161
00162 template <typename I, typename G, typename F, typename V, typename E>
00163 inline
00164 void
00165 draw_graph(Image<I>& ima,
00166 const p_vertices<G, F>& pv,
00167 const Function<V>& vcolor_f_, const Function<E>& ecolor_f_)
00168 {
00169 trace::entering("debug::draw_graph");
00170
00171 const V& vcolor_f = exact(vcolor_f_);
00172 const E& ecolor_f = exact(ecolor_f_);
00173
00174
00175 const G& g = pv.graph();
00176 typedef p_vertices<G, F> pv_t;
00177 mln_edge_iter(G) ei(g);
00178 for_all(ei)
00179 draw::line(exact(ima), pv(ei.v1()), pv(ei.v2()), ecolor_f(ei.id()));
00180
00181
00182 mln_piter(pv_t) p(pv);
00183 for_all(p)
00184 if (exact(ima).has(p))
00185 exact(ima)(p) = vcolor_f(p);
00186
00187 trace::exiting("debug::draw_graph");
00188 }
00189
00190
00191
00192 template <typename I, typename G, typename F, typename V, typename E>
00193 inline
00194 void
00195 draw_graph(Image<I>& ima,
00196 const p_vertices<util::line_graph<G>, F>& pv,
00197 const Function<V>& vcolor_f_, const Function<E>& ecolor_f_)
00198 {
00199 trace::entering("debug::draw_graph");
00200
00201 const V& vcolor_f = exact(vcolor_f_);
00202 const E& ecolor_f = exact(ecolor_f_);
00203
00204 typedef util::line_graph<G> LG;
00205
00206 const LG& lg = pv.graph();
00207 const G& g = lg.graph();
00208 typedef p_vertices<LG, F> pv_t;
00209 mln_vertex_iter(LG) vi(lg);
00210 for_all(vi)
00211 {
00212 p_line2d l = pv(vi.id());
00213
00214 draw::line(exact(ima), l.begin(), l.end(), ecolor_f(vi.id()));
00215
00216
00217 if (exact(ima).has(l.begin()))
00218 exact(ima)(l.begin()) = vcolor_f(g.edge(vi).v1());
00219 if (exact(ima).has(l.end()))
00220 exact(ima)(l.end()) = vcolor_f(g.edge(vi).v2());
00221 }
00222
00223 trace::exiting("debug::draw_graph");
00224 }
00225
00226 # endif // ! MLN_INCLUDE_ONLY
00227
00228 }
00229
00230 }
00231
00232 #endif // ! MLN_DEBUG_DRAW_GRAPH_HH