00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkDeformableSimplexMesh3DGradientConstraintForceFilter_h
00018 #define __itkDeformableSimplexMesh3DGradientConstraintForceFilter_h
00019
00020 #include "itkDeformableSimplexMesh3DFilter.h"
00021 #include "itkMesh.h"
00022 #include "itkVector.h"
00023 #include "itkImage.h"
00024 #include "itkConstNeighborhoodIterator.h"
00025 #include "itkCovariantVector.h"
00026
00027 #include <set>
00028 #include <vector>
00029 namespace itk
00030 {
00031 class ImageVoxel
00032 {
00033
00034 public:
00035
00036 unsigned int m_Vpos[3];
00037
00038 double m_Spos[3];
00039
00040 double m_Value;
00041
00042 double m_Distance;
00043
00044 unsigned int m_Index;
00045
00046 ImageVoxel() {};
00047 ImageVoxel(int *pos, double *subpos, double val, double dist, unsigned int ind)
00048 {
00049 this->m_Vpos[0] = pos[0];
00050 this->m_Vpos[1] = pos[1];
00051 this->m_Vpos[2] = pos[2];
00052 this->m_Spos[0] = subpos[0];
00053 this->m_Spos[1] = subpos[1];
00054 this->m_Spos[2] = subpos[2];
00055 this->m_Value = val;
00056 this->m_Distance = dist;
00057 this->m_Index = ind;
00058 }
00059
00061 unsigned int GetX(void) const { return m_Vpos[0]; }
00063 unsigned int GetY(void) const { return m_Vpos[1]; }
00065 unsigned int GetZ(void) const { return m_Vpos[2]; }
00067 double GetDistance(void) const { return m_Distance; }
00069 double GetValue(void) const { return m_Value; }
00071
00073 void SetValue(const double val) { m_Value = val; }
00074
00075 };
00076
00087 template <class TInputMesh, class TOutputMesh>
00088 class DeformableSimplexMesh3DGradientConstraintForceFilter : public DeformableSimplexMesh3DFilter<TInputMesh, TOutputMesh>
00089 {
00090 public:
00092 typedef DeformableSimplexMesh3DGradientConstraintForceFilter Self;
00093
00095 typedef DeformableSimplexMesh3DFilter<TInputMesh, TOutputMesh> Superclass;
00096
00098 typedef SmartPointer<Self> Pointer;
00099 typedef SmartPointer<const Self> ConstPointer;
00100
00102 itkNewMacro(Self);
00103
00105 itkTypeMacro(DeformableSimplexMesh3DGradientConstraintForceFilter, DeformableSimplexMesh3DFilter);
00106
00108 typedef TInputMesh InputMeshType;
00109 typedef TOutputMesh OutputMeshType;
00110
00111 typedef typename Superclass::PointType PointType;
00112 typedef typename Superclass::GradientIndexType GradientIndexType;
00113 typedef typename Superclass::GradientIndexValueType GradientIndexValueType;
00114
00115
00116 typedef typename InputMeshType::Pointer InputMeshPointer;
00117 typedef typename OutputMeshType::Pointer OutputMeshPointer;
00118
00119 typedef typename InputMeshType::PixelType PixelType;
00120
00121 typedef Image<PixelType, 3> GradientIntensityImageType;
00122 typedef typename GradientIntensityImageType::Pointer GradientIntensityImagePointer;
00123
00124 typedef Image<float, 3> OriginalImageType;
00125 typedef typename OriginalImageType::IndexType OriginalImageIndexType;
00126 typedef typename OriginalImageIndexType::IndexValueType ImageIndexValueType;
00127 typedef typename OriginalImageType::Pointer OriginalImagePointer;
00129 itkSetMacro(Range, int);
00130 itkGetMacro(Range, int);
00132
00133
00134 enum SIDE
00135 {
00136
00137 NORMAL,
00138
00139 INVERSE,
00140
00141 BOTH
00142 };
00143
00147 itkSetMacro(Image, OriginalImagePointer);
00148
00149 protected:
00150 DeformableSimplexMesh3DGradientConstraintForceFilter();
00151 ~DeformableSimplexMesh3DGradientConstraintForceFilter();
00152 DeformableSimplexMesh3DGradientConstraintForceFilter(const Self&) {}
00153 void operator=(const Self&){};
00154 void PrintSelf(std::ostream& os, Indent indent) const;
00155
00159 virtual void ComputeExternalForce(SimplexMeshGeometry* data);
00160
00164 int m_Range;
00165
00166 private:
00167 double NextVoxel(const double* pp, int *ic, double *x, double *y, double *z);
00168
00169 int Signi(double a);
00170
00171 void Clear();
00172
00173
00174 ImageVoxel *m_StartVoxel;
00175
00176 std::vector<ImageVoxel *> m_Positive;
00177
00178 std::vector<ImageVoxel *> m_Negative;
00179
00180 OriginalImagePointer m_Image;
00181
00182 };
00183
00184 }
00185
00186 #ifndef ITK_MANUAL_INSTANTIATION
00187 #include "itkDeformableSimplexMesh3DGradientConstraintForceFilter.txx"
00188 #endif
00189
00190 #endif
00191