00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef HxExportExtraIdentMaskMoments_h
00011 #define HxExportExtraIdentMaskMoments_h
00012
00013 #include "HxClassName.h"
00014 #include "HxSizes.h"
00015 #include "HxCategories.h"
00016 #include "HxTagList.h"
00017
00018
00037 template<class ResultT, class ImValT, class ExtraValT>
00038 class HxExportExtraIdentMaskMoments
00039 {
00040 public:
00042 typedef HxTagTransVar TransVarianceCategory;
00043
00045 typedef HxTag1Phase PhaseCategory;
00046
00047
00049 HxExportExtraIdentMaskMoments(HxTagList& tags);
00050
00052 ~HxExportExtraIdentMaskMoments();
00053
00055 void doIt(const ImValT& imV, const ExtraValT& extraV,
00056 int x, int y, int z);
00057
00059 static HxString className();
00060
00061 private:
00062 HxTagList& _tags;
00063 HxValueList* _valList;
00064 ExtraValT _maskVal;
00065 int _order;
00066 int _number;
00067 ResultT* _sums;
00068 };
00069
00070 template<class ResultT, class ImValT, class ExtraValT>
00071
00072 HxExportExtraIdentMaskMoments<ResultT,ImValT,ExtraValT>::HxExportExtraIdentMaskMoments(HxTagList& tags) : _tags(tags)
00073 {
00074 _maskVal = HxGetTag<int>(tags, "maskVal");
00075 _order = HxGetTag<int>(tags, "order");
00076 _valList = HxGetTag<HxValueList*>(tags, "valList");
00077 _number = ((_order+1)*(_order+2))/2;
00078 _sums = new ResultT[_number];
00079 ResultT *ptr = _sums;
00080 for (int i=0 ; i<_number; i++)
00081 *ptr++ = HxScalarInt(0);
00082 }
00083
00084 template<class ResultT, class ImValT, class ExtraValT>
00085
00086 HxExportExtraIdentMaskMoments<ResultT,ImValT,ExtraValT> ::~HxExportExtraIdentMaskMoments()
00087 {
00088 HxValueListBackInserter res = std::back_inserter(*_valList);
00089 for (int i=0 ; i<_number ; i++)
00090 *res++ = HxValue(_sums[i]);
00091 delete _sums;
00092 }
00093
00094 template<class ResultT, class ImValT, class ExtraValT>
00095 inline void
00096
00097 HxExportExtraIdentMaskMoments<ResultT,ImValT,ExtraValT> ::doIt(const ImValT& imV, const ExtraValT& extraV, int x, int y, int)
00098 {
00099 if (extraV == _maskVal) {
00100 int i=0;
00101 for (int q=0 ; q<=_order ; q++) {
00102 for (int p=0 ; p<=_order ; p++) {
00103 if (p+q <= _order) {
00104 HxScalarDouble f = ::pow(x, p) * ::pow(y, q);
00105 _sums[i] += ResultT(f) * ResultT(imV);
00106 i++;
00107 }
00108 }
00109 }
00110 }
00111 }
00112
00113 template<class ResultT, class ImValT, class ExtraValT>
00114 inline HxString
00115 HxExportExtraIdentMaskMoments<ResultT,ImValT,ExtraValT>::className()
00116 {
00117 return HxString("identMaskMoments");
00118 }
00119
00120
00121 #endif