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 APPS_GRAPH_MORPHO_CONVERT_HH
00027 # define APPS_GRAPH_MORPHO_CONVERT_HH
00028
00031
00032 # include <mln/core/alias/complex_image.hh>
00033 # include <mln/core/image/image2d.hh>
00034
00035 # include <mln/math/abs.hh>
00036
00037 # include "apps/graph-morpho/make.hh"
00038
00039
00040 namespace convert
00041 {
00042
00044 inline
00045 mln::image2d<bool>
00046 to_image2d(const mln::bin_1complex_image2d& input)
00047 {
00048 using namespace mln;
00049
00050 const unsigned dim = 1;
00051 typedef geom::complex_geometry<dim, point2d> geom_t;
00052
00053
00054 accu::shape::bbox<point2d> bbox;
00055 p_n_faces_fwd_piter<dim, geom_t> v(input.domain(), 0);
00056 for_all(v)
00057 {
00058 mln_site_(geom_t) s(v);
00059
00060
00061 mln_invariant(s.size() == 1);
00062 point2d p = s.front();
00063 bbox.take(p);
00064 }
00065 mln::box2d support = bbox;
00066
00067 point2d box_p_min(support.pmin().row() * 2, support.pmin().col() * 2);
00068 point2d box_p_max(support.pmax().row() * 2, support.pmax().col() * 2);
00069 image2d<bool> output(box2d(box_p_min, box_p_max));
00070 data::fill(output, false);
00071
00072
00073 for_all(v)
00074 {
00075 mln_site_(geom_t) s(v);
00076
00077
00078 mln_invariant(s.size() == 1);
00079 point2d p_in = s.front();
00080 point2d p_out(p_in.row() * 2, p_in.col() * 2);
00081 output(p_out) = input(v);
00082 }
00083
00084
00085 p_n_faces_fwd_piter<dim, geom_t> e(input.domain(), 1);
00086 for_all(e)
00087 {
00088 mln_site_(geom_t) s(e);
00089
00090
00091 mln_invariant(s.size() == 2);
00092 point2d p1 = s[0];
00093 point2d p2 = s[1];
00094 if (p1.row() == p2.row())
00095 {
00096
00097 point2d p_out(p1.row() * 2,
00098 p1.col() + p2.col());
00099 output(p_out) = input(e);
00100 }
00101 else if (p1.col() == p2.col())
00102 {
00103
00104 point2d p_out(p1.row() + p2.row(),
00105 p1.col() * 2);
00106 output(p_out) = input(e);
00107 }
00108 else
00109 {
00110
00111 abort();
00112 }
00113 }
00114 return output;
00115 }
00116
00117
00119 inline
00120 mln::bin_1complex_image2d
00121 to_complex_image(const mln::image2d<bool>& input)
00122 {
00123 using namespace mln;
00124
00125 const box2d& input_box = input.domain();
00126
00127 mln_precondition(input_box.nrows() % 2 == 1);
00128 mln_precondition(input_box.ncols() % 2 == 1);
00129
00130
00131
00132 box2d output_box(input_box.nrows() / 2 + 1,
00133 input_box.ncols() / 2 + 1);
00134 bin_1complex_image2d output = ::make::complex1d_image<bool>(output_box);
00135
00136 const unsigned dim = 1;
00137 typedef geom::complex_geometry<dim, point2d> geom_t;
00138
00139
00140 p_n_faces_fwd_piter<dim, geom_t> v(output.domain(), 0);
00141 for_all(v)
00142 {
00143 mln_site_(geom_t) s(v);
00144
00145
00146 mln_invariant(s.size() == 1);
00147 point2d p = s.front();
00148 point2d q(p.row() * 2, p.col() * 2);
00149 output(v) = input(q);
00150 }
00151
00152
00153 p_n_faces_fwd_piter<dim, geom_t> e(output.domain(), 1);
00154 for_all(e)
00155 {
00156 mln_site_(geom_t) s(e);
00157
00158
00159 mln_invariant(s.size() == 2);
00160 point2d p1 = s[0];
00161 point2d p2 = s[1];
00162 mln_invariant(math::abs(p1.row() - p2.row()) == 1
00163 || math::abs(p1.col() - p2.col()) == 1);
00164 point2d q (p1.row() + p2.row(), p1.col() + p2.col());
00165 output(e) = input(q);
00166 }
00167
00168 return output;
00169 }
00170
00171 }
00172
00173
00174 #endif // ! APPS_GRAPH_MORPHO_CONVERT_HH