00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef HxNgbDefuz_h
00010 #define HxNgbDefuz_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 HxNgbDefuz
00023 {
00024 public:
00025
00027 typedef HxTagLoop IteratorCategory;
00028
00030 typedef HxTag1Phase PhaseCategory;
00031
00032
00039
00040 HxNgbDefuz(HxTagList& tags);
00041 ~HxNgbDefuz();
00042
00043 HxSizes size();
00044 void init(int, int, ArgType);
00045
00046 void next(int x, int y, ArgType value);
00047 ResType result() const;
00048
00050 static HxString className();
00051
00052 private:
00053 int _pctIdx;
00054 int _sizeX;
00055 int _sizeY;
00056 int _uniformTh;
00057
00058 ArgType* _values;
00059 int _i;
00060 };
00061
00062 template <class ArgType, class ResType>
00063 ostream&
00064 operator<<(ostream& os, const HxNgbDefuz<ArgType, ResType>& pct)
00065 {
00066 return pct.put(os);
00067 }
00068
00069 template <class ArgType, class ResType>
00070 inline HxString
00071 HxNgbDefuz<ArgType, ResType>::className()
00072 {
00073 static HxString s("defuz");
00074 return s;
00075 }
00076
00077 template <class ArgType, class ResType>
00078 inline void
00079 HxNgbDefuz<ArgType, ResType>::init(int, int, ArgType)
00080 {
00081 _i = 0;
00082 }
00083
00084 template <class ArgType, class ResType>
00085 inline void
00086 HxNgbDefuz<ArgType, ResType>::next(int, int, ArgType value)
00087 {
00088 _values[_i++] = value;
00089 }
00090
00091 template <class ArgType, class ResType>
00092 inline HxSizes
00093 HxNgbDefuz<ArgType, ResType>::size()
00094 {
00095 return HxSizes(_sizeX, _sizeY, 1);
00096 }
00097
00098 template <class ArgType, class ResType>
00099 inline ResType
00100 HxNgbDefuz<ArgType, ResType>::result() const
00101 {
00102 std::sort(&_values[0], &_values[_sizeX*_sizeY]);
00103 ArgType minval=_values[0];
00104 ArgType maxval=_values[_sizeX*_sizeY-1];
00105 if(_values[_pctIdx] < minval + _uniformTh * (maxval - minval))
00106 return minval;
00107 else
00108 return maxval;
00109 }
00110
00111 template <class ArgType, class ResType>
00112 HxNgbDefuz<ArgType, ResType>::HxNgbDefuz(HxTagList& tags)
00113 : _values(0)
00114 {
00115
00116 _sizeX = HxGetTag(tags, "windowSzX", 5);
00117 _sizeY = HxGetTag(tags, "windowSzY", 5);
00118 _uniformTh = HxGetTag(tags, "thr", 0.5);
00119 _pctIdx = 0.5 * (_sizeX * _sizeY);
00120
00121 _values = new ArgType[_sizeX * _sizeY];
00122
00123 }
00124
00125 template <class ArgType, class ResType>
00126 HxNgbDefuz<ArgType, ResType>::~HxNgbDefuz()
00127 {
00128 if (_values)
00129 delete [] _values;
00130 }
00131
00132
00133 #endif
00134