00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkBalloonForceFilter_h
00018
#define __itkBalloonForceFilter_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
00055
template <
class TInputMesh,
class TOutputMesh>
00056 class ITK_EXPORT BalloonForceFilter :
public MeshToMeshFilter<TInputMesh, TOutputMesh>
00057 {
00058
public:
00060 typedef BalloonForceFilter
Self;
00061 typedef MeshToMeshFilter<TInputMesh, TOutputMesh> Superclass;
00062 typedef SmartPointer<Self> Pointer;
00063 typedef SmartPointer<const Self> ConstPointer;
00064
00066
itkNewMacro(
Self);
00067
00069
itkTypeMacro(BalloonForceFilter,
MeshToMeshFilter);
00070
00072 typedef TInputMesh
InputMeshType;
00073 typedef TOutputMesh
OutputMeshType;
00074
00076
typedef typename InputMeshType::PointsContainerPointer
00077 InputPointsContainerPointer;
00078
typedef typename InputMeshType::PointsContainer::Iterator
00079 InputPointsContainerIterator;
00080
typedef typename InputMeshType::PointDataContainerPointer
00081 InputPointDataContainerPointer;
00082
typedef typename InputMeshType::PointDataContainer::Iterator
00083 InputPointDataContainerIterator;
00084
typedef typename InputMeshType::CellsContainerPointer
00085 InputCellsContainerPointer;
00086
typedef typename InputMeshType::CellsContainer::Iterator
00087 InputCellsContainerIterator;
00088
typedef typename InputMeshType::CellDataContainerPointer
00089 InputCellDataContainerPointer;
00090
typedef typename InputMeshType::CellDataContainer::Iterator
00091 InputCellDataContainerIterator;
00092
typedef typename OutputMeshType::PointsContainerPointer
00093 OutputPointsContainerPointer;
00094
typedef typename OutputMeshType::PointsContainer::Iterator
00095 OutputPointsContainerIterator;
00096
00098 typedef typename InputMeshType::PointType
IPixelType;
00099 typedef typename InputMeshType::PixelType
PixelType;
00100
00101 typedef Image<unsigned short, 2> ImageType;
00102 typedef CovariantVector<PixelType, 2> GradientType;
00103 typedef Image<GradientType, 2> GradientImageType;
00104 typedef typename InputMeshType::Pointer
InputMeshPointer;
00105 typedef typename OutputMeshType::Pointer
OutputMeshPointer;
00106 typedef typename ImageType::Pointer
ImagePointer;
00107 typedef typename ImageType::IndexType
IndexType;
00108 typedef typename GradientImageType::Pointer
GradientImagePointer;
00109 typedef typename GradientImageType::IndexType
GradientIndexType;
00110 typedef ImageRegionIterator<ImageType> ImageIterator;
00111 typedef Vector<float, 3> FloatVector;
00112 typedef Vector<int, 3> IntVector;
00113 typedef Vector<double, 2> Double2Vector;
00114 typedef Vector<int, 2> Int2Vector;
00115
00117 typedef typename InputMeshType::CellType
CellType;
00118 typedef typename InputMeshType::CellTraits
CellTraits;
00119 typedef CellInterface<PixelType, CellTraits> CellInterface;
00120 typedef TriangleCell< CellInterface > TriCell;
00121
00122
00124
void ComputeForce();
00125
void Initialize();
00126
void SetStiffnessMatrix();
00127
void Advance();
00128
void Reset();
00129
void ComputeDt();
00130
void ComputeOutput();
00131
void NodeAddition(
int i,
int res,
IPixelType z);
00132
void NodesRearrange();
00133
void GapSearch();
00134
void GradientFit();
00135
void ComputeNormals();
00136
void ACDSearch();
00137
00139
itkSetMacro(ImageOutput,
ImagePointer);
00140
itkGetMacro(ImageOutput,
ImagePointer);
00141
itkSetMacro(Gradient,
GradientImagePointer);
00142
00144
itkSetMacro(Stiffness,
Double2Vector);
00145
itkSetMacro(TimeStep,
double);
00146
itkSetMacro(GradientBegin,
int);
00147
itkSetMacro(Resolution,
int);
00148
itkSetMacro(Center,
IndexType);
00149
itkGetMacro(Normals,
InputMeshPointer);
00150
itkSetMacro(DistanceForGradient,
float);
00151
itkSetMacro(DistanceToStop,
float);
00152
itkSetMacro(Potential,
ImagePointer);
00153
itkGetMacro(Locations,
InputMeshPointer);
00154
itkGetMacro(Displacements,
InputMeshPointer);
00155
itkGetMacro(Derives,
InputMeshPointer);
00156
itkGetMacro(Forces,
InputMeshPointer);
00157
00158
protected:
00159 BalloonForceFilter();
00160 ~BalloonForceFilter();
00161
void PrintSelf(std::ostream& os,
Indent indent)
const;
00162
00163
virtual void GenerateData();
00164
00165
private:
00166 BalloonForceFilter(
const Self&);
00167
void operator=(
const Self&);
00168
00170
InputMeshPointer m_Forces;
00171
InputMeshPointer m_Normals;
00172
InputMeshPointer m_Displacements;
00173
InputMeshPointer m_Derives;
00174
InputMeshPointer m_Locations;
00175
InputMeshPointer m_Input;
00176
OutputMeshPointer m_Output;
00177
00179 vnl_matrix_fixed<double, 4, 4> m_NStiffness;
00180 vnl_matrix_fixed<double, 4, 4> m_SStiffness;
00181 vnl_matrix_fixed<double, 4, 4> m_CStiffness;
00182 vnl_matrix_fixed<double, 4, 4> **m_K;
00183
00184
Double2Vector m_Stiffness;
00185
double m_TimeStep;
00186
int m_Resolution;
00187
IndexType m_Center;
00188
float m_MiniT;
00189
int m_Step;
00190
unsigned int m_NumberOfNodes;
00191
unsigned int m_NumberOfCells;
00192
unsigned int m_NumNewNodes;
00193
int *m_GapLocations;
00194
float **m_NewNodes;
00195
int m_NewNodesExisted;
00196
unsigned int m_NewNodeLimit;
00197
unsigned int m_ImageWidth;
00198
unsigned int m_ImageHeight;
00199
unsigned int m_ImageDepth;
00200
int m_ModelXUpLimit;
00201
int m_ModelXDownLimit;
00202
int m_ModelYUpLimit;
00203
int m_ModelYDownLimit;
00204
int **m_ACD;
00205
int m_ModelRestart;
00206
int m_GradientBegin;
00207
Int2Vector m_StepThreshold;
00208
00209
float m_DistanceToBoundary;
00210
float m_DistanceToStop;
00211
float m_DistanceForGradient;
00212
00213
ImagePointer m_Potential;
00214
GradientImagePointer m_Gradient;
00215
00216
00217
ImagePointer m_ImageOutput;
00218
unsigned short m_ObjectLabel;
00219
00220
typedef ImageType::SizeType ImageSizeType;
00221
00222 };
00223
00224 }
00225
00226
#ifndef ITK_MANUAL_INSTANTIATION
00227
#include "itkBalloonForceFilter.txx"
00228
#endif
00229
00230
#endif