00001 #ifndef Impala_Core_Array_Trait_NgbLWshed_h 00002 #define Impala_Core_Array_Trait_NgbLWshed_h 00003 00004 #include "Core/Array/Pattern/Categories.h" 00005 #include "Core/Array/Pattern/Cnum.h" 00006 00007 namespace Impala 00008 { 00009 namespace Core 00010 { 00011 namespace Array 00012 { 00013 namespace Trait 00014 { 00015 00016 00021 template<class DstArrayT, class SrcArrayT> 00022 class NgbLWshed 00023 { 00024 public: 00025 00027 typedef Pattern::TagLoop IteratorCategory; 00028 00030 typedef Pattern::Tag1Phase PhaseCategory; 00031 00032 typedef typename DstArrayT::StorType DstStorType; 00033 typedef typename DstArrayT::ArithType DstArithType; 00034 typedef typename SrcArrayT::StorType SrcStorType; 00035 typedef typename SrcArrayT::ArithType SrcArithType; 00036 00038 NgbLWshed(int conn, int wshedval) 00039 { 00040 mConn = conn; 00041 mWshedval = wshedval; 00042 mValues = new SrcArithType[9]; 00043 mPctIdx = 4; 00044 } 00045 00047 ~NgbLWshed() 00048 { 00049 if (mValues) 00050 delete [] mValues; 00051 } 00052 00054 int 00055 Width() 00056 { 00057 return 3; 00058 } 00059 00061 int 00062 Height() 00063 { 00064 return 3; 00065 } 00066 00068 void 00069 Init(int x, int y, const SrcArithType& value) 00070 { 00071 mI = 0; 00072 } 00073 00075 void 00076 NextEl(int x, int y, const SrcArithType& value) 00077 { 00078 mValues[mI++] = value; 00079 } 00080 00082 DstArithType 00083 Result() const 00084 { 00085 SrcArithType minval=mValues[mPctIdx]; 00086 if (mConn==4) 00087 { 00088 if (mValues[1] < minval && mValues[1]>mWshedval) 00089 minval = mValues[1]; 00090 if (mValues[3] < minval && mValues[3]>mWshedval) 00091 minval = mValues[3]; 00092 if (mValues[5] < minval && mValues[5]>mWshedval) 00093 minval = mValues[5]; 00094 if (mValues[7] < minval && mValues[7]>mWshedval) 00095 minval = mValues[7]; 00096 00097 if (minval<mValues[mPctIdx]) 00098 return mWshedval; 00099 else 00100 return mValues[mPctIdx]; 00101 } 00102 if (mConn==8) 00103 { 00104 if (mValues[0] < minval && mValues[0]>mWshedval) 00105 minval = mValues[0]; 00106 if (mValues[1] < minval && mValues[1]>mWshedval) 00107 minval = mValues[1]; 00108 if (mValues[2] < minval && mValues[2]>mWshedval) 00109 minval = mValues[2]; 00110 if (mValues[3] < minval && mValues[3]>mWshedval) 00111 minval = mValues[3]; 00112 if (mValues[5] < minval && mValues[5]>mWshedval) 00113 minval = mValues[5]; 00114 if (mValues[6] < minval && mValues[6]>mWshedval) 00115 minval = mValues[6]; 00116 if (mValues[7] < minval && mValues[7]>mWshedval) 00117 minval = mValues[7]; 00118 if (mValues[8] < minval && mValues[8]>mWshedval) 00119 minval = mValues[8]; 00120 00121 if (minval>mWshedval && minval<mValues[mPctIdx]) 00122 return mWshedval; 00123 else 00124 return mValues[mPctIdx]; 00125 } 00126 00127 return mValues[mPctIdx]; 00128 } 00129 00130 private: 00131 int mPctIdx; 00132 int mConn; //connectivity 4 or 8 00133 int mWshedval; 00134 00135 SrcArithType* mValues; 00136 int mI; 00137 }; 00138 00139 00140 } // namespace Trait 00141 } // namespace Array 00142 } // namespace Core 00143 } // namespace Impala 00144 00145 #endif