00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _vlVoxelOpSobel_h
00028 #define _vlVoxelOpSobel_h
00029
00030 #include "vlvoxeloperator.h"
00031 #include "vlvarlistadmin.h"
00032 #include "vloffset.h"
00033
00040 template <typename DataType, vlLayoutType Layout>
00041 class vlVoxelOpSobel : public vlVoxelOperator<DataType, Layout>
00042 {
00043 public:
00044 vlVoxelOpSobel()
00045 {
00046
00047 m_offsetsX[0] = vlOffset(1,1,0);
00048 m_offsetsX[1] = vlOffset(1,-1,0);
00049 m_offsetsX[2] = vlOffset(1,0,1);
00050 m_offsetsX[3] = vlOffset(1,0,-1);
00051
00052 m_offsetsX[4] = vlOffset(-1,1,0);
00053 m_offsetsX[5] = vlOffset(-1,-1,0);
00054 m_offsetsX[6] = vlOffset(-1,0,1);
00055 m_offsetsX[7] = vlOffset(-1,0,-1);
00056
00057
00058 m_offsetsY[0] = vlOffset(1,1,0);
00059 m_offsetsY[1] = vlOffset(-1,1,0);
00060 m_offsetsY[2] = vlOffset(0,1,1);
00061 m_offsetsY[3] = vlOffset(0,1,-1);
00062
00063 m_offsetsY[4] = vlOffset(-1,-1,0);
00064 m_offsetsY[5] = vlOffset(1,-1,0);
00065 m_offsetsY[6] = vlOffset(0,-1,1);
00066 m_offsetsY[7] = vlOffset(0,-1,-1);
00067
00068
00069 m_offsetsZ[0] = vlOffset(1,0,1);
00070 m_offsetsZ[1] = vlOffset(-1,0,1);
00071 m_offsetsZ[2] = vlOffset(0,1,1);
00072 m_offsetsZ[3] = vlOffset(0,-1,1);
00073
00074 m_offsetsZ[4] = vlOffset(-1,0,-1);
00075 m_offsetsZ[5] = vlOffset(1,0,-1);
00076 m_offsetsZ[6] = vlOffset(0,1,-1);
00077 m_offsetsZ[7] = vlOffset(0,-1,-1);
00078 }
00079
00080 vlVoxelOpType type() { return vlVoxelOp::Sobel; };
00081
00082 std::string name() { return ("Sobel"); };
00083
00085 vlLayoutType layout() { return Layout; };
00086
00088 vlVarList * config() { return (&m_varList); };
00089
00094 bool getValue(vlVolIterConst<DataType, Layout> & iter, DataType & value)
00095 { return (false); };
00096
00102 bool getValue(vlVolIterConst<DataType, Layout> & iter, vlVoxelOpValue & value)
00103 {
00104 double dx = iter.getRelativeX(1);
00105 dx += iter.getRelative(m_offsetsX[0]);
00106 dx += iter.getRelative(m_offsetsX[1]);
00107 dx += iter.getRelative(m_offsetsX[2]);
00108 dx += iter.getRelative(m_offsetsX[3]);
00109
00110 dx -= iter.getRelativeX(-1);
00111 dx -= iter.getRelative(m_offsetsX[4]);
00112 dx -= iter.getRelative(m_offsetsX[5]);
00113 dx -= iter.getRelative(m_offsetsX[6]);
00114 dx -= iter.getRelative(m_offsetsX[7]);
00115
00116 double dy = iter.getRelativeY(1);
00117 dy += iter.getRelative(m_offsetsY[0]);
00118 dy += iter.getRelative(m_offsetsY[1]);
00119 dy += iter.getRelative(m_offsetsY[2]);
00120 dy += iter.getRelative(m_offsetsY[3]);
00121
00122 dy -= iter.getRelativeY(-1);
00123 dy -= iter.getRelative(m_offsetsY[4]);
00124 dy -= iter.getRelative(m_offsetsY[5]);
00125 dy -= iter.getRelative(m_offsetsY[6]);
00126 dy -= iter.getRelative(m_offsetsY[7]);
00127
00128 double dz = iter.getRelativeZ(1);
00129 dz += iter.getRelative(m_offsetsZ[0]);
00130 dz += iter.getRelative(m_offsetsZ[1]);
00131 dz += iter.getRelative(m_offsetsZ[2]);
00132 dz += iter.getRelative(m_offsetsZ[3]);
00133
00134 dz -= iter.getRelativeZ(-1);
00135 dz -= iter.getRelative(m_offsetsZ[4]);
00136 dz -= iter.getRelative(m_offsetsZ[5]);
00137 dz -= iter.getRelative(m_offsetsZ[6]);
00138 dz -= iter.getRelative(m_offsetsZ[7]);
00139
00140
00141 value.setNormal3f(vlNormal3f(dx, dy, dz));
00142
00143 value.setDl(sqrt(dx*dx+dy*dy+dz*dz));
00144
00145 return (true);
00146 };
00147
00148 protected:
00150 vlVarListAdmin m_varList;
00151
00152 vlOffset m_offsetsX[8], m_offsetsY[8], m_offsetsZ[8];
00153
00154 };
00155
00156 #endif // _vlVoxelOpSobel_h