00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef HxNgbIsMaxGradDir2d_h
00010 #define HxNgbIsMaxGradDir2d_h
00011
00012 #include "HxClassName.h"
00013 #include "HxSizes.h"
00014 #include "HxCategories.h"
00015 #include "HxCnum.h"
00016 #include "HxTagList.h"
00017
00018
00023 template<class ResultT, class ArithT>
00024 class HxNgbIsMaxGradDir2d
00025 {
00026 public:
00027
00029 typedef HxTagCnum IteratorCategory;
00030
00032 typedef HxTag1Phase PhaseCategory;
00033
00035 typedef HxCnum CnumType;
00036
00037
00039 HxNgbIsMaxGradDir2d(HxTagList& tags);
00040
00042 ~HxNgbIsMaxGradDir2d();
00043
00045 HxSizes size();
00046
00048 CnumType begin();
00049
00051 CnumType end();
00052
00054 void init(int x, int y, const ArithT& value);
00055
00057 void next(int x, int y, const ArithT& value);
00058
00060 ResultT result() const;
00061
00063 static HxString className();
00064
00065 private:
00066 HxCoord* _coords;
00067 double _resultMag, _level;
00068 static HxCoord _coordPairs[12];
00069 int _endIdx;
00070 };
00071
00072 template<class ResultT, class ArithT>
00073 inline HxNgbIsMaxGradDir2d<ResultT, ArithT>::CnumType
00074 HxNgbIsMaxGradDir2d<ResultT, ArithT>::begin()
00075 {
00076 return CnumType(&_coords[0]);
00077 }
00078
00079 template<class ResultT, class ArithT>
00080 inline HxNgbIsMaxGradDir2d<ResultT, ArithT>::CnumType
00081 HxNgbIsMaxGradDir2d<ResultT, ArithT>::end()
00082 {
00083 return CnumType(&_coords[_endIdx]);
00084 }
00085
00086 template<class ResultT, class ArithT>
00087 inline void
00088 HxNgbIsMaxGradDir2d<ResultT, ArithT>::init(int, int, const ArithT& v)
00089 {
00090 static const double tan22_5 = 0.41421356;
00091 static const double tan67_5 = 2.41421356;
00092
00093 double x(v.x()), y(v.y());
00094 _resultMag = x*x+y*y;
00095
00096 if (_resultMag < _level)
00097 {
00098 _endIdx = 0;
00099 return;
00100 }
00101
00102 if (x == 0)
00103 {
00104 _endIdx = 2;
00105 _coords = &_coordPairs[4];
00106 return;
00107 }
00108
00109 double rc = y/x;
00110 double frc = fabs(rc);
00111 int i = (frc < tan22_5) ? 0 : ( (frc < tan67_5) ? 1 : 2 );
00112 if (rc < 0)
00113 i += 3;
00114 _endIdx = 2;
00115 _coords = &_coordPairs[i<<1];
00116 }
00117
00118 template<class ResultT, class ArithT>
00119 inline HxString
00120 HxNgbIsMaxGradDir2d<ResultT, ArithT>::className()
00121 {
00122 static HxString s("isMaxGradDir");
00123 return s;
00124 }
00125
00126 template<class ResultT, class ArithT>
00127 inline void
00128 HxNgbIsMaxGradDir2d<ResultT, ArithT>::next(int, int, const ArithT& v)
00129 {
00130 if ((v.x()*v.x() + v.y()*v.y()) > _resultMag)
00131 _resultMag = 0;
00132 }
00133
00134 template<class ResultT, class ArithT>
00135 inline HxSizes
00136 HxNgbIsMaxGradDir2d<ResultT, ArithT>::size()
00137 {
00138 return HxSizes(3, 3, 1);
00139 }
00140
00141 template<class ResultT, class ArithT>
00142 inline ResultT
00143 HxNgbIsMaxGradDir2d<ResultT, ArithT>::result() const
00144 {
00145 return _resultMag >= _level ? 1 : 0;
00146 }
00147
00148 #ifdef INC_TEMPLATE_SRC
00149 #include "HxNgbIsMaxGradDir2d.c"
00150 #endif
00151
00152 #endif