37 #include <mln/core/image/complex_image.hh>
38 #include <mln/core/image/complex_neighborhoods.hh>
40 #include <mln/data/fill.hh>
41 #include <mln/literal/zero.hh>
43 #include <mln/math/max.hh>
44 #include <mln/math/sqr.hh>
45 #include <mln/accu/stat/min_max.hh>
46 #include <mln/fun/v2v/linear.hh>
47 #include <mln/data/transform.hh>
49 #include <mln/literal/white.hh>
51 #include <mln/io/off/load.hh>
52 #include <mln/io/off/save.hh>
54 #include "trimesh/misc.hh"
58 static const float pi = 4 * atanf(1);
61 int main(
int argc,
char* argv[])
65 std::cerr <<
"usage: " << argv[0] <<
" input.off output.off"
70 std::string input_filename = argv[1];
71 std::string output_filename = argv[2];
80 static const unsigned D = ima_t::dim;
82 typedef mln_geom_(ima_t) G;
84 mln::bin_2complex_image3df input;
85 mln::io::off::load(input, input_filename);
97 std::pair<ima_t, ima_t> curv = mln::geom::mesh_curvature(input.domain());
100 ima_t max_curv(input.domain());
101 mln::
data::fill(max_curv, mln::literal::zero);
102 mln::p_n_faces_fwd_piter<D, G> v(max_curv.domain(), 0);
104 max_curv(v) = mln::math::max(mln::math::sqr(curv.first(v)),
105 mln::math::sqr(curv.second(v)));
108 mln::p_n_faces_fwd_piter<D, G> t(max_curv.domain(), 2);
109 typedef mln::complex_m_face_neighborhood<D, G> adj_vertices_nbh_t;
110 adj_vertices_nbh_t adj_vertices_nbh;
111 mln_niter_(adj_vertices_nbh_t) adj_v(adj_vertices_nbh, t);
114 adj_v.iter().set_m(0);
115 mln::accu::stat::min_max<
float> acc;
124 s += max_curv(adj_v);
131 mln_invariant(n <= 3);
138 ima_t output(max_curv.domain());
140 std::pair<float, float> min_max(acc);
142 float min = min_max.first;
143 float max = min_max.second;
144 std::cout << min << std::endl;
145 std::cout << max << std::endl;
152 float a = (M - m) / (max - min);
153 float b = (m * max - M * min) / (max - min);