00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _DeformableSimplexMesh3DGradientConstraintForceFilter_h
00018 #define _DeformableSimplexMesh3DGradientConstraintForceFilter_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 vpos[3];
00037
00038 double spos[3];
00039
00040 double value;
00041
00042 double distance;
00043
00044 unsigned int index;
00045
00046 ImageVoxel() {};
00047 ImageVoxel(int *pos, double *subpos, double val, double dist, unsigned int ind)
00048 {
00049 this->vpos[0] = pos[0];
00050 this->vpos[1] = pos[1];
00051 this->vpos[2] = pos[2];
00052 this->spos[0] = subpos[0];
00053 this->spos[1] = subpos[1];
00054 this->spos[2] = subpos[2];
00055 this->value = val;
00056 this->distance = dist;
00057 this->index = ind;
00058 };
00059
00061 unsigned int getX(void) const { return vpos[0]; }
00063 unsigned int getY(void) const { return vpos[1]; }
00065 unsigned int getZ(void) const { return vpos[2]; }
00067 double getDistance(void) const { return distance; }
00069 double getValue(void) const { return value; }
00071
00073 void setValue(const double val) { 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 typedef typename Superclass::PointType PointType;
00111 typedef typename Superclass::GradientIndexType GradientIndexType;
00112 typedef typename Superclass::GradientIndexValueType GradientIndexValueType;
00113
00114
00115 typedef typename InputMeshType::Pointer InputMeshPointer;
00116 typedef typename OutputMeshType::Pointer OutputMeshPointer;
00117
00118 typedef typename InputMeshType::PixelType PixelType;
00119
00120 typedef Image<PixelType, 3> GradientIntensityImageType;
00121 typedef typename GradientIntensityImageType::Pointer GradientIntensityImagePointer;
00122
00123 typedef Image<float, 3> OriginalImageType;
00124 typedef typename OriginalImageType::IndexType OriginalImageIndexType;
00125 typedef typename OriginalImageIndexType::IndexValueType ImageIndexValueType;
00126 typedef typename OriginalImageType::Pointer OriginalImagePointer;
00128 itkSetMacro(Range, int);
00129 itkGetMacro(Range, int);
00131
00132
00133 enum SIDE
00134 {
00135
00136 NORMAL,
00137
00138 INVERSE,
00139
00140 BOTH
00141 };
00142
00146 itkSetMacro(Image, OriginalImagePointer);
00147
00148 protected:
00149 DeformableSimplexMesh3DGradientConstraintForceFilter();
00150 ~DeformableSimplexMesh3DGradientConstraintForceFilter();
00151 DeformableSimplexMesh3DGradientConstraintForceFilter(const Self&)
00152 {
00153 }
00154 void operator=(const Self&){};
00155 void PrintSelf(std::ostream& os, Indent indent) const;
00156
00160 virtual void ComputeExternalForce(SimplexMeshGeometry* data);
00161
00165 int m_Range;
00166
00167 private:
00168 double NextVoxel(const double* pp, int *ic, double *x, double *y, double *z);
00169
00170 int Signi(double a);
00171
00172 void Clear();
00173
00174
00175 ImageVoxel *m_StartVoxel;
00176
00177 std::vector<ImageVoxel *> m_Positive;
00178
00179 std::vector<ImageVoxel *> m_Negative;
00180
00181 OriginalImagePointer m_Image;
00182
00183 };
00184
00185 }
00186
00187 #ifndef ITK_MANUAL_INSTANTIATION
00188 #include "itkDeformableSimplexMesh3DGradientConstraintForceFilter.txx"
00189 #endif
00190
00191 #endif
00192