Main Page   Class Overview   Pixels   Images   Geometry   Quick Index  

HxNgbIsMaxGradDir2d.h

00001 /*
00002  *  Copyright (c) 1999, University of Amsterdam, The Netherlands.
00003  *  All rights reserved.
00004  *
00005  *  Author(s):
00006  *  Edo Poll                (poll@wins.uva.nl)
00007  */
00008 
00009 #ifndef HxNgbIsMaxGradDir2d_h
00010 #define HxNgbIsMaxGradDir2d_h
00011 
00012 #include "HxClassName.h"
00013 #include "HxSizes.h"
00014 #include "HxNgbOpCategory.h"
00015 #include "HxCnum.h"
00016 #include "HxTagList.h"
00017 
00023 template<class ResultT, class ArithT>
00024 class HxNgbIsMaxGradDir2d
00025 {
00026 public:
00027 
00028     typedef HxNgbCnumTag        IteratorCategory;
00029     typedef HxNgb1PhaseTag      PhaseCategory;
00030     typedef HxNgbTransInVarTag  TransVarianceCategory;
00031 
00032     typedef HxCnum          CnumType;
00033 
00034                             HxNgbIsMaxGradDir2d(HxTagList& tags);
00035                             ~HxNgbIsMaxGradDir2d();
00036 
00037     HxSizes                 size();
00038 
00039     CnumType                begin();
00040     CnumType                end();
00041 
00042     void                    init(const ArithT& value);
00043     void                    next(int x, int y, const ArithT& value);
00044     ResultT                 result() const;
00045 
00046     static HxString         className();
00047 
00048 private:
00049     HxCoord*                _coords;
00050     double                  _resultMag, _level;
00051     static HxCoord          _coordPairs[12];
00052     int                     _endIdx;
00053 };
00054 
00055 template<class ResultT, class ArithT>
00056 inline HxNgbIsMaxGradDir2d<ResultT, ArithT>::CnumType
00057 HxNgbIsMaxGradDir2d<ResultT, ArithT>::begin()
00058 {
00059     return CnumType(&_coords[0]);
00060 }
00061 
00062 template<class ResultT, class ArithT>
00063 inline HxNgbIsMaxGradDir2d<ResultT, ArithT>::CnumType
00064 HxNgbIsMaxGradDir2d<ResultT, ArithT>::end()
00065 {
00066     return CnumType(&_coords[_endIdx]);
00067 }
00068 
00069 template<class ResultT, class ArithT>
00070 inline void
00071 HxNgbIsMaxGradDir2d<ResultT, ArithT>::init(const ArithT& v)
00072 {
00073     static const double tan22_5 = 0.41421356;
00074     static const double tan67_5 = 2.41421356;
00075 
00076     double x(v.x()), y(v.y());
00077     _resultMag = x*x+y*y;
00078 
00079     if (_resultMag < _level)
00080     {
00081         _endIdx = 0;
00082         return;
00083     }
00084 
00085     if (x == 0)
00086     {
00087         _endIdx = 2;
00088         _coords = &_coordPairs[4];
00089         return;
00090     }
00091 
00092     double rc = y/x;
00093     double frc = fabs(rc);
00094     int i = (frc < tan22_5) ? 0 : ( (frc < tan67_5) ? 1 : 2 );
00095     if (rc < 0)
00096         i += 3;
00097     _endIdx = 2;
00098     _coords = &_coordPairs[i<<1];
00099 }
00100 
00101 template<class ResultT, class ArithT>
00102 inline HxString
00103 HxNgbIsMaxGradDir2d<ResultT, ArithT>::className()
00104 {
00105     static HxString s("isMaxGradDir");
00106     return s;
00107 }
00108 
00109 template<class ResultT, class ArithT>
00110 inline void
00111 HxNgbIsMaxGradDir2d<ResultT, ArithT>::next(int, int, const ArithT& v)
00112 {
00113     if ((v.x()*v.x() + v.y()*v.y()) > _resultMag)
00114         _resultMag = 0;
00115 }
00116 
00117 template<class ResultT, class ArithT>
00118 inline HxSizes  
00119 HxNgbIsMaxGradDir2d<ResultT, ArithT>::size()
00120 {
00121     return HxSizes(3, 3, 1);
00122 }
00123 
00124 template<class ResultT, class ArithT>
00125 inline ResultT
00126 HxNgbIsMaxGradDir2d<ResultT, ArithT>::result() const
00127 {
00128     return _resultMag >= _level ? 1 : 0;
00129 }
00130 
00131 #ifdef INC_TEMPLATE_SRC
00132 #include "HxNgbIsMaxGradDir2d.c"
00133 #endif
00134 
00135 #endif

Generated on Tue Jan 8 13:59:15 2002 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001