00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkKdTreeGenerator_h
00018 #define __itkKdTreeGenerator_h
00019
00020 #include <vector>
00021 #include "itkMacro.h"
00022 #include "itkPoint.h"
00023 #include "itkSize.h"
00024 #include "itkObject.h"
00025
00026 #include "itkSample.h"
00027 #include "itkSubsample.h"
00028 #include "itkKdTree.h"
00029 #include "itkStatisticsAlgorithm.h"
00030
00031 namespace itk{
00032 namespace Statistics{
00033
00068 template < class TSample >
00069 class ITK_EXPORT KdTreeGenerator : public Object
00070 {
00071 public:
00073 typedef KdTreeGenerator Self ;
00074 typedef Object Superclass ;
00075 typedef SmartPointer<Self> Pointer;
00076 typedef SmartPointer<const Self> ConstPointer;
00077
00079 itkTypeMacro(KdTreeGenerator, Object);
00080
00082 itkNewMacro(Self) ;
00083
00085 typedef typename TSample::MeasurementVectorType MeasurementVectorType ;
00086 typedef typename TSample::MeasurementType MeasurementType ;
00087
00089 typedef unsigned int MeasurementVectorSizeType;
00090
00092 typedef KdTree< TSample > KdTreeType ;
00093
00095 typedef KdTreeType OutputType ;
00096
00098 typedef typename KdTreeType::Pointer OutputPointer ;
00099
00101 typedef typename KdTreeType::KdTreeNodeType KdTreeNodeType ;
00102
00104 typedef Subsample< TSample > SubsampleType ;
00105
00107 typedef typename SubsampleType::Pointer SubsamplePointer ;
00108
00110 void SetSample(TSample* sample) ;
00111
00114 void SetBucketSize(int size) ;
00115
00117 OutputPointer GetOutput()
00118 { return m_Tree ; }
00119
00121 void Update()
00122 { this->GenerateData() ; }
00123
00125 void GenerateData() ;
00126
00128 unsigned int TotalInstance ;
00129
00132 itkGetConstMacro( MeasurementVectorSize, unsigned int );
00133
00134 protected:
00136 KdTreeGenerator() ;
00137
00139 virtual ~KdTreeGenerator() {}
00140
00141 void PrintSelf(std::ostream& os, Indent indent) const ;
00142
00144 SubsamplePointer GetSubsample()
00145 { return m_Subsample ; }
00146
00148 virtual KdTreeNodeType* GenerateNonterminalNode(int beginIndex,
00149 int endIndex,
00150 MeasurementVectorType
00151 &lowerBound,
00152 MeasurementVectorType
00153 &upperBound,
00154 int level) ;
00155
00157 KdTreeNodeType* GenerateTreeLoop(int beginIndex, int endIndex,
00158 MeasurementVectorType &lowerBound,
00159 MeasurementVectorType &upperBound,
00160 int level) ;
00161
00162 private:
00163 KdTreeGenerator(const Self&) ;
00164 void operator=(const Self&) ;
00165
00167 TSample* m_SourceSample ;
00168
00172 SubsamplePointer m_Subsample ;
00173
00176 int m_BucketSize ;
00177
00179 OutputPointer m_Tree ;
00180
00182 MeasurementVectorType m_TempLowerBound ;
00183
00185 MeasurementVectorType m_TempUpperBound ;
00186
00188 MeasurementVectorType m_TempMean ;
00189
00191 MeasurementVectorSizeType m_MeasurementVectorSize;
00192 } ;
00193
00194 }
00195 }
00196
00197 #ifndef ITK_MANUAL_INSTANTIATION
00198 #include "itkKdTreeGenerator.txx"
00199 #endif
00200
00201 #endif
00202
00203
00204
00205
00206