2685: First attempt at generating a GraphViz' neato output.

* tests/morpho/complex_image_wst.cc: Generate a neato graph. --- milena/ChangeLog | 6 ++ milena/tests/morpho/complex_image_wst.cc | 111 +++++++++++++++++++++++++++++- 2 files changed, 116 insertions(+), 1 deletions(-) diff --git a/milena/ChangeLog b/milena/ChangeLog index 9994d8b..47a4f3a 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,3 +1,9 @@ +2008-10-24 Roland Levillain <roland@lrde.epita.fr> + + First attempt at generating a GraphViz' neato output. + + * tests/morpho/complex_image_wst.cc: Generate a neato graph. + 2008-10-24 Nicolas Ballas <ballas@lrde.epita.fr> Update transform routine interface. diff --git a/milena/tests/morpho/complex_image_wst.cc b/milena/tests/morpho/complex_image_wst.cc index 88e5bc9..8060cee 100644 --- a/milena/tests/morpho/complex_image_wst.cc +++ b/milena/tests/morpho/complex_image_wst.cc @@ -29,8 +29,15 @@ /// \brief Testing Meyer's Watershed Transform on mln::complex_image. #include <iostream> +#include <fstream> +#include <sstream> +#include <iomanip> #include <mln/value/int_u8.hh> +#include <mln/value/rgb8.hh> +#include <mln/literal/black.hh> +#include <mln/literal/white.hh> + #include <mln/core/alias/point2d.hh> #include <mln/core/site_set/p_faces.hh> @@ -47,6 +54,29 @@ #include <mln/morpho/closing_area.hh> #include <mln/morpho/meyer_wst.hh> +#include <mln/core/concept/function.hh> + +// FIXME: To be put elsewhere (from milena/sandbox/geraud/wst_edge.cc). +struct colorize : mln::Function_v2v< colorize > +{ + typedef mln::value::rgb8 result; + colorize(unsigned max) + : lut(max + 1) + { + lut[0] = mln::literal::black; + for (unsigned i = 1; i <= max; ++i) + lut[i] = result(100 + std::rand() % 150, + 100 + std::rand() % 150, + 100 + std::rand() % 150); + } + result operator()(unsigned i) const + { + return lut[i]; + } + std::vector<result> lut; +}; + + int main() { @@ -203,5 +233,84 @@ int main() We definitely need a complex_image that can accept a subset of a complex as domain (or at least a p_face<N, D, P>. */ - std::cout << "nbasins = " << nbasins << std::endl; + wst_val_t actual_nbasins = nbasins - c.nfaces<0>(); + std::cout << "nbasins = " << actual_nbasins << std::endl; + + + colorize color(nbasins); + + std::ofstream g("wst.neato"); + g << "graph wst" << std::endl + << "{" << std::endl + << " graph [bgcolor = \"#000000\"]" << std::endl + << " edge [color = \"#FFFFFF\"]" << std::endl + << " node [color = \"#FFFFFF\", fontcolor = \"#FFFFFF\" ]" << std::endl; + + // Vertices. + typedef complex_higher_neighborhood<D, G> e_nbh_t; + e_nbh_t e_nbh; + mln_niter_(e_nbh_t) v_e(e_nbh, v_); + for_all(v_) + { + // Find the adjacent basin (color). + value::rgb8 basin_color = literal::white; + for_all(v_e) + if (wshed(v_e) != 0) + { + basin_color = color(wshed(v_e)); + break; + } + std::ostringstream basin_color_str; + basin_color_str << '#' + << std::hex + << std::setfill('0') + << std::setw(2) << basin_color.red() + << std::setw(2) << basin_color.green() + << std::setw(2) << basin_color.blue() + << std::dec; + + g << " v" << v_.unproxy_().face_id() + << " [pos = \"" + << std::fixed << std::setprecision(1) + << (float)v_.to_site().front()[1] << ", " + << -(float)v_.to_site().front()[0] + << "\", color = \"" << basin_color_str.str() + << "\", fillcolor = \"" << basin_color_str.str() + << "\", pin = \"true\", style=\"filled,setlinewidth(3)\"];" + << std::endl; + } + + for_all(e) + { + value::rgb8 basin_color = color(wshed(e)); + std::ostringstream basin_color_str; + basin_color_str << '#' + << std::hex + << std::setfill('0') + << std::setw(2) << basin_color.red() + << std::setw(2) << basin_color.green() + << std::setw(2) << basin_color.blue() + << std::dec; + + // Adjacent vertices. + v.start(); + topo::face<1> v1 = v.unproxy_().face(); + point2d p1 = v.to_site().front(); + v.next(); + topo::face<1> v2 = v.unproxy_().face(); + point2d p2 = v.to_site().front(); + v.next(); + mln_invariant(!v.is_valid()); + + // Edges. + g << " v" << v1.face_id() << " -- v" << v2.face_id() << " "; + if (wshed(e) == 0) + g << "[color = \"#FFFFFF\"];" << std::endl; + else + g << "[color = \"" << basin_color_str.str() + << "\", style=\"setlinewidth(3)\"];" << std::endl; + } + + g << "}" << std::endl; + g.close(); } -- 1.5.6.5
participants (1)
-
Roland Levillain