00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
#ifndef __itkNormalVectorDiffusionFunction_h_
00018
#define __itkNormalVectorDiffusionFunction_h_
00019
00020
#include "itkNormalVectorFunctionBase.h"
00021
#include "itkNumericTraits.h"
00022
#include <math.h>
00023
00024
namespace itk {
00025
00057
template <
class TSparseImageType>
00058 class ITK_EXPORT NormalVectorDiffusionFunction
00059 :
public NormalVectorFunctionBase <TSparseImageType>
00060 {
00061
public:
00063 typedef NormalVectorDiffusionFunction
Self;
00064 typedef NormalVectorFunctionBase <TSparseImageType>
Superclass;
00065 typedef SmartPointer<Self> Pointer;
00066 typedef SmartPointer<const Self> ConstPointer;
00067
00069
itkTypeMacro( NormalVectorDiffusionFunction,
NormalVectorFunctionBase);
00070
00072
itkStaticConstMacro(ImageDimension,
unsigned int, Superclass::ImageDimension);
00073
00075
itkNewMacro(
Self);
00076
00078 typedef typename Superclass::TimeStepType
TimeStepType;
00079 typedef typename Superclass::RadiusType
RadiusType;
00080 typedef typename Superclass::NeighborhoodType
NeighborhoodType;
00081 typedef typename Superclass::FloatOffsetType
FloatOffsetType;
00082 typedef typename Superclass::IndexType
IndexType;
00083 typedef typename Superclass::SparseImageType
SparseImageType;
00084 typedef typename Superclass::NodeType
NodeType;
00085 typedef typename Superclass::NodeValueType
NodeValueType;
00086 typedef typename Superclass::NormalVectorType
NormalVectorType;
00087
00092 void SetNormalProcessType(
int npt )
00093 { m_NormalProcessType = npt; }
00094
00096 int GetNormalProcessType()
const
00097
{
return m_NormalProcessType; }
00098
00104 void SetConductanceParameter(
NodeValueType cp )
00105 {
00106 m_ConductanceParameter = cp + static_cast<NodeValueType> (0.001);
00107
00108
00109 m_FluxStopConstant = static_cast<NodeValueType>
00110 (-1.0/(m_ConductanceParameter*m_ConductanceParameter));
00111 }
00112
00114 NodeValueType GetConductanceParameter()
const
00115 {
return m_ConductanceParameter; }
00116
00118 NodeValueType GetFluxStopConstant()
const
00119 {
return m_FluxStopConstant; }
00120
00125
virtual void PrecomputeSparseUpdate( NeighborhoodType &it )
const;
00126
00128
virtual NormalVectorType ComputeSparseUpdate (NeighborhoodType &neighborhood,
00129
void *globalData,
00130
const FloatOffsetType &offset)
const;
00131
00132
private:
00134 NodeValueType m_ConductanceParameter;
00135
00138 NodeValueType m_FluxStopConstant;
00139
00140
protected:
00141 NormalVectorDiffusionFunction();
00142 ~NormalVectorDiffusionFunction() {}
00143 void PrintSelf(std::ostream& os,
Indent indent)
const;
00144
00147
NodeValueType FluxStopFunction(
const NodeValueType v )
const
00148 {
00149
00150
if (v<=0.0)
return NumericTraits<NodeValueType>::One;
00151
else return static_cast<NodeValueType>(::exp(m_FluxStopConstant*v));
00152 }
00153
00154
private:
00156
int m_NormalProcessType;
00157
00158 NormalVectorDiffusionFunction(
const Self&);
00159
void operator=(
const Self&);
00160 };
00161
00162 }
00163
00164
#ifndef ITK_MANUAL_INSTANTIATION
00165
#include "itkNormalVectorDiffusionFunction.txx"
00166
#endif
00167
00168
#endif