• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List

edge_image.cc

00001 // Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
00002 //
00003 // This file is part of Olena.
00004 //
00005 // Olena is free software: you can redistribute it and/or modify it under
00006 // the terms of the GNU General Public License as published by the Free
00007 // Software Foundation, version 2 of the License.
00008 //
00009 // Olena is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with Olena.  If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 // As a special exception, you may use this file as part of a free
00018 // software project without restriction.  Specifically, if other files
00019 // instantiate templates or use macros or inline functions from this
00020 // file, or you compile this file and link it with other files to produce
00021 // an executable, this file does not by itself cause the resulting
00022 // executable to be covered by the GNU General Public License.  This
00023 // exception does not however invalidate any other reasons why the
00024 // executable file might be covered by the GNU General Public License.
00025 
00026 #include <vector>
00027 
00028 #include <mln/core/image/edge_image.hh>
00029 #include <mln/core/image/image2d.hh>
00030 #include <mln/accu/shape/bbox.hh>
00031 #include <mln/fun/i2v/array.hh>
00032 #include <mln/util/graph.hh>
00033 #include <mln/util/site_pair.hh>
00034 #include <mln/debug/draw_graph.hh>
00035 
00036 
00037 /* The graph is as follows:
00038 
00039             0 1 2 3 4
00040          .-----------
00041          |
00042        0 |  0       2
00043        1 |    \   / |
00044        2 |      1   |
00045        3 |       \  |
00046        4 |        3-4
00047 
00048 */
00049 
00050 
00051 static const unsigned X = mln_max(unsigned); // Invalid id.
00052 
00053 
00054 // Expected neighbors for forward and backward iteration.
00055 // X is an invalid id.
00056 static unsigned expected_fwd_nb[5][3] = { { 1, 2, X },
00057                                           { 0, 2, 4 },
00058                                           { 0, 1, 3 },
00059                                           { 2, 4, X },
00060                                           { 1, 3, X } };
00061 
00062 static unsigned expected_bkd_nb[5][3] = { { 2, 1, X },
00063                                           { 4, 2, 0 },
00064                                           { 3, 1, 0 },
00065                                           { 4, 2, X },
00066                                           { 3, 1, X } };
00067 
00068 
00069 int main()
00070 {
00071   using namespace mln;
00072 
00073   /*--------.
00074   | Graph.  |
00075   `--------*/
00076 
00077   // Points associated to vertices.
00078   typedef util::site_pair<point2d> site_t;
00079   typedef fun::i2v::array<site_t> fsite_t;
00080   fsite_t sites(5);
00081   sites(0) = site_t(point2d(0,0),point2d(2,2)); // Site associated to edge 0.
00082   sites(1) = site_t(point2d(2,2),point2d(0,4)); // Site associated to edge 1.
00083   sites(2) = site_t(point2d(2,2),point2d(4,3)); // Site associated to edge 2.
00084   sites(3) = site_t(point2d(4,3),point2d(4,4)); // Site associated to edge 3.
00085   sites(4) = site_t(point2d(4,4),point2d(0,4)); // Site associated to edge 4.
00086 
00087   util::graph g;
00088 
00089   // Populate the graph with vertices.
00090   g.add_vertices(sites.size());
00091 
00092   // Populate the graph with edges.
00093   g.add_edge(0, 1);
00094   g.add_edge(1, 2);
00095   g.add_edge(1, 3);
00096   g.add_edge(3, 4);
00097   g.add_edge(4, 2);
00098 
00099   //g.print_debug(std::cout);
00100 
00101   /*-------------.
00102   | Graph image.  |
00103   `-------------*/
00104 
00105   // Graph values.
00106   typedef fun::i2v::array<unsigned> viota_t;
00107   viota_t iota(g.v_nmax());
00108   for (unsigned i = 0; i < iota.size(); ++i)
00109     iota(i) = 10 + i;
00110 
00111   typedef edge_image<site_t,unsigned> ima_t;
00112   ima_t ima(g, sites, iota);
00113 
00114   {
00115     // FIXME: Move this part to a special test case.
00116 
00117     // Compute the bounding box of 'ima'.
00118     accu::shape::bbox<point2d> a;
00119     mln_piter_(ima_t) p(ima.domain());
00120     for_all(p)
00121     {
00122       a.take(p.first());
00123       a.take(p.second());
00124     }
00125     box2d bbox = a.to_result();
00126     mln_assertion(bbox == make::box2d(5, 5));
00127 
00128   // Print the image.
00129   /* FIXME: Unfortunately, displaying graph images is not easy right
00130      now(2008-02-05).  We could use
00131 
00132        debug::println(ima);
00133 
00134      but there's not specialization working for graph_image; the one
00135      selected by the compiler is based on a 2-D bbox, and expects the
00136      interface of graph_image to work with points(not psites).
00137      Moreover, this implementation only shows *values*, not the graph
00138      itslef.
00139 
00140      An alternative is to use debug::graph,
00141      but it doesn't show the values, only the vertices and edges of the
00142      graph.
00143 
00144      The current solution is a mix between debug::graph and hand-made
00145      iterations.  */
00146     image2d<int> ima_rep(bbox);
00147 
00148   // We use the value 9 in debug::graph to represent edges to distinguish it
00149   // from vertices holding a value of 1.
00150     debug::draw_graph(ima_rep, ima.domain(), 1, 9);
00151   }
00152 
00153   /*------------.
00154   | Iterators.  |
00155   `------------*/
00156 
00157   // iteration over the domain of IMA.
00158   mln_piter_(ima_t) p(ima.domain());
00159   unsigned i = 10;
00160   for_all(p)
00161     mln_assertion(ima(p) == i++);
00162 
00163   typedef ima_t::win_t win_t;
00164   win_t win;
00165 
00166   {
00167     // Window - Forward iteration
00168     mln_qiter_(win_t) q(win, p);
00169     for_all(p)
00170     {
00171       i = 0;
00172       for_all(q)
00173       {
00174         mln_assertion(expected_fwd_nb[p.id()][i] == q.id());
00175         ++i;
00176       }
00177     }
00178   }
00179 
00180   {
00181     // Window - Backward iteration
00182     mln_bkd_qiter_(win_t) q(win, p);
00183     for_all(p)
00184     {
00185       i = 0;
00186       for_all(q)
00187       {
00188         mln_assertion(expected_bkd_nb[p.id()][i] == q.id());
00189         ++i;
00190       }
00191     }
00192   }
00193 
00194   typedef ima_t::nbh_t nbh_t;
00195   nbh_t neigh;
00196   {
00197     // Neighborhood - Forward iteration
00198     mln_niter_(nbh_t) n(neigh, p);
00199 
00200     for_all(p)
00201     {
00202       i = 0;
00203       for_all(n)
00204       {
00205         mln_assertion(expected_fwd_nb[p.id()][i] == n.id());
00206         ++i;
00207       }
00208     }
00209   }
00210 
00211   {
00212     // Neighborhood - Backward iteration
00213     mln_bkd_niter_(nbh_t) n(neigh, p);
00214     for_all(p)
00215     {
00216       i = 0;
00217       for_all(n)
00218       {
00219         mln_assertion(expected_bkd_nb[p.id()][i] == n.id());
00220         ++i;
00221       }
00222     }
00223   }
00224 }

Generated on Tue Oct 4 2011 15:23:42 for Milena (Olena) by  doxygen 1.7.1