Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's 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 "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

Generated on Tue Feb 3 14:18:40 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001