00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkDeformableMesh3DFilter_h
00018
#define __itkDeformableMesh3DFilter_h
00019
00020
#include "itkMeshToMeshFilter.h"
00021
#include "vnl/vnl_matrix_fixed.h"
00022
#include "vnl/vnl_math.h"
00023
#include "itkMesh.h"
00024
#include "itkVector.h"
00025
#include "itkTriangleCell.h"
00026
#include "itkImage.h"
00027
#include "itkImageRegionIterator.h"
00028
#include <itkCovariantVector.h>
00029
00030
namespace itk
00031 {
00032
00050
template <
class TInputMesh,
class TOutputMesh>
00051 class ITK_EXPORT DeformableMesh3DFilter :
public MeshToMeshFilter<TInputMesh, TOutputMesh>
00052 {
00053
public:
00055 typedef DeformableMesh3DFilter
Self;
00056
00058 typedef MeshToMeshFilter<TInputMesh, TOutputMesh> Superclass;
00059
00061 typedef SmartPointer<Self> Pointer;
00062 typedef SmartPointer<const Self> ConstPointer;
00063
00065
itkNewMacro(
Self);
00066
00068
itkTypeMacro(DeformableMesh3DFilter,
MeshToMeshFilter);
00069
00071 typedef TInputMesh
InputMeshType;
00072 typedef TOutputMesh
OutputMeshType;
00073
typedef typename InputMeshType::PointsContainerPointer
00074 InputPointsContainerPointer;
00075
typedef typename InputMeshType::PointsContainer::Iterator
00076 InputPointsContainerIterator;
00077
typedef typename InputMeshType::PointDataContainerPointer
00078 InputPointDataContainerPointer;
00079
typedef typename InputMeshType::PointDataContainer::Iterator
00080 InputPointDataContainerIterator;
00081
typedef typename InputMeshType::CellsContainerPointer
00082 InputCellsContainerPointer;
00083
typedef typename InputMeshType::CellsContainer::Iterator
00084 InputCellsContainerIterator;
00085
typedef typename InputMeshType::CellDataContainerPointer
00086 InputCellDataContainerPointer;
00087
typedef typename InputMeshType::CellDataContainer::Iterator
00088 InputCellDataContainerIterator;
00089
typedef typename OutputMeshType::PointsContainerPointer
00090 OutputPointsContainerPointer;
00091
typedef typename OutputMeshType::CellsContainer
00092 OutputCellsContainer;
00093
typedef typename OutputMeshType::CellsContainerPointer
00094 OutputCellsContainerPointer;
00095
typedef typename OutputMeshType::PointsContainer::Iterator
00096 OutputPointsContainerIterator;
00097
00099 typedef typename InputMeshType::CellType
CellType;
00100 typedef typename InputMeshType::CellTraits
CellTraits;
00101 typedef typename InputMeshType::PointType
InputPointType;
00102 typedef typename InputMeshType::PixelType
PixelType;
00103
00105 typedef Image<unsigned char, 3> PotentialImageType;
00106 typedef ImageRegionIterator<PotentialImageType> PotentialIterator;
00107 typedef CovariantVector<PixelType, 3> GradientType;
00108 typedef Image<GradientType, 3> GradientImageType;
00109 typedef ImageRegionIterator<GradientImageType> GradientIterator;
00110 typedef typename GradientImageType::SizeType
ImageSizeType;
00111 typedef typename GradientImageType::IndexType
ImageIndexType;
00112
00113 typedef itk::CellInterface<PixelType, CellTraits> TCellInterface;
00114 typedef itk::TriangleCell<TCellInterface> TriCell;
00115
00116 typedef CovariantVector<int, 3> int3DVector;
00117 typedef CovariantVector<double, 2> double2DVector;
00118 typedef CovariantVector<double, 3> double3DVector;
00119
00120
00121 typedef typename InputMeshType::Pointer
InputMeshPointer;
00122 typedef typename OutputMeshType::Pointer
OutputMeshPointer;
00123 typedef typename GradientImageType::Pointer
GradientImagePointer;
00124
00126
void SetStiffnessMatrix( vnl_matrix_fixed<double, 4, 4> *stiff,
int i );
00127
00129
itkSetMacro(Gradient,
GradientImagePointer);
00130
itkGetMacro(Gradient,
GradientImagePointer);
00131
00132
itkSetMacro(StepThreshold,
int);
00133
itkGetMacro(StepThreshold,
int);
00134
00135
itkSetMacro(Stiffness,
double2DVector);
00136
itkGetMacro(Stiffness,
double2DVector);
00137
00138
itkSetMacro(TimeStep,
double);
00139
itkGetMacro(TimeStep,
double);
00140
00141
itkSetMacro(Scale,
double3DVector);
00142
00143
itkSetMacro(PotentialMagnitude,
PixelType);
00144
itkSetMacro(GradientMagnitude,
PixelType);
00145
itkSetMacro(PotentialOn,
unsigned short);
00146
itkSetMacro(ObjectLabel,
unsigned char);
00147
00148
itkGetMacro(Normals,
InputMeshPointer);
00149
00150
protected:
00151 DeformableMesh3DFilter();
00152 ~DeformableMesh3DFilter();
00153 DeformableMesh3DFilter(
const Self&) {}
00154 void operator=(
const Self&) {}
00155 void PrintSelf(std::ostream& os,
Indent indent)
const;
00156
00157
virtual void GenerateData();
00158
00159
private:
00161
InputMeshPointer m_Forces;
00162
InputMeshPointer m_Normals;
00163
InputMeshPointer m_Displacements;
00164
InputMeshPointer m_Derives;
00165
InputMeshPointer m_Locations;
00166
00167
void Initialize();
00168
void SetDefaultStiffnessMatrix();
00169
void SetMeshStiffness();
00170
void Advance();
00171
void ComputeDt();
00172
void ComputeOutput();
00173
void GradientFit();
00174
void ComputeNormals();
00175
void PotentialFit();
00176
00178 vnl_matrix_fixed<double, 4, 4> m_StiffnessMatrix[10];
00179 vnl_matrix_fixed<double, 4, 4> **m_K;
00180
00182
double2DVector m_Stiffness;
00183
double m_TimeStep;
00184
double3DVector m_Scale;
00185
int m_Step;
00186
int m_NumberOfNodes;
00187
int m_NumberOfCells;
00188
int m_ImageWidth;
00189
int m_ImageHeight;
00190
int m_ImageDepth;
00191
int m_StepThreshold;
00192
unsigned short m_ModelXUpLimit;
00193
unsigned short m_ModelXDownLimit;
00194
unsigned short m_ModelYUpLimit;
00195
unsigned short m_ModelYDownLimit;
00196
unsigned short m_ModelZUpLimit;
00197
unsigned short m_ModelZDownLimit;
00198
unsigned short m_PotentialOn;
00199
unsigned char m_ObjectLabel;
00200
PixelType m_GradientMagnitude;
00201
PixelType m_PotentialMagnitude;
00202
00204
GradientImagePointer m_Gradient;
00205 PotentialImageType::Pointer m_Potential;
00206 };
00207
00208 }
00209
00210
#ifndef ITK_MANUAL_INSTANTIATION
00211
#include "itkDeformableMesh3DFilter.txx"
00212
#endif
00213
00214
#endif