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_GEOM_BBOX_HH
00027 # define MLN_GEOM_BBOX_HH
00028
00042 # include <mln/core/site_set/box.hh>
00043 # include <mln/core/concept/image.hh>
00044 # include <mln/core/concept/window.hh>
00045 # include <mln/core/concept/weighted_window.hh>
00046 # include <mln/literal/zero.hh>
00047 # include <mln/accu/shape/bbox.hh>
00048
00049
00050 namespace mln
00051 {
00052
00053 namespace geom
00054 {
00055
00057 template <typename S>
00058 box<mln_site(S)> bbox(const Site_Set<S>& pset);
00059
00060
00062 template <typename I>
00063 box<mln_site(I)> bbox(const Image<I>& ima);
00064
00065
00067 template <typename W>
00068 box<mln_psite(W)> bbox(const Window<W>& win);
00069
00071 template <typename W>
00072 box<mln_psite(W)> bbox(const Weighted_Window<W>& win);
00073
00074
00075
00076 # ifndef MLN_INCLUDE_ONLY
00077
00078 namespace impl
00079 {
00080
00081 template <typename S>
00082 box<mln_site(S)> bbox_(const trait::site_set::bbox::known&,
00083 const S& pset)
00084 {
00085 return pset.bbox();
00086 }
00087
00088 template <typename S>
00089 box<mln_site(S)> bbox_(trait::site_set::bbox::unknown,
00090 const S& pset)
00091 {
00092 typedef mln_site(S) P;
00093 P pmin, pmax;
00094
00095
00096 mln_piter(S) p(pset);
00097 p.start();
00098 mln_precondition(p.is_valid());
00099 pmin = pmax = p;
00100
00101
00102 for_all_remaining(p)
00103 for (unsigned i = 0; i < P::dim; ++i)
00104 if (p[i] < pmin[i])
00105 pmin[i] = p[i];
00106 else
00107 if (p[i] > pmax[i])
00108 pmax[i] = p[i];
00109
00110 box<P> bb(pmin, pmax);
00111 return bb;
00112 }
00113
00114 }
00115
00116
00117
00118
00119 template <typename S>
00120 inline
00121 box<mln_site(S)> bbox(const Site_Set<S>& pset)
00122 {
00123 trace::entering("geom::bbox");
00124
00125
00126 box<mln_site(S)> b = impl::bbox_(mln_trait_site_set_bbox(S)(),
00127 exact(pset));
00128
00129 trace::exiting("geom::bbox");
00130 return b;
00131 }
00132
00133 template <typename I>
00134 box<mln_site(I)> bbox(const Image<I>& ima_)
00135 {
00136 trace::entering("geom::bbox");
00137
00138 const I& ima = exact(ima_);
00139 mln_precondition(ima.is_valid());
00140 box<mln_site(I)> b = geom::bbox(ima.domain());
00141
00142 trace::exiting("geom::bbox");
00143 return b;
00144 }
00145
00146 template <typename W>
00147 box<mln_psite(W)> bbox(const Window<W>& win)
00148 {
00149 trace::entering("geom::bbox");
00150
00151 typedef mln_psite(W) P;
00152 accu::shape::bbox<P> b;
00153 P O = literal::origin;
00154 mln_qiter(W) q(exact(win), O);
00155 for_all(q)
00156 b.take(q);
00157
00158 trace::exiting("geom::bbox");
00159 return b;
00160 }
00161
00162 template <typename W>
00163 box<mln_psite(W)> bbox(const Weighted_Window<W>& win)
00164 {
00165 trace::entering("geom::bbox");
00166
00167 box<mln_psite(W)> b = bbox(exact(win).win());
00168
00169 trace::exiting("geom::bbox");
00170 return b;
00171 }
00172
00173
00174 # endif // ! MLN_INCLUDE_ONLY
00175
00176 }
00177
00178 }
00179
00180
00181 #endif // ! MLN_GEOM_BBOX_HH