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_ACCU_CENTER_HH
00027 # define MLN_ACCU_CENTER_HH
00028
00034
00035 # include <mln/accu/internal/base.hh>
00036 # include <mln/accu/shape/bbox.hh>
00037
00038 namespace mln
00039 {
00040
00041 namespace accu
00042 {
00043
00044
00052
00053 template <typename P, typename V = typename P::vec>
00054 struct center
00055 : public mln::accu::internal::base<V, center<P,V> >
00056 {
00057 typedef P argument;
00058 typedef V result;
00059
00060 center();
00061
00064 void init();
00065 void take(const argument& t);
00066 void take(const center<P,V>& other);
00068
00070 V to_result() const;
00071 operator P() const;
00072
00074 bool is_valid() const;
00075
00076 protected:
00077 algebra::vec<P::dim, mln_sum(mln_coord(P))> center_;
00078 unsigned nsites_;
00079 };
00080
00081 namespace meta
00082 {
00083
00085 struct center : public Meta_Accumulator< center >
00086 {
00087
00088 template <typename P>
00089 struct with
00090 {
00091 typedef accu::center<P> ret;
00092 };
00093
00094 };
00095
00096 }
00097
00098
00099
00100 # ifndef MLN_INCLUDE_ONLY
00101
00102 template <typename P, typename V>
00103 inline
00104 center<P,V>::center()
00105 {
00106 init();
00107 }
00108
00109 template <typename P, typename V>
00110 inline
00111 void
00112 center<P,V>::init()
00113 {
00114 center_ = literal::zero;
00115 nsites_ = 0;
00116 }
00117
00118 template <typename P, typename V>
00119 inline
00120 void center<P,V>::take(const argument& t)
00121 {
00122 center_ += t.to_vec();
00123 ++nsites_;
00124 }
00125
00126 template <typename P, typename V>
00127 inline
00128 void
00129 center<P,V>::take(const center<P,V>& other)
00130 {
00131 center_ += other.center_;
00132 nsites_ += other.nsites_;
00133 }
00134
00135 template <typename P, typename V>
00136 inline
00137 V
00138 center<P,V>::to_result() const
00139 {
00140
00141 if (! is_valid())
00142 return V();
00143 return center_ / nsites_;
00144 }
00145
00146 template <typename P, typename V>
00147 inline
00148 center<P,V>::operator P() const
00149 {
00150 return P(to_result());
00151 }
00152
00153 template <typename P, typename V>
00154 inline
00155 bool
00156 center<P,V>::is_valid() const
00157 {
00158 return nsites_ > 0;
00159 }
00160
00161 # endif // ! MLN_INCLUDE_ONLY
00162
00163
00164 }
00165
00166 }
00167
00168
00169 #endif // ! MLN_ACCU_CENTER_HH