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_TRANSFORM_DISTANCE_AND_CLOSEST_POINT_GEODESIC_HH
00027 # define MLN_TRANSFORM_DISTANCE_AND_CLOSEST_POINT_GEODESIC_HH
00028
00032
00033 # include <mln/canvas/distance_geodesic.hh>
00034 # include <mln/transform/internal/closest_point_functor.hh>
00035
00036 # include <mln/data/fill.hh>
00037 # include <mln/util/couple.hh>
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace transform
00044 {
00045
00057 template <typename I, typename N, typename D>
00058 util::couple<mln_ch_value(I,D), mln_ch_value(I,mln_psite(I))>
00059 distance_and_closest_point_geodesic(const Image<I>& input,
00060 const Neighborhood<N>& nbh,
00061 D max);
00062
00063
00076 template <typename P, typename N, typename D>
00077 util::couple<mln_image_from_grid(mln_grid(P),D),
00078 mln_image_from_grid(mln_grid(P),unsigned)>
00079 distance_and_closest_point_geodesic(const p_array<P>& pset,
00080 const box<P>& closest_point_domain,
00081 const Neighborhood<N>& nbh,
00082 D max);
00083
00084
00085 # ifndef MLN_INCLUDE_ONLY
00086
00087 template <typename I, typename N, typename D>
00088 inline
00089 util::couple<mln_ch_value(I,D), mln_ch_value(I, mln_psite(I))>
00090 distance_and_closest_point_geodesic(const Image<I>& input,
00091 const Neighborhood<N>& nbh,
00092 D max)
00093 {
00094 trace::entering("transform::distance_closest_point_geodesic");
00095
00096 mln_precondition(exact(input).is_valid());
00097 mln_precondition(exact(nbh).is_valid());
00098
00099 internal::closest_point_functor_with_sites<I> f;
00100 mln_ch_value(I,D) dmap = mln::canvas::distance_geodesic(input, nbh,
00101 max, f);
00102
00103 trace::exiting("transform::distance_and_closest_point_geodesic");
00104 return make::couple(dmap, f.cp_ima);
00105 }
00106
00107 template <typename P, typename N, typename D>
00108 inline
00109 util::couple<mln_image_from_grid(mln_grid(P),D), mln_image_from_grid(mln_grid(P),unsigned)>
00110 distance_and_closest_point_geodesic(const p_array<P>& pset,
00111 const box<P>& closest_point_domain,
00112 const Neighborhood<N>& nbh,
00113 D max)
00114 {
00115 trace::entering("transform::distance_and_closest_point_geodesic");
00116
00117 mln_precondition(closest_point_domain.is_valid());
00118 mln_precondition(exact(nbh).is_valid());
00119 mln_precondition(geom::bbox(pset) <= closest_point_domain);
00120
00121 typedef mln_image_from_grid(mln_grid(P), bool) I;
00122 internal::closest_point_functor_with_indexes<I> f(pset);
00123
00124 I ima(closest_point_domain);
00125 data::fill(ima, false);
00126 data::fill((ima | pset).rw(), true);
00127
00128 mln_ch_value(I,D) dmap = mln::canvas::distance_geodesic(ima, nbh, max, f);
00129
00130 trace::exiting("transform::distance_and_closest_point_geodesic");
00131 return make::couple(dmap, f.cp_ima);
00132 }
00133
00134 # endif // ! MLN_INCLUDE_ONLY
00135
00136 }
00137
00138 }
00139
00140
00141 #endif // ! MLN_TRANSFORM_DISTANCE_AND_CLOSEST_POINT_GEODESIC_HH