00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef HxNgbBernsen_h
00010 #define HxNgbBernsen_h
00011
00012 #include "HxClassName.h"
00013 #include "HxSizes.h"
00014 #include "HxCategories.h"
00015 #include "HxTagList.h"
00016
00017 #include <algorithm>
00018
00021 template <class ArgType, class ResType>
00022 class HxNgbBernsen
00023 {
00024 public:
00025
00027 typedef HxTagLoop IteratorCategory;
00028
00030 typedef HxTag1Phase PhaseCategory;
00031
00032
00038
00039 HxNgbBernsen(HxTagList& tags);
00040 ~HxNgbBernsen();
00041
00042 HxSizes size();
00043 void init(int, int, ArgType);
00044
00045 void next(int x, int y, ArgType value);
00046 ResType result() const;
00047
00049 static HxString className();
00050
00051 private:
00052 int _pctIdx;
00053 int _size;
00054 int _conn;
00055 int _windowSz;
00056 int _uniformTh;
00057 bool _uniformLow;
00058
00059 ArgType* _values;
00060 int _i;
00061 };
00062
00063 template <class ArgType, class ResType>
00064 ostream&
00065 operator<<(ostream& os, const HxNgbBernsen<ArgType, ResType>& pct)
00066 {
00067 return pct.put(os);
00068 }
00069
00070 template <class ArgType, class ResType>
00071 inline HxString
00072 HxNgbBernsen<ArgType, ResType>::className()
00073 {
00074 static HxString s("bernsen");
00075 return s;
00076 }
00077
00078 template <class ArgType, class ResType>
00079 inline void
00080 HxNgbBernsen<ArgType, ResType>::init(int, int, ArgType)
00081 {
00082 _i = 0;
00083 }
00084
00085 template <class ArgType, class ResType>
00086 inline void
00087 HxNgbBernsen<ArgType, ResType>::next(int, int, ArgType value)
00088 {
00089 _values[_i++] = value;
00090 }
00091
00092 template <class ArgType, class ResType>
00093 inline HxSizes
00094 HxNgbBernsen<ArgType, ResType>::size()
00095 {
00096 return HxSizes(_size, _size, 1);
00097 }
00098
00099 template <class ArgType, class ResType>
00100 inline ResType
00101 HxNgbBernsen<ArgType, ResType>::result() const
00102 {
00103 std::sort(&_values[0], &_values[_size*_size]);
00104 ArgType minval=_values[0];
00105 ArgType maxval=_values[_size*_size-1];
00106 ArgType t = 0.5*(minval*maxval);
00107 ArgType d = maxval-minval;
00108 if(d>_uniformTh)
00109 {
00110 return _values[_pctIdx]<t?0:1;
00111 }
00112 else
00113 {
00114 return _uniformLow?0:1;
00115 }
00116
00117 return _values[_pctIdx];
00118 }
00119
00120 #ifdef INC_TEMPLATE_SRC
00121 #include "HxNgbBernsen.c"
00122 #endif
00123
00124
00125 #endif