From 506b27e2ea07cb34ba230b02eb6857b20cbf78b1 Mon Sep 17 00:00:00 2001 From: Leonardo Florez-Valencia Date: Thu, 17 Sep 2015 14:54:44 +0200 Subject: [PATCH] ... --- .../Algorithms/BezierCurveFunction.h | 104 +- .../Algorithms/GradientFunctionBase.h | 122 +-- .../Algorithms/GulsunTekMedialness.h | 124 +-- .../Algorithms/GulsunTekMedialness.hxx | 30 +- .../Algorithms/ImageFunctionFilter.h | 148 +-- .../Algorithms/ImageFunctorFilter.h | 148 +-- .../Algorithms/InertiaMedialness.h | 332 +++---- .../Algorithms/InertiaTensorFunction.h | 276 +++--- lib/cpExtensions/Algorithms/IsoImageSlicer.h | 208 ++-- .../IterativeGaussianModelEstimator.h | 134 +-- .../Algorithms/KalmanConstantFilter.h | 58 +- lib/cpExtensions/Algorithms/KalmanFilter.h | 258 ++--- .../Algorithms/KalmanVelocityFilter.h | 72 +- .../Algorithms/LightCompensationFilter.h | 80 +- .../MultiScaleGaussianImageFilter.h | 126 +-- .../Algorithms/ParallelImageMean.h | 90 +- .../Algorithms/RGBExtractFunction.h | 62 +- .../RGBImageToOtherChannelsFilter.h | 116 +-- .../Algorithms/RGBToHSVFunction.h | 110 +-- .../Algorithms/RGBToRGBFunction.h | 62 +- .../Algorithms/RGBToYPbPrFunction.h | 72 +- .../DataStructures/ITKAndVTKImage.h | 168 ++-- lib/cpExtensions/DataStructures/QuadEdge.h | 900 +++++++++--------- .../DataStructures/QuadEdgeCell.h | 216 ++--- .../DataStructures/QuadEdgeIterators.h | 248 ++--- .../DataStructures/QuadEdgeMesh.h | 516 +++++----- lib/cpExtensions/IO/MeshReader.h | 90 +- lib/cpExtensions/IO/WaveFrontOBJReader.h | 100 +- lib/cpExtensions/IO/WaveFrontOBJReader.hxx | 2 +- lib/cpExtensions/Visualization/Image3DMPR.cxx | 2 +- lib/cpExtensions/Visualization/Image3DMPR.h | 106 +-- .../Visualization/ImageInteractorStyle.cxx | 2 +- .../Visualization/ImageInteractorStyle.h | 258 ++--- .../Visualization/ImageSliceActors.h | 134 +-- lib/cpExtensions/Visualization/MPRActors.h | 178 ++-- .../Visualization/MPRWithDifferentWindows.cxx | 4 +- .../Visualization/MPRWithDifferentWindows.h | 112 +-- lib/cpExtensions/Visualization/MeshMapper.h | 160 ++-- .../Visualization/OpenGLMeshMapper.h | 116 +-- .../Visualization/OpenGLMeshMapper.hxx | 16 +- .../Visualization/SeedWidgetCorrector.h | 52 +- 41 files changed, 3056 insertions(+), 3056 deletions(-) diff --git a/lib/cpExtensions/Algorithms/BezierCurveFunction.h b/lib/cpExtensions/Algorithms/BezierCurveFunction.h index d15f328..ee512da 100644 --- a/lib/cpExtensions/Algorithms/BezierCurveFunction.h +++ b/lib/cpExtensions/Algorithms/BezierCurveFunction.h @@ -10,60 +10,60 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + * Uses the De Casteljau's algorithm. + */ + template< class V > + class BezierCurveFunction + : public itk::FunctionBase< typename V::ValueType, V > { - /** - * Uses the De Casteljau's algorithm. - */ - template< class V > - class BezierCurveFunction - : public itk::FunctionBase< typename V::ValueType, V > - { - public: - typedef BezierCurveFunction Self; - typedef itk::FunctionBase< typename V::ValueType, V > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef V TVector; - typedef typename V::ValueType TScalar; - - typedef - itk::Matrix< TScalar, TVector::Dimension, TVector::Dimension > - TFrame; - typedef std::vector< TVector > TVectorsContainer; - - public: - itkNewMacro( Self ); - itkTypeMacro( BezierCurveFunction, itkFunctionBase ); - - public: - virtual void AddPoint( const TVector& v ); - virtual unsigned int GetNumberOfPoints( ) const; - - virtual TVector Evaluate( const TScalar& u ) const; - virtual TFrame EvaluateFrenetFrame( const TScalar& u ) const; - virtual TScalar EvaluateLength( ) const; - - protected: - BezierCurveFunction( ); - virtual ~BezierCurveFunction( ) { } - - void _UpdateDerivative( ) const; - - private: - // Purposely not implemented - BezierCurveFunction( const Self& other ); - Self& operator=( const Self& other ); - - protected: - TVectorsContainer m_Vectors; - mutable Pointer m_Derivative; - mutable bool m_DerivativeUpdated; - }; - - } // ecapseman + public: + typedef BezierCurveFunction Self; + typedef itk::FunctionBase< typename V::ValueType, V > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef V TVector; + typedef typename V::ValueType TScalar; + + typedef + itk::Matrix< TScalar, TVector::Dimension, TVector::Dimension > + TFrame; + typedef std::vector< TVector > TVectorsContainer; + + public: + itkNewMacro( Self ); + itkTypeMacro( BezierCurveFunction, itkFunctionBase ); + + public: + virtual void AddPoint( const TVector& v ); + virtual unsigned int GetNumberOfPoints( ) const; + + virtual TVector Evaluate( const TScalar& u ) const; + virtual TFrame EvaluateFrenetFrame( const TScalar& u ) const; + virtual TScalar EvaluateLength( ) const; + + protected: + BezierCurveFunction( ); + virtual ~BezierCurveFunction( ) { } + + void _UpdateDerivative( ) const; + + private: + // Purposely not implemented + BezierCurveFunction( const Self& other ); + Self& operator=( const Self& other ); + + protected: + TVectorsContainer m_Vectors; + mutable Pointer m_Derivative; + mutable bool m_DerivativeUpdated; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/GradientFunctionBase.h b/lib/cpExtensions/Algorithms/GradientFunctionBase.h index a120a46..2c4f5b6 100644 --- a/lib/cpExtensions/Algorithms/GradientFunctionBase.h +++ b/lib/cpExtensions/Algorithms/GradientFunctionBase.h @@ -9,69 +9,69 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class G > + class GradientFunctionBase + : public itk::ImageFunction< G, typename G::PixelType::ValueType, typename G::PixelType::ValueType > { - /** - */ - template< class G > - class GradientFunctionBase - : public itk::ImageFunction< G, typename G::PixelType::ValueType, typename G::PixelType::ValueType > - { - public: - // Types from input arguments - typedef G TGradient; - typedef typename G::PixelType TVector; - typedef typename TVector::ValueType TScalar; - itkStaticConstMacro( Dimension, unsigned int, G::ImageDimension ); - - // Standard itk types - typedef GradientFunctionBase Self; - typedef itk::ImageFunction< G, TScalar, TScalar > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - // Types from base itk::ImageFunction - typedef typename Superclass::InputType TInput; - typedef typename Superclass::OutputType TOutput; - typedef typename Superclass::PointType TPoint; - typedef typename Superclass::ContinuousIndexType TContIndex; - typedef typename Superclass::IndexType TIndex; - - // Sparse buffer - typedef std::map< TIndex, TOutput, typename TIndex::LexicographicCompare > TBuffer; - - public: - itkTypeMacro( GradientFunctionBase, itkImageFunction ); - - itkBooleanMacro( BufferResults ); - itkGetConstMacro( BufferResults, bool ); - itkSetMacro( BufferResults, bool ); - - public: - virtual void ResetBuffer( ); - - virtual TOutput Evaluate( const TPoint& p ) const; - virtual TOutput EvaluateAtIndex( const TIndex& i ) const; - virtual TOutput EvaluateAtContinuousIndex( const TContIndex& i ) const; - - protected: - GradientFunctionBase( ); - virtual ~GradientFunctionBase( ); - - virtual TOutput _Evaluate( const TIndex& i ) const = 0; - - private: - // Purposely not implemented. - GradientFunctionBase( const Self& ); - void operator=( const Self& ); - - protected: - mutable TBuffer m_Buffer; - bool m_BufferResults; - }; - - } // ecapseman + public: + // Types from input arguments + typedef G TGradient; + typedef typename G::PixelType TVector; + typedef typename TVector::ValueType TScalar; + itkStaticConstMacro( Dimension, unsigned int, G::ImageDimension ); + + // Standard itk types + typedef GradientFunctionBase Self; + typedef itk::ImageFunction< G, TScalar, TScalar > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + // Types from base itk::ImageFunction + typedef typename Superclass::InputType TInput; + typedef typename Superclass::OutputType TOutput; + typedef typename Superclass::PointType TPoint; + typedef typename Superclass::ContinuousIndexType TContIndex; + typedef typename Superclass::IndexType TIndex; + + // Sparse buffer + typedef std::map< TIndex, TOutput, typename TIndex::LexicographicCompare > TBuffer; + + public: + itkTypeMacro( GradientFunctionBase, itkImageFunction ); + + itkBooleanMacro( BufferResults ); + itkGetConstMacro( BufferResults, bool ); + itkSetMacro( BufferResults, bool ); + + public: + virtual void ResetBuffer( ); + + virtual TOutput Evaluate( const TPoint& p ) const; + virtual TOutput EvaluateAtIndex( const TIndex& i ) const; + virtual TOutput EvaluateAtContinuousIndex( const TContIndex& i ) const; + + protected: + GradientFunctionBase( ); + virtual ~GradientFunctionBase( ); + + virtual TOutput _Evaluate( const TIndex& i ) const = 0; + + private: + // Purposely not implemented. + GradientFunctionBase( const Self& ); + void operator=( const Self& ); + + protected: + mutable TBuffer m_Buffer; + bool m_BufferResults; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/GulsunTekMedialness.h b/lib/cpExtensions/Algorithms/GulsunTekMedialness.h index 7ecdce9..27c1c7e 100644 --- a/lib/cpExtensions/Algorithms/GulsunTekMedialness.h +++ b/lib/cpExtensions/Algorithms/GulsunTekMedialness.h @@ -9,70 +9,70 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class G > + class GulsunTekMedialness + : public GradientFunctionBase< G > { - /** - */ - template< class G > - class GulsunTekMedialness - : public GradientFunctionBase< G > - { - public: - // Standard itk types - typedef GulsunTekMedialness Self; - typedef GradientFunctionBase< G > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - // Types from superclass - typedef typename Superclass::TGradient TGradient; - typedef typename Superclass::TVector TVector; - typedef typename Superclass::TScalar TScalar; - typedef typename Superclass::TInput TInput; - typedef typename Superclass::TOutput TOutput; - typedef typename Superclass::TPoint TPoint; - typedef typename Superclass::TContIndex TContIndex; - typedef typename Superclass::TIndex TIndex; - typedef typename Superclass::TBuffer TBuffer; - - typedef typename TIndex::OffsetType TOffset; - typedef std::vector< double > TProfile; - typedef std::vector< TOffset > TOffsets; - - public: - itkNewMacro( Self ); - itkTypeMacro( GulsunTekMedialness, GradientFunctionBase ); - - itkGetConstMacro( MinRadius, double ); - itkGetConstMacro( MaxRadius, double ); - itkGetConstMacro( ProfileSampling, unsigned int ); - itkGetConstMacro( RadialSampling, unsigned int ); - - itkSetMacro( MinRadius, double ); - itkSetMacro( MaxRadius, double ); - itkSetMacro( ProfileSampling, unsigned int ); - itkSetMacro( RadialSampling, unsigned int ); - - protected: - GulsunTekMedialness( ); - virtual ~GulsunTekMedialness( ); - - virtual TOutput _Evaluate( const TIndex& i ) const; - - private: - // Purposely not implemented. - GulsunTekMedialness( const Self& ); - void operator=( const Self& ); - - protected: - double m_MinRadius; - double m_MaxRadius; - unsigned int m_ProfileSampling; - unsigned int m_RadialSampling; - }; - - } // ecapseman + public: + // Standard itk types + typedef GulsunTekMedialness Self; + typedef GradientFunctionBase< G > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + // Types from superclass + typedef typename Superclass::TGradient TGradient; + typedef typename Superclass::TVector TVector; + typedef typename Superclass::TScalar TScalar; + typedef typename Superclass::TInput TInput; + typedef typename Superclass::TOutput TOutput; + typedef typename Superclass::TPoint TPoint; + typedef typename Superclass::TContIndex TContIndex; + typedef typename Superclass::TIndex TIndex; + typedef typename Superclass::TBuffer TBuffer; + + typedef typename TIndex::OffsetType TOffset; + typedef std::vector< double > TProfile; + typedef std::vector< TOffset > TOffsets; + + public: + itkNewMacro( Self ); + itkTypeMacro( GulsunTekMedialness, GradientFunctionBase ); + + itkGetConstMacro( MinRadius, double ); + itkGetConstMacro( MaxRadius, double ); + itkGetConstMacro( ProfileSampling, unsigned int ); + itkGetConstMacro( RadialSampling, unsigned int ); + + itkSetMacro( MinRadius, double ); + itkSetMacro( MaxRadius, double ); + itkSetMacro( ProfileSampling, unsigned int ); + itkSetMacro( RadialSampling, unsigned int ); + + protected: + GulsunTekMedialness( ); + virtual ~GulsunTekMedialness( ); + + virtual TOutput _Evaluate( const TIndex& i ) const; + + private: + // Purposely not implemented. + GulsunTekMedialness( const Self& ); + void operator=( const Self& ); + + protected: + double m_MinRadius; + double m_MaxRadius; + unsigned int m_ProfileSampling; + unsigned int m_RadialSampling; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/GulsunTekMedialness.hxx b/lib/cpExtensions/Algorithms/GulsunTekMedialness.hxx index d4d4556..01a278b 100644 --- a/lib/cpExtensions/Algorithms/GulsunTekMedialness.hxx +++ b/lib/cpExtensions/Algorithms/GulsunTekMedialness.hxx @@ -73,33 +73,33 @@ _Evaluate( const TIndex& i ) const gradient->TransformIndexToPhysicalPoint( neighbor, neighbor_P ); if( double( i_P.EuclideanDistanceTo( neighbor_P ) ) > this->m_MaxRadius ) continue; - + // Normalize offset in terms of a l1 (manhattan) distance TOffset offset = neighbor - i; // std::cout << "Offset: " << offset << std::endl; /* - int max_off = 0; - for( unsigned int o = 0; o < Self::Dimension; ++o ) + int max_off = 0; + for( unsigned int o = 0; o < Self::Dimension; ++o ) max_off += std::abs( offset[ o ] ); - if( max_off == 0 ) + if( max_off == 0 ) continue; - bool normalized = true; - TOffset normalized_offset; - for( unsigned int o = 0; o < Self::Dimension && normalized; ++o ) - { + bool normalized = true; + TOffset normalized_offset; + for( unsigned int o = 0; o < Self::Dimension && normalized; ++o ) + { if( offset[ o ] % max_off == 0 ) - normalized_offset[ o ] = offset[ o ] / max_off; + normalized_offset[ o ] = offset[ o ] / max_off; else - normalized = false; + normalized = false; - } // rof - if( !normalized ) + } // rof + if( !normalized ) normalized_offset = offset; - std::cout << "offset: " << normalized_offset << std::endl; + std::cout << "offset: " << normalized_offset << std::endl; - // Update profiles - profiles[ normalized_offset ].push_back( neighbor ); + // Update profiles + profiles[ normalized_offset ].push_back( neighbor ); */ // Update queue diff --git a/lib/cpExtensions/Algorithms/ImageFunctionFilter.h b/lib/cpExtensions/Algorithms/ImageFunctionFilter.h index c025bcb..9c0e76d 100644 --- a/lib/cpExtensions/Algorithms/ImageFunctionFilter.h +++ b/lib/cpExtensions/Algorithms/ImageFunctionFilter.h @@ -11,89 +11,89 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class I, class O, class F > + class ImageFunctionFilter + : public itk::ImageToImageFilter< I, O > { - /** - */ - template< class I, class O, class F > - class ImageFunctionFilter - : public itk::ImageToImageFilter< I, O > - { - public: - typedef ImageFunctionFilter Self; - typedef itk::ImageToImageFilter< I, O > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef I TInputImage; - typedef O TOutputImage; - typedef F TFunction; - - typedef typename O::RegionType TRegion; - - public: - itkNewMacro( Self ); - itkTypeMacro( ImageFunctionFilter, itkImageToImageFilter ); - - itkGetObjectMacro( Function, F ); - itkSetObjectMacro( Function, F ); - - protected: - ImageFunctionFilter( ) - : Superclass( ) + public: + typedef ImageFunctionFilter Self; + typedef itk::ImageToImageFilter< I, O > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef I TInputImage; + typedef O TOutputImage; + typedef F TFunction; + + typedef typename O::RegionType TRegion; + + public: + itkNewMacro( Self ); + itkTypeMacro( ImageFunctionFilter, itkImageToImageFilter ); + + itkGetObjectMacro( Function, F ); + itkSetObjectMacro( Function, F ); + + protected: + ImageFunctionFilter( ) + : Superclass( ) + { + } + virtual ~ImageFunctionFilter( ) + { + } + + virtual void ThreadedGenerateData( + const TRegion& region, + itk::ThreadIdType threadId + ) + { + const typename TRegion::SizeType& regionSize = region.GetSize( ); + if( regionSize[ 0 ] == 0 ) + return; + const I* in = this->GetInput( ); + O* out = this->GetOutput( 0 ); + + const size_t nLines = region.GetNumberOfPixels( ) / regionSize[ 0 ]; + itk::ProgressReporter progress( this, threadId, nLines ); + + // Define the iterators + itk::ImageScanlineConstIterator< I > inIt( in, region ); + itk::ImageScanlineIterator< O > outIt( out, region ); + + inIt.GoToBegin( ); + outIt.GoToBegin( ); + while( !inIt.IsAtEnd( ) ) { - } - virtual ~ImageFunctionFilter( ) - { - } - - virtual void ThreadedGenerateData( - const TRegion& region, - itk::ThreadIdType threadId - ) - { - const typename TRegion::SizeType& regionSize = region.GetSize( ); - if( regionSize[ 0 ] == 0 ) - return; - const I* in = this->GetInput( ); - O* out = this->GetOutput( 0 ); - - const size_t nLines = region.GetNumberOfPixels( ) / regionSize[ 0 ]; - itk::ProgressReporter progress( this, threadId, nLines ); - - // Define the iterators - itk::ImageScanlineConstIterator< I > inIt( in, region ); - itk::ImageScanlineIterator< O > outIt( out, region ); - - inIt.GoToBegin( ); - outIt.GoToBegin( ); - while( !inIt.IsAtEnd( ) ) + while( !inIt.IsAtEndOfLine( ) ) { - while( !inIt.IsAtEndOfLine( ) ) - { - outIt.Set( this->m_Function->EvaluateAtIndex( inIt.GetIndex( ) ) ); - ++inIt; - ++outIt; - - } // elihw - inIt.NextLine( ); - outIt.NextLine( ); - progress.CompletedPixel( ); + outIt.Set( this->m_Function->EvaluateAtIndex( inIt.GetIndex( ) ) ); + ++inIt; + ++outIt; } // elihw - } + inIt.NextLine( ); + outIt.NextLine( ); + progress.CompletedPixel( ); + + } // elihw + } - private: - // Purposely not implemented. - ImageFunctionFilter( const Self& ); - void operator=( const Self& ); + private: + // Purposely not implemented. + ImageFunctionFilter( const Self& ); + void operator=( const Self& ); - protected: - typename F::Pointer m_Function; - }; + protected: + typename F::Pointer m_Function; + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/ImageFunctorFilter.h b/lib/cpExtensions/Algorithms/ImageFunctorFilter.h index 782526f..d8a7eca 100644 --- a/lib/cpExtensions/Algorithms/ImageFunctorFilter.h +++ b/lib/cpExtensions/Algorithms/ImageFunctorFilter.h @@ -11,89 +11,89 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class I, class O, class F > + class ImageFunctorFilter + : public itk::ImageToImageFilter< I, O > { - /** - */ - template< class I, class O, class F > - class ImageFunctorFilter - : public itk::ImageToImageFilter< I, O > - { - public: - typedef ImageFunctorFilter Self; - typedef itk::ImageToImageFilter< I, O > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef I TInputImage; - typedef O TOutputImage; - typedef F TFunctor; - - typedef typename O::RegionType TRegion; - - public: - itkNewMacro( Self ); - itkTypeMacro( ImageFunctorFilter, itkImageToImageFilter ); - - itkGetMacro( Functor, F ); - itkGetConstMacro( Functor, F ); - - protected: - ImageFunctorFilter( ) - : Superclass( ) + public: + typedef ImageFunctorFilter Self; + typedef itk::ImageToImageFilter< I, O > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef I TInputImage; + typedef O TOutputImage; + typedef F TFunctor; + + typedef typename O::RegionType TRegion; + + public: + itkNewMacro( Self ); + itkTypeMacro( ImageFunctorFilter, itkImageToImageFilter ); + + itkGetMacro( Functor, F ); + itkGetConstMacro( Functor, F ); + + protected: + ImageFunctorFilter( ) + : Superclass( ) + { + } + virtual ~ImageFunctorFilter( ) + { + } + + virtual void ThreadedGenerateData( + const TRegion& region, + itk::ThreadIdType threadId + ) + { + const typename TRegion::SizeType& regionSize = region.GetSize( ); + if( regionSize[ 0 ] == 0 ) + return; + const I* in = this->GetInput( ); + O* out = this->GetOutput( 0 ); + + const size_t nLines = region.GetNumberOfPixels( ) / regionSize[ 0 ]; + itk::ProgressReporter progress( this, threadId, nLines ); + + // Define the iterators + itk::ImageScanlineConstIterator< I > inIt( in, region ); + itk::ImageScanlineIterator< O > outIt( out, region ); + + inIt.GoToBegin( ); + outIt.GoToBegin( ); + while( !inIt.IsAtEnd( ) ) { - } - virtual ~ImageFunctorFilter( ) - { - } - - virtual void ThreadedGenerateData( - const TRegion& region, - itk::ThreadIdType threadId - ) - { - const typename TRegion::SizeType& regionSize = region.GetSize( ); - if( regionSize[ 0 ] == 0 ) - return; - const I* in = this->GetInput( ); - O* out = this->GetOutput( 0 ); - - const size_t nLines = region.GetNumberOfPixels( ) / regionSize[ 0 ]; - itk::ProgressReporter progress( this, threadId, nLines ); - - // Define the iterators - itk::ImageScanlineConstIterator< I > inIt( in, region ); - itk::ImageScanlineIterator< O > outIt( out, region ); - - inIt.GoToBegin( ); - outIt.GoToBegin( ); - while( !inIt.IsAtEnd( ) ) + while( !inIt.IsAtEndOfLine( ) ) { - while( !inIt.IsAtEndOfLine( ) ) - { - outIt.Set( this->m_Functor( inIt.Get( ) ) ); - ++inIt; - ++outIt; - - } // elihw - inIt.NextLine( ); - outIt.NextLine( ); - progress.CompletedPixel( ); + outIt.Set( this->m_Functor( inIt.Get( ) ) ); + ++inIt; + ++outIt; } // elihw - } + inIt.NextLine( ); + outIt.NextLine( ); + progress.CompletedPixel( ); + + } // elihw + } - private: - // Purposely not implemented. - ImageFunctorFilter( const Self& ); - void operator=( const Self& ); + private: + // Purposely not implemented. + ImageFunctorFilter( const Self& ); + void operator=( const Self& ); - protected: - F m_Functor; - }; + protected: + F m_Functor; + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/InertiaMedialness.h b/lib/cpExtensions/Algorithms/InertiaMedialness.h index 1190d56..e9ad2a9 100644 --- a/lib/cpExtensions/Algorithms/InertiaMedialness.h +++ b/lib/cpExtensions/Algorithms/InertiaMedialness.h @@ -12,197 +12,197 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class I, class S = float > + class InertiaMedialness + : public itk::ImageFunction< I, S, S > { - /** - */ - template< class I, class S = float > - class InertiaMedialness - : public itk::ImageFunction< I, S, S > - { - public: - // Standard itk types - typedef InertiaMedialness Self; - typedef itk::ImageFunction< I, S, S > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - // Types from base itk::ImageFunction - typedef typename Superclass::InputType TInput; - typedef typename Superclass::OutputType TOutput; - typedef typename Superclass::PointType TPoint; - typedef typename Superclass::ContinuousIndexType TContIndex; - typedef typename Superclass::IndexType TIndex; - typedef typename TIndex::OffsetType TOffset; - - // Sparse buffer - typedef std::map< TIndex, TOutput, typename TIndex::LexicographicCompare > TBuffer; - - typedef InertiaTensorFunction< S, I::ImageDimension > TInertia; - - public: - itkNewMacro( Self ); - itkTypeMacro( InertiaMedialness, itkImageFunction ); - - itkBooleanMacro( BufferResults ); - itkGetConstMacro( BufferResults, bool ); - itkGetConstMacro( MaxRadius, double ); - - itkSetMacro( BufferResults, bool ); - itkSetMacro( MaxRadius, double ); - - public: - virtual void ResetBuffer( ) + public: + // Standard itk types + typedef InertiaMedialness Self; + typedef itk::ImageFunction< I, S, S > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + // Types from base itk::ImageFunction + typedef typename Superclass::InputType TInput; + typedef typename Superclass::OutputType TOutput; + typedef typename Superclass::PointType TPoint; + typedef typename Superclass::ContinuousIndexType TContIndex; + typedef typename Superclass::IndexType TIndex; + typedef typename TIndex::OffsetType TOffset; + + // Sparse buffer + typedef std::map< TIndex, TOutput, typename TIndex::LexicographicCompare > TBuffer; + + typedef InertiaTensorFunction< S, I::ImageDimension > TInertia; + + public: + itkNewMacro( Self ); + itkTypeMacro( InertiaMedialness, itkImageFunction ); + + itkBooleanMacro( BufferResults ); + itkGetConstMacro( BufferResults, bool ); + itkGetConstMacro( MaxRadius, double ); + + itkSetMacro( BufferResults, bool ); + itkSetMacro( MaxRadius, double ); + + public: + virtual void ResetBuffer( ) + { + this->m_Buffer.clear( ); + } + + virtual TOutput Evaluate( const TPoint& p ) const + { + TIndex i; + this->GetInputImage( )->TransformPhysicalPointToIndex( p, i ); + return( this->EvaluateAtIndex( i ) ); + } + + virtual TOutput EvaluateAtIndex( const TIndex& i ) const + { + TOutput res = TOutput( 0 ); + bool computed = false; + if( this->m_BufferResults ) { - this->m_Buffer.clear( ); - } - - virtual TOutput Evaluate( const TPoint& p ) const + typename TBuffer::const_iterator bIt = this->m_Buffer.find( i ); + computed = ( bIt != this->m_Buffer.end( ) ); + res = ( computed )? bIt->second: res; + + } // fi + + if( !computed ) + res = this->_Evaluate( i ); + + if( this->m_BufferResults ) + this->m_Buffer[ i ] = res; + return( res ); + } + + virtual TOutput EvaluateAtContinuousIndex( const TContIndex& i ) const + { + TPoint p; + this->GetInputImage( )->TransformContinuousIndexToPhysicalPoint( i, p ); + return( this->Evaluate( p ) ); + } + + protected: + InertiaMedialness( ) + : Superclass( ), + m_BufferResults( false ), + m_MaxRadius( double( 1 ) ) + { + this->m_Buffer.clear( ); + } + + virtual ~InertiaMedialness( ) + { + this->m_Buffer.clear( ); + } + + virtual TOutput _Evaluate( const TIndex& idx ) const + { + const I* image = this->GetInputImage( ); + + typename I::PointType p_i; + image->TransformIndexToPhysicalPoint( idx, p_i ); + + typename I::PointType max_p, min_p; + for( unsigned int d = 0; d < I::ImageDimension; ++d ) { - TIndex i; - this->GetInputImage( )->TransformPhysicalPointToIndex( p, i ); - return( this->EvaluateAtIndex( i ) ); - } - - virtual TOutput EvaluateAtIndex( const TIndex& i ) const + max_p[ d ] = p_i[ d ] + this->m_MaxRadius; + min_p[ d ] = p_i[ d ] - this->m_MaxRadius; + + } // rof + TIndex max_i, min_i; + image->TransformPhysicalPointToIndex( max_p, max_i ); + image->TransformPhysicalPointToIndex( min_p, min_i ); + + typename I::RegionType in_region = image->GetRequestedRegion( ); + TIndex in_index = in_region.GetIndex( ); + TIndex in_last = in_index + in_region.GetSize( ); + typename I::SizeType size; + for( unsigned int d = 0; d < I::ImageDimension; ++d ) { - TOutput res = TOutput( 0 ); - bool computed = false; - if( this->m_BufferResults ) - { - typename TBuffer::const_iterator bIt = this->m_Buffer.find( i ); - computed = ( bIt != this->m_Buffer.end( ) ); - res = ( computed )? bIt->second: res; + if( min_i[ d ] < in_index[ d ] ) min_i[ d ] = in_index[ d ]; + if( max_i[ d ] < in_index[ d ] ) max_i[ d ] = in_index[ d ]; + if( min_i[ d ] >= in_last[ d ] ) min_i[ d ] = in_last[ d ]; + if( max_i[ d ] >= in_last[ d ] ) max_i[ d ] = in_last[ d ]; - } // fi + size[ d ] = max_i[ d ] - min_i[ d ]; - if( !computed ) - res = this->_Evaluate( i ); + } // rof - if( this->m_BufferResults ) - this->m_Buffer[ i ] = res; - return( res ); - } + typename I::RegionType region; + region.SetIndex( min_i ); + region.SetSize( size ); - virtual TOutput EvaluateAtContinuousIndex( const TContIndex& i ) const + std::vector< typename TInertia::Pointer > inertias; + itk::ImageRegionConstIteratorWithIndex< I > it( image, region ); + for( it.GoToBegin( ); !it.IsAtEnd( ); ++it ) { - TPoint p; - this->GetInputImage( )->TransformContinuousIndexToPhysicalPoint( i, p ); - return( this->Evaluate( p ) ); - } + TOffset off = it.GetIndex( ) - idx; + unsigned long l1dist = std::abs( off[ 0 ] ); + for( unsigned int d = 1; d < I::ImageDimension; ++d ) + l1dist = ( std::abs( off[ d ] ) > l1dist )? std::abs( off[ d ] ): l1dist; - protected: - InertiaMedialness( ) - : Superclass( ), - m_BufferResults( false ), - m_MaxRadius( double( 1 ) ) - { - this->m_Buffer.clear( ); - } + typename TInertia::TPoint i_pnt; + image->TransformIndexToPhysicalPoint( it.GetIndex( ), i_pnt ); - virtual ~InertiaMedialness( ) - { - this->m_Buffer.clear( ); - } - - virtual TOutput _Evaluate( const TIndex& idx ) const - { - const I* image = this->GetInputImage( ); - - typename I::PointType p_i; - image->TransformIndexToPhysicalPoint( idx, p_i ); - - typename I::PointType max_p, min_p; - for( unsigned int d = 0; d < I::ImageDimension; ++d ) + for( unsigned long l = 0; l < l1dist; ++l ) { - max_p[ d ] = p_i[ d ] + this->m_MaxRadius; - min_p[ d ] = p_i[ d ] - this->m_MaxRadius; + if( inertias.size( ) <= l ) + inertias.push_back( TInertia::New( ) ); + inertias[ l ]->AddMass( i_pnt.GetVectorFromOrigin( ), S( it.Get( ) ) ); + + /* TODO + typename TInertias::iterator inIt = inertias.find( l ); + if( inIt == inertias.end( ) ) + inIt = inertias.insert( std::pair< unsigned long, typename TInertia::Pointer >( l, TInertia::New( ) ) ).first; + */ } // rof - TIndex max_i, min_i; - image->TransformPhysicalPointToIndex( max_p, max_i ); - image->TransformPhysicalPointToIndex( min_p, min_i ); - - typename I::RegionType in_region = image->GetRequestedRegion( ); - TIndex in_index = in_region.GetIndex( ); - TIndex in_last = in_index + in_region.GetSize( ); - typename I::SizeType size; - for( unsigned int d = 0; d < I::ImageDimension; ++d ) - { - if( min_i[ d ] < in_index[ d ] ) min_i[ d ] = in_index[ d ]; - if( max_i[ d ] < in_index[ d ] ) max_i[ d ] = in_index[ d ]; - if( min_i[ d ] >= in_last[ d ] ) min_i[ d ] = in_last[ d ]; - if( max_i[ d ] >= in_last[ d ] ) max_i[ d ] = in_last[ d ]; - size[ d ] = max_i[ d ] - min_i[ d ]; + } // rof - } // rof - - typename I::RegionType region; - region.SetIndex( min_i ); - region.SetSize( size ); - - std::vector< typename TInertia::Pointer > inertias; - itk::ImageRegionConstIteratorWithIndex< I > it( image, region ); - for( it.GoToBegin( ); !it.IsAtEnd( ); ++it ) + if( inertias.size( ) > 0 ) + { + S res = S( 0 ); + for( unsigned int l = 0; l < inertias.size( ); ++l ) { - TOffset off = it.GetIndex( ) - idx; - unsigned long l1dist = std::abs( off[ 0 ] ); - for( unsigned int d = 1; d < I::ImageDimension; ++d ) - l1dist = ( std::abs( off[ d ] ) > l1dist )? std::abs( off[ d ] ): l1dist; - - typename TInertia::TPoint i_pnt; - image->TransformIndexToPhysicalPoint( it.GetIndex( ), i_pnt ); - - for( unsigned long l = 0; l < l1dist; ++l ) - { - if( inertias.size( ) <= l ) - inertias.push_back( TInertia::New( ) ); - inertias[ l ]->AddMass( i_pnt.GetVectorFromOrigin( ), S( it.Get( ) ) ); - - /* TODO - typename TInertias::iterator inIt = inertias.find( l ); - if( inIt == inertias.end( ) ) - inIt = inertias.insert( std::pair< unsigned long, typename TInertia::Pointer >( l, TInertia::New( ) ) ).first; - */ - - } // rof + typename TInertia::TVector pv, r; + typename TInertia::TMatrix pm; + inertias[ l ]->GetEigenAnalysis( pm, pv, r ); + S v = pv.GetNorm( ); + if( l == 0 || v > res ) + res = v; } // rof - - if( inertias.size( ) > 0 ) - { - S res = S( 0 ); - for( unsigned int l = 0; l < inertias.size( ); ++l ) - { - typename TInertia::TVector pv, r; - typename TInertia::TMatrix pm; - inertias[ l ]->GetEigenAnalysis( pm, pv, r ); - S v = pv.GetNorm( ); - if( l == 0 || v > res ) - res = v; - - } // rof - return( res ); - } - else - return( TOutput( 0 ) ); + return( res ); } + else + return( TOutput( 0 ) ); + } - private: - // Purposely not implemented. - InertiaMedialness( const Self& ); - void operator=( const Self& ); + private: + // Purposely not implemented. + InertiaMedialness( const Self& ); + void operator=( const Self& ); - protected: - mutable TBuffer m_Buffer; - bool m_BufferResults; + protected: + mutable TBuffer m_Buffer; + bool m_BufferResults; - double m_MaxRadius; - }; + double m_MaxRadius; + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/InertiaTensorFunction.h b/lib/cpExtensions/Algorithms/InertiaTensorFunction.h index 0d088d8..de097a4 100644 --- a/lib/cpExtensions/Algorithms/InertiaTensorFunction.h +++ b/lib/cpExtensions/Algorithms/InertiaTensorFunction.h @@ -18,156 +18,156 @@ namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class S, unsigned int D > + class InertiaTensorFunction + : public itk::Object { - /** - */ - template< class S, unsigned int D > - class InertiaTensorFunction - : public itk::Object - { - public: - // Standard itk types - typedef InertiaTensorFunction Self; - typedef itk::Object Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef S TScalar; - typedef itk::Matrix< S, D, D > TMatrix; - typedef itk::Point< S, D > TPoint; - typedef typename TPoint::VectorType TVector; - - protected: - typedef TMatrix _TInternalMatrix; - typedef itk::Matrix< S, D, 1 > _TInternalVector; - - public: - itkNewMacro( Self ); - itkTypeMacro( InertiaTensorFunction, itkObject ); - - public: - inline void Reset( ) + public: + // Standard itk types + typedef InertiaTensorFunction Self; + typedef itk::Object Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef S TScalar; + typedef itk::Matrix< S, D, D > TMatrix; + typedef itk::Point< S, D > TPoint; + typedef typename TPoint::VectorType TVector; + + protected: + typedef TMatrix _TInternalMatrix; + typedef itk::Matrix< S, D, 1 > _TInternalVector; + + public: + itkNewMacro( Self ); + itkTypeMacro( InertiaTensorFunction, itkObject ); + + public: + inline void Reset( ) + { + this->m_M = S( 0 ); + this->m_MPP = S( 0 ); + this->m_MP.Fill( S( 0 ) ); + this->m_MPPT.Fill( S( 0 ) ); + this->Modified( ); + } + inline void AddMass( const TPoint& pnt, const S& mass = S( 1 ) ) + { + this->AddMass( pnt.GetVectorFromOrigin( ), mass ); + } + inline void AddMass( const S* data, const S& mass = S( 1 ) ) + { + this->AddMass( TVector( data ), mass ); + } + inline void AddMass( const TVector& vec, const S& mass = S( 1 ) ) + { + this->m_M += mass; + this->m_MPP += mass * ( vec * vec ); + + _TInternalVector mp; + for( unsigned int d = 0; d < D; ++d ) { - this->m_M = S( 0 ); - this->m_MPP = S( 0 ); - this->m_MP.Fill( S( 0 ) ); - this->m_MPPT.Fill( S( 0 ) ); - this->Modified( ); - } - inline void AddMass( const TPoint& pnt, const S& mass = S( 1 ) ) - { - this->AddMass( pnt.GetVectorFromOrigin( ), mass ); - } - inline void AddMass( const S* data, const S& mass = S( 1 ) ) + this->m_MP[ d ][ 0 ] += mass * vec[ d ]; + mp[ d ][ 0 ] = vec[ d ]; + + } // rof + this->m_MPPT += + _TInternalMatrix( mp.GetVnlMatrix( ) * mp.GetTranspose( ) ) * + mass; + } + + inline S GetMass( ) const + { + return( this->m_M ); + } + + inline TMatrix GetInertia( ) const + { + TMatrix I; + if( S( 0 ) < this->m_M ) { - this->AddMass( TVector( data ), mass ); + I.SetIdentity( ); + I *= this->m_MPP - ( ( this->m_MP.GetTranspose( ) * this->m_MP.GetVnlMatrix( ) )[ 0 ][ 0 ] / this->m_M ); + I -= this->m_MPPT; + I += TMatrix( this->m_MP.GetVnlMatrix( ) * this->m_MP.GetTranspose( ) ) / this->m_M; } - inline void AddMass( const TVector& vec, const S& mass = S( 1 ) ) + else + I.Fill( S( 0 ) ); + return( I ); + } + + inline TVector GetCenterOfGravity( ) const + { + TVector cog; + if( S( 0 ) < this->m_M ) { - this->m_M += mass; - this->m_MPP += mass * ( vec * vec ); - - _TInternalVector mp; for( unsigned int d = 0; d < D; ++d ) - { - this->m_MP[ d ][ 0 ] += mass * vec[ d ]; - mp[ d ][ 0 ] = vec[ d ]; - - } // rof - this->m_MPPT += - _TInternalMatrix( mp.GetVnlMatrix( ) * mp.GetTranspose( ) ) * - mass; + cog[ d ] = this->m_MP[ d ][ 0 ] / this->m_M; } - - inline S GetMass( ) const + else + cog.Fill( S( 0 ) ); + return( cog ); + } + + inline void GetEigenAnalysis( TMatrix& pm, TVector& pv, TVector& r ) const + { + TMatrix I = this->GetInertia( ); + + itk::SymmetricEigenAnalysis< TMatrix, TVector, TMatrix > eigen; + eigen.SetDimension( D ); + eigen.SetOrderEigenMagnitudes( true ); + eigen.SetOrderEigenValues( 1 ); + eigen.ComputeEigenValuesAndVectors( I, pv, pm ); + pm = TMatrix( pm.GetTranspose( ) ); + S det = vnl_determinant( pm.GetVnlMatrix( ) ); + for( unsigned int d = 0; d < D; ++d ) + pm[ d ][ D - 1 ] *= det; + + if( D == 2 ) { - return( this->m_M ); + S coeff = S( 4 ) / this->m_M; + r[ 0 ] = std::sqrt( std::fabs( coeff * pv[ 1 ] ) ); + r[ 1 ] = std::sqrt( std::fabs( coeff * pv[ 0 ] ) ); } - - inline TMatrix GetInertia( ) const + else if( D == 3 ) { - TMatrix I; - if( S( 0 ) < this->m_M ) - { - I.SetIdentity( ); - I *= this->m_MPP - ( ( this->m_MP.GetTranspose( ) * this->m_MP.GetVnlMatrix( ) )[ 0 ][ 0 ] / this->m_M ); - I -= this->m_MPPT; - I += TMatrix( this->m_MP.GetVnlMatrix( ) * this->m_MP.GetTranspose( ) ) / this->m_M; - } - else - I.Fill( S( 0 ) ); - return( I ); + S coeff = S( 2.5 ) / this->m_M; + r[ 0 ] = std::sqrt( std::fabs( coeff * ( pv[ 1 ] + pv[ 2 ] - pv[ 0 ] ) ) ); + r[ 1 ] = std::sqrt( std::fabs( coeff * ( pv[ 0 ] + pv[ 2 ] - pv[ 1 ] ) ) ); + r[ 2 ] = std::sqrt( std::fabs( coeff * ( pv[ 0 ] + pv[ 1 ] - pv[ 2 ] ) ) ); } - - inline TVector GetCenterOfGravity( ) const - { - TVector cog; - if( S( 0 ) < this->m_M ) - { - for( unsigned int d = 0; d < D; ++d ) - cog[ d ] = this->m_MP[ d ][ 0 ] / this->m_M; - } - else - cog.Fill( S( 0 ) ); - return( cog ); - } - - inline void GetEigenAnalysis( TMatrix& pm, TVector& pv, TVector& r ) const - { - TMatrix I = this->GetInertia( ); - - itk::SymmetricEigenAnalysis< TMatrix, TVector, TMatrix > eigen; - eigen.SetDimension( D ); - eigen.SetOrderEigenMagnitudes( true ); - eigen.SetOrderEigenValues( 1 ); - eigen.ComputeEigenValuesAndVectors( I, pv, pm ); - pm = TMatrix( pm.GetTranspose( ) ); - S det = vnl_determinant( pm.GetVnlMatrix( ) ); - for( unsigned int d = 0; d < D; ++d ) - pm[ d ][ D - 1 ] *= det; - - if( D == 2 ) - { - S coeff = S( 4 ) / this->m_M; - r[ 0 ] = std::sqrt( std::fabs( coeff * pv[ 1 ] ) ); - r[ 1 ] = std::sqrt( std::fabs( coeff * pv[ 0 ] ) ); - } - else if( D == 3 ) - { - S coeff = S( 2.5 ) / this->m_M; - r[ 0 ] = std::sqrt( std::fabs( coeff * ( pv[ 1 ] + pv[ 2 ] - pv[ 0 ] ) ) ); - r[ 1 ] = std::sqrt( std::fabs( coeff * ( pv[ 0 ] + pv[ 2 ] - pv[ 1 ] ) ) ); - r[ 2 ] = std::sqrt( std::fabs( coeff * ( pv[ 0 ] + pv[ 1 ] - pv[ 2 ] ) ) ); - } - else - r.Fill( S( 0 ) ); - } - - protected: - InertiaTensorFunction( ) - : Superclass( ) - { - this->Reset( ); - } - virtual ~InertiaTensorFunction( ) - { - } - - private: - // Purposely not implemented. - InertiaTensorFunction( const Self& ); - void operator=( const Self& ); - - protected: - S m_M; - S m_MPP; - _TInternalVector m_MP; - _TInternalMatrix m_MPPT; - }; - - } // ecapseman + else + r.Fill( S( 0 ) ); + } + + protected: + InertiaTensorFunction( ) + : Superclass( ) + { + this->Reset( ); + } + virtual ~InertiaTensorFunction( ) + { + } + + private: + // Purposely not implemented. + InertiaTensorFunction( const Self& ); + void operator=( const Self& ); + + protected: + S m_M; + S m_MPP; + _TInternalVector m_MP; + _TInternalMatrix m_MPPT; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/IsoImageSlicer.h b/lib/cpExtensions/Algorithms/IsoImageSlicer.h index 9479d34..2582cf9 100644 --- a/lib/cpExtensions/Algorithms/IsoImageSlicer.h +++ b/lib/cpExtensions/Algorithms/IsoImageSlicer.h @@ -15,127 +15,127 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class R, class I > + class BaseImageSlicer + : public itk::ImageToImageFilter< typename R::InputImageType, itk::Image< typename R::InputImageType::PixelType, R::ImageDimension - 1 > > { - /** - */ - template< class R, class I > - class BaseImageSlicer - : public itk::ImageToImageFilter< typename R::InputImageType, itk::Image< typename R::InputImageType::PixelType, R::ImageDimension - 1 > > + public: + // Basic types + typedef BaseImageSlicer Self; + typedef R TSlicer; + typedef I TInterpolateFunction; + typedef typename R::InputImageType TImage; + typedef typename I::CoordRepType TScalar; + typedef typename TImage::PixelType TPixel; + enum { - public: - // Basic types - typedef BaseImageSlicer Self; - typedef R TSlicer; - typedef I TInterpolateFunction; - typedef typename R::InputImageType TImage; - typedef typename I::CoordRepType TScalar; - typedef typename TImage::PixelType TPixel; - enum - { - Dim = TImage::ImageDimension, - SliceDim = TImage::ImageDimension - 1 - }; - typedef itk::Image< TPixel, Self::SliceDim > TSliceImage; - - // itk types - typedef itk::ImageToImageFilter< TImage, TSliceImage > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - // Internal filters - typedef itk::ExtractImageFilter< TImage, TSliceImage > TCollapsor; - - // Various types - typedef typename TImage::IndexType TIndex; - typedef typename TImage::RegionType TRegion; - typedef typename TImage::SizeType TSize; - typedef typename TImage::SpacingType TSpacing; - typedef typename TSpacing::ValueType TSpacingValue; - - typedef itk::AffineTransform< TScalar, Self::Dim > TTransform; - typedef typename TTransform::MatrixType TMatrix; - typedef typename TTransform::OffsetType TVector; - - public: - itkNewMacro( Self ); - itkTypeMacro( BaseImageSlicer, itkImageToImageFilter ); - - itkBooleanMacro( SizeFromMaximum ); - itkBooleanMacro( SizeFromMinimum ); - itkBooleanMacro( SpacingFromMaximum ); - itkBooleanMacro( SpacingFromMinimum ); - - itkGetConstObjectMacro( Transform, TTransform ); - itkGetConstMacro( DefaultValue, TPixel ); - itkGetConstMacro( Size, TVector ); - itkGetConstMacro( SizeFromMaximum, bool ); - itkGetConstMacro( SizeFromMinimum, bool ); - itkGetConstMacro( Spacing, TSpacingValue ); - itkGetConstMacro( SpacingFromMaximum, bool ); - itkGetConstMacro( SpacingFromMinimum, bool ); - - itkSetObjectMacro( Transform, TTransform ); - itkSetMacro( Size, TVector ); - itkSetMacro( DefaultValue, TPixel ); - itkSetMacro( SizeFromMaximum, bool ); - itkSetMacro( SizeFromMinimum, bool ); - itkSetMacro( Spacing, TSpacingValue ); - itkSetMacro( SpacingFromMaximum, bool ); - itkSetMacro( SpacingFromMinimum, bool ); - - public: - virtual unsigned long GetMTime( ) const; - - const TInterpolateFunction* GetInterpolator( ) const; - const TMatrix& GetRotation( ) const; - const TVector& GetTranslation( ) const; - - void SetInterpolator( TInterpolateFunction* f ); - - template< class M > + Dim = TImage::ImageDimension, + SliceDim = TImage::ImageDimension - 1 + }; + typedef itk::Image< TPixel, Self::SliceDim > TSliceImage; + + // itk types + typedef itk::ImageToImageFilter< TImage, TSliceImage > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + // Internal filters + typedef itk::ExtractImageFilter< TImage, TSliceImage > TCollapsor; + + // Various types + typedef typename TImage::IndexType TIndex; + typedef typename TImage::RegionType TRegion; + typedef typename TImage::SizeType TSize; + typedef typename TImage::SpacingType TSpacing; + typedef typename TSpacing::ValueType TSpacingValue; + + typedef itk::AffineTransform< TScalar, Self::Dim > TTransform; + typedef typename TTransform::MatrixType TMatrix; + typedef typename TTransform::OffsetType TVector; + + public: + itkNewMacro( Self ); + itkTypeMacro( BaseImageSlicer, itkImageToImageFilter ); + + itkBooleanMacro( SizeFromMaximum ); + itkBooleanMacro( SizeFromMinimum ); + itkBooleanMacro( SpacingFromMaximum ); + itkBooleanMacro( SpacingFromMinimum ); + + itkGetConstObjectMacro( Transform, TTransform ); + itkGetConstMacro( DefaultValue, TPixel ); + itkGetConstMacro( Size, TVector ); + itkGetConstMacro( SizeFromMaximum, bool ); + itkGetConstMacro( SizeFromMinimum, bool ); + itkGetConstMacro( Spacing, TSpacingValue ); + itkGetConstMacro( SpacingFromMaximum, bool ); + itkGetConstMacro( SpacingFromMinimum, bool ); + + itkSetObjectMacro( Transform, TTransform ); + itkSetMacro( Size, TVector ); + itkSetMacro( DefaultValue, TPixel ); + itkSetMacro( SizeFromMaximum, bool ); + itkSetMacro( SizeFromMinimum, bool ); + itkSetMacro( Spacing, TSpacingValue ); + itkSetMacro( SpacingFromMaximum, bool ); + itkSetMacro( SpacingFromMinimum, bool ); + + public: + virtual unsigned long GetMTime( ) const; + + const TInterpolateFunction* GetInterpolator( ) const; + const TMatrix& GetRotation( ) const; + const TVector& GetTranslation( ) const; + + void SetInterpolator( TInterpolateFunction* f ); + + template< class M > void SetRotation( const M& r ); - template< class V > + template< class V > void SetTranslation( const V& t ); - void SetSize( TScalar s ); + void SetSize( TScalar s ); - protected: - BaseImageSlicer( ); - virtual ~BaseImageSlicer( ); + protected: + BaseImageSlicer( ); + virtual ~BaseImageSlicer( ); - virtual void GenerateOutputInformation( ); // TODO { } - virtual void GenerateInputRequestedRegion( ); - virtual void GenerateData( ); + virtual void GenerateOutputInformation( ); // TODO { } + virtual void GenerateInputRequestedRegion( ); + virtual void GenerateData( ); - private: - // Purposely not implemented - BaseImageSlicer( const Self& ); - void operator=( const Self& ); + private: + // Purposely not implemented + BaseImageSlicer( const Self& ); + void operator=( const Self& ); - protected: - typename TSlicer::Pointer m_Slicer; - typename TCollapsor::Pointer m_Collapsor; - typename TTransform::Pointer m_Transform; + protected: + typename TSlicer::Pointer m_Slicer; + typename TCollapsor::Pointer m_Collapsor; + typename TTransform::Pointer m_Transform; - TPixel m_DefaultValue; + TPixel m_DefaultValue; - TVector m_Size; - bool m_SizeFromMaximum; - bool m_SizeFromMinimum; - - TSpacingValue m_Spacing; - bool m_SpacingFromMaximum; - bool m_SpacingFromMinimum; - }; + TVector m_Size; + bool m_SizeFromMaximum; + bool m_SizeFromMinimum; - } // ecapseman + TSpacingValue m_Spacing; + bool m_SpacingFromMaximum; + bool m_SpacingFromMinimum; + }; } // ecapseman } // ecapseman +} // ecapseman + // ------------------------------------------------------------------------- #define CPPLUGINS_DEFINE_ISOIMAGESLICER( name, R, F ) \ template< class I, class S = double > \ @@ -177,7 +177,7 @@ namespace cpPlugins } // ecapseman -} // ecapseman + } // ecapseman #include diff --git a/lib/cpExtensions/Algorithms/IterativeGaussianModelEstimator.h b/lib/cpExtensions/Algorithms/IterativeGaussianModelEstimator.h index aa8e668..8a30510 100644 --- a/lib/cpExtensions/Algorithms/IterativeGaussianModelEstimator.h +++ b/lib/cpExtensions/Algorithms/IterativeGaussianModelEstimator.h @@ -11,94 +11,94 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class S, unsigned int D > + class IterativeGaussianModelEstimator + : public itk::Object { - /** - */ - template< class S, unsigned int D > - class IterativeGaussianModelEstimator - : public itk::Object - { - public: - typedef IterativeGaussianModelEstimator Self; - typedef itk::Object Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef S TScalar; - itkStaticConstMacro( Dimension, unsigned int, D ); - - // Begin concept checking + public: + typedef IterativeGaussianModelEstimator Self; + typedef itk::Object Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef S TScalar; + itkStaticConstMacro( Dimension, unsigned int, D ); + + // Begin concept checking #ifdef ITK_USE_CONCEPT_CHECKING - itkConceptMacro( - ScalarTypeHasFloatResolution, - ( itk::Concept::IsFloatingPoint< S > ) - ); + itkConceptMacro( + ScalarTypeHasFloatResolution, + ( itk::Concept::IsFloatingPoint< S > ) + ); #endif - // End concept checking + // End concept checking - typedef vnl_matrix< S > TMatrix; - typedef std::vector< TMatrix > TMatrices; + typedef vnl_matrix< S > TMatrix; + typedef std::vector< TMatrix > TMatrices; - public: - itkNewMacro( Self ); - itkTypeMacro( IterativeGaussianModelEstimator, itkObject ); + public: + itkNewMacro( Self ); + itkTypeMacro( IterativeGaussianModelEstimator, itkObject ); - public: - unsigned long GetNumberOfSamples( ) const - { return( ( unsigned long )( this->m_N ) ); } - const TMatrix& GetMu( ) const - { return( this->m_M ); } - const TMatrix& GetOmega( ) const - { return( this->m_O ); } + public: + unsigned long GetNumberOfSamples( ) const + { return( ( unsigned long )( this->m_N ) ); } + const TMatrix& GetMu( ) const + { return( this->m_M ); } + const TMatrix& GetOmega( ) const + { return( this->m_O ); } - void SetNumberOfSamples( unsigned long n ); - void SetMu( const TMatrix& m ); - void SetOmega( const TMatrix& O ); + void SetNumberOfSamples( unsigned long n ); + void SetMu( const TMatrix& m ); + void SetOmega( const TMatrix& O ); - bool SaveModelToFile( const std::string& filename ) const; - bool LoadModelFromFile( const std::string& filename ); + bool SaveModelToFile( const std::string& filename ) const; + bool LoadModelFromFile( const std::string& filename ); - template< class V > - S Probability( const V& sample ) const; + template< class V > + S Probability( const V& sample ) const; - S Probability( const S& s_x, const S& s_y, ... ) const; + S Probability( const S& s_x, const S& s_y, ... ) const; - template< class V, class M > - void GetModel( V& m, M& E ) const; + template< class V, class M > + void GetModel( V& m, M& E ) const; - void Clear( ); + void Clear( ); - template< class V > - void AddSample( const V& sample ); + template< class V > + void AddSample( const V& sample ); - void AddSample( const S& s_x, const S& s_y, ... ); + void AddSample( const S& s_x, const S& s_y, ... ); - protected: - IterativeGaussianModelEstimator( ); - virtual ~IterativeGaussianModelEstimator( ); + protected: + IterativeGaussianModelEstimator( ); + virtual ~IterativeGaussianModelEstimator( ); - protected: - void _UpdateModel( ) const; + protected: + void _UpdateModel( ) const; - private: - // Purposely not implemented - IterativeGaussianModelEstimator( const Self& other ); - void operator=( const Self& other ); + private: + // Purposely not implemented + IterativeGaussianModelEstimator( const Self& other ); + void operator=( const Self& other ); - protected: - S m_N; - TMatrix m_M; - TMatrix m_O; + protected: + S m_N; + TMatrix m_M; + TMatrix m_O; - mutable bool m_Updated; - mutable TMatrix m_Cov; - mutable TMatrix m_Inv; - mutable S m_Norm; - }; + mutable bool m_Updated; + mutable TMatrix m_Cov; + mutable TMatrix m_Inv; + mutable S m_Norm; + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/KalmanConstantFilter.h b/lib/cpExtensions/Algorithms/KalmanConstantFilter.h index 76fb1b4..e9d0192 100644 --- a/lib/cpExtensions/Algorithms/KalmanConstantFilter.h +++ b/lib/cpExtensions/Algorithms/KalmanConstantFilter.h @@ -8,46 +8,46 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< typename T > + class cpExtensions_EXPORT KalmanConstantFilter + : public KalmanFilter< T > { - /** - */ - template< typename T > - class cpExtensions_EXPORT KalmanConstantFilter - : public KalmanFilter< T > - { - public: - typedef KalmanConstantFilter Self; - typedef KalmanFilter< T > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TScalar TScalar; - typedef typename Superclass::TMatrix TMatrix; - typedef typename Superclass::TVector TVector; - - public: - itkNewMacro( Self ); - itkTypeMacro( KalmanConstantFilter, KalmanFilter ); - - public: - void Configure( unsigned int m ); - - /// Iteration methods + public: + typedef KalmanConstantFilter Self; + typedef KalmanFilter< T > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef typename Superclass::TScalar TScalar; + typedef typename Superclass::TMatrix TMatrix; + typedef typename Superclass::TVector TVector; + + public: + itkNewMacro( Self ); + itkTypeMacro( KalmanConstantFilter, KalmanFilter ); + + public: + void Configure( unsigned int m ); + + /// Iteration methods virtual void Initialize( ); - protected: + protected: KalmanConstantFilter( ); virtual ~KalmanConstantFilter( ); - private: + private: // Purposely not implemented. KalmanConstantFilter( const Self& ); void operator=( const Self& ); - }; + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/KalmanFilter.h b/lib/cpExtensions/Algorithms/KalmanFilter.h index de6090f..a96c620 100644 --- a/lib/cpExtensions/Algorithms/KalmanFilter.h +++ b/lib/cpExtensions/Algorithms/KalmanFilter.h @@ -13,8 +13,8 @@ #include // ------------------------------------------------------------------------- -#define kalmanGetSetMacro( type, name ) \ - itkGetConstMacro( name, type ); \ +#define kalmanGetSetMacro( type, name ) \ + itkGetConstMacro( name, type ); \ itkSetMacro( name, type ); // ------------------------------------------------------------------------- @@ -48,119 +48,119 @@ kalmanSetVectorMacro( var, name ); namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + * Abstract class implementing the classical kalman filter. See + * http://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf + * for a description of this algorithm. + */ + template< typename T > + class cpExtensions_EXPORT KalmanFilter + : public itk::Object { - /** - * Abstract class implementing the classical kalman filter. See - * http://www.cs.unc.edu/~welch/media/pdf/kalman_intro.pdf - * for a description of this algorithm. - */ - template< typename T > - class cpExtensions_EXPORT KalmanFilter - : public itk::Object - { - public: - typedef KalmanFilter Self; - typedef itk::Object Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; + public: + typedef KalmanFilter Self; + typedef itk::Object Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; - // Template parameters types - typedef T TScalar; + // Template parameters types + typedef T TScalar; - // VNL types - typedef vnl_matrix< TScalar > TMatrix; - typedef vnl_vector< TScalar > TVector; + // VNL types + typedef vnl_matrix< TScalar > TMatrix; + typedef vnl_vector< TScalar > TVector; - // stage identificators - enum - { - StPred, - StInno, - StFilt - }; - - public: - itkNewMacro( Self ); - itkTypeMacro( KalmanFilter, itkObject ); - - // Values - itkGetConstMacro( StateSize, unsigned int ); - itkGetConstMacro( InputSize, unsigned int ); - itkGetConstMacro( MeasureSize, unsigned int ); - - // Matrices - kalmanGetSetMacro( TMatrix, A ); - kalmanGetSetMacro( TMatrix, B ); - kalmanGetSetMacro( TMatrix, H ); - kalmanGetSetMacro( TMatrix, Q ); - kalmanGetSetMacro( TMatrix, R ); - kalmanGetSetMacro( TMatrix, P0 ); - kalmanGetSetMacro( TMatrix, K ); - kalmanGetSetMacro( TMatrix, Pm ); - kalmanGetSetMacro( TMatrix, Pp ); - - // Vectors - kalmanGetSetMacro( TVector, x0 ); - kalmanGetSetMacro( TVector, u ); - kalmanGetSetMacro( TVector, m ); - kalmanGetSetMacro( TVector, xm ); - kalmanGetSetMacro( TVector, xp ); - - // Human-readable matrices - kalmanGetSetMatrixMacro( A, TransitionMatrix ); - kalmanGetSetMatrixMacro( B, InputControlMatrix ); - kalmanGetSetMatrixMacro( H, MeasureMatrix ); - kalmanGetSetMatrixMacro( Q, ProcessNoise ); - kalmanGetSetMatrixMacro( R, MeasureNoise ); - kalmanGetSetMatrixMacro( P0, InitialNoise ); - kalmanGetSetMatrixMacro( K, Gain ); - kalmanGetSetMatrixMacro( Pm, APrioriNoise ); - kalmanGetSetMatrixMacro( Pp, APosterioriNoise ); - - // Human-readable vectors - kalmanGetSetVectorMacro( x0, InitialState ); - kalmanGetSetVectorMacro( u, Input ); - kalmanGetSetVectorMacro( m, Measure ); - kalmanGetSetVectorMacro( xm, APrioriState ); - kalmanGetSetVectorMacro( xp, APosterioriState ); - - public: - - void Configure( unsigned int s, unsigned int i, unsigned int m ); - - /// Iteration methods + // stage identificators + enum + { + StPred, + StInno, + StFilt + }; + + public: + itkNewMacro( Self ); + itkTypeMacro( KalmanFilter, itkObject ); + + // Values + itkGetConstMacro( StateSize, unsigned int ); + itkGetConstMacro( InputSize, unsigned int ); + itkGetConstMacro( MeasureSize, unsigned int ); + + // Matrices + kalmanGetSetMacro( TMatrix, A ); + kalmanGetSetMacro( TMatrix, B ); + kalmanGetSetMacro( TMatrix, H ); + kalmanGetSetMacro( TMatrix, Q ); + kalmanGetSetMacro( TMatrix, R ); + kalmanGetSetMacro( TMatrix, P0 ); + kalmanGetSetMacro( TMatrix, K ); + kalmanGetSetMacro( TMatrix, Pm ); + kalmanGetSetMacro( TMatrix, Pp ); + + // Vectors + kalmanGetSetMacro( TVector, x0 ); + kalmanGetSetMacro( TVector, u ); + kalmanGetSetMacro( TVector, m ); + kalmanGetSetMacro( TVector, xm ); + kalmanGetSetMacro( TVector, xp ); + + // Human-readable matrices + kalmanGetSetMatrixMacro( A, TransitionMatrix ); + kalmanGetSetMatrixMacro( B, InputControlMatrix ); + kalmanGetSetMatrixMacro( H, MeasureMatrix ); + kalmanGetSetMatrixMacro( Q, ProcessNoise ); + kalmanGetSetMatrixMacro( R, MeasureNoise ); + kalmanGetSetMatrixMacro( P0, InitialNoise ); + kalmanGetSetMatrixMacro( K, Gain ); + kalmanGetSetMatrixMacro( Pm, APrioriNoise ); + kalmanGetSetMatrixMacro( Pp, APosterioriNoise ); + + // Human-readable vectors + kalmanGetSetVectorMacro( x0, InitialState ); + kalmanGetSetVectorMacro( u, Input ); + kalmanGetSetVectorMacro( m, Measure ); + kalmanGetSetVectorMacro( xm, APrioriState ); + kalmanGetSetVectorMacro( xp, APosterioriState ); + + public: + + void Configure( unsigned int s, unsigned int i, unsigned int m ); + + /// Iteration methods virtual void Initialize( ); virtual void Predict( ); virtual void Innovate( ); virtual void Filtrate( ); virtual void OneStep( ) - { - this->Predict( ); - this->Innovate( ); - this->Filtrate( ); - } + { + this->Predict( ); + this->Innovate( ); + this->Filtrate( ); + } virtual void NSteps( unsigned int n ) - { - for( unsigned int i = 0; i < n; i++ ) - this->OneStep( ); - } + { + for( unsigned int i = 0; i < n; i++ ) + this->OneStep( ); + } unsigned int CurrentIteration( ) const - { return( this->m_I ); } + { return( this->m_I ); } unsigned char CurrentStep( ) const - { return( this->m_Step ); } + { return( this->m_Step ); } - protected: + protected: KalmanFilter( ); virtual ~KalmanFilter( ); - private: + private: // Purposely not implemented KalmanFilter( const Self& ); void operator=( const Self& ); - protected: + protected: // Filter dimensions unsigned int m_StateSize; unsigned int m_InputSize; @@ -168,41 +168,41 @@ namespace cpExtensions // Transition matrices TMatrix m_A; /// Transition - TMatrix m_B; /// Input control - TMatrix m_H; /// Measure - TMatrix m_Id; /// Identity matrix - - // Noise matrices - TMatrix m_Q; /// Process noise covariance - TMatrix m_R; /// Measure noise covariance - - // Initial values - TVector m_x0; /// Initial state - TMatrix m_P0; /// Initial error covariance - - // Loop vectors - TVector m_u; /// Last real input - TVector m_m; /// Last real measure - TVector m_xm; /// A priori state - TVector m_xp; /// A posteriori state - - // Loop matrices - TMatrix m_K; /// kalman gain - TMatrix m_Pm; /// A priori error - TMatrix m_Pp; /// A posteriori error - - // Loop values - unsigned int m_I; /// Current iteration - unsigned char m_Step; /// Current step within current iteration - - // ----------------------------------------------------------------- - // Classic kronecker product operator - // ----------------------------------------------------------------- - template< class M > - static void Kronecker( M& AkB, const M& A, const M& B ); - }; - - } // ecapseman + TMatrix m_B; /// Input control + TMatrix m_H; /// Measure + TMatrix m_Id; /// Identity matrix + + // Noise matrices + TMatrix m_Q; /// Process noise covariance + TMatrix m_R; /// Measure noise covariance + + // Initial values + TVector m_x0; /// Initial state + TMatrix m_P0; /// Initial error covariance + + // Loop vectors + TVector m_u; /// Last real input + TVector m_m; /// Last real measure + TVector m_xm; /// A priori state + TVector m_xp; /// A posteriori state + + // Loop matrices + TMatrix m_K; /// kalman gain + TMatrix m_Pm; /// A priori error + TMatrix m_Pp; /// A posteriori error + + // Loop values + unsigned int m_I; /// Current iteration + unsigned char m_Step; /// Current step within current iteration + + // ----------------------------------------------------------------- + // Classic kronecker product operator + // ----------------------------------------------------------------- + template< class M > + static void Kronecker( M& AkB, const M& A, const M& B ); + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/KalmanVelocityFilter.h b/lib/cpExtensions/Algorithms/KalmanVelocityFilter.h index 5dd3f56..2055420 100644 --- a/lib/cpExtensions/Algorithms/KalmanVelocityFilter.h +++ b/lib/cpExtensions/Algorithms/KalmanVelocityFilter.h @@ -8,56 +8,56 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< typename T > + class cpExtensions_EXPORT KalmanVelocityFilter + : public KalmanFilter< T > { - /** - */ - template< typename T > - class cpExtensions_EXPORT KalmanVelocityFilter - : public KalmanFilter< T > - { - public: - typedef KalmanVelocityFilter Self; - typedef KalmanFilter< T > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::TScalar TScalar; - typedef typename Superclass::TMatrix TMatrix; - typedef typename Superclass::TVector TVector; - - public: - itkNewMacro( Self ); - itkTypeMacro( KalmanVelocityFilter, KalmanFilter ); - - kalmanGetSetMacro( TMatrix, Sigma ); - kalmanGetSetMatrixMacro( Sigma, AccelerationNoise ); - - public: - void Configure( unsigned int m ); - - TScalar GetTimeOffset( ) const; - void SetTimeOffset( TScalar t ); - - /// Iteration methods + public: + typedef KalmanVelocityFilter Self; + typedef KalmanFilter< T > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef typename Superclass::TScalar TScalar; + typedef typename Superclass::TMatrix TMatrix; + typedef typename Superclass::TVector TVector; + + public: + itkNewMacro( Self ); + itkTypeMacro( KalmanVelocityFilter, KalmanFilter ); + + kalmanGetSetMacro( TMatrix, Sigma ); + kalmanGetSetMatrixMacro( Sigma, AccelerationNoise ); + + public: + void Configure( unsigned int m ); + + TScalar GetTimeOffset( ) const; + void SetTimeOffset( TScalar t ); + + /// Iteration methods virtual void Initialize( ); - protected: + protected: KalmanVelocityFilter( ); virtual ~KalmanVelocityFilter( ); - private: + private: // Purposely not implemented. KalmanVelocityFilter( const Self& ); void operator=( const Self& ); - protected: + protected: TMatrix m_TimeOffset; TMatrix m_Sigma; - }; + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/LightCompensationFilter.h b/lib/cpExtensions/Algorithms/LightCompensationFilter.h index 36f8da5..d219c7d 100644 --- a/lib/cpExtensions/Algorithms/LightCompensationFilter.h +++ b/lib/cpExtensions/Algorithms/LightCompensationFilter.h @@ -9,48 +9,48 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class I > + class LightCompensationFilter + : public itk::InPlaceImageFilter< I, I > { - /** - */ - template< class I > - class LightCompensationFilter - : public itk::InPlaceImageFilter< I, I > - { - public: - typedef LightCompensationFilter Self; - typedef itk::InPlaceImageFilter< I, I > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef I TImage; - typedef typename I::RegionType TRegion; - - typedef cpExtensions::Algorithms::ParallelImageMean< I > TMeanCalculator; - typedef typename TMeanCalculator::TMean TMean; - - public: - itkNewMacro( Self ); - itkTypeMacro( LightCompensationFilter, itkInPlaceImageFilter ); - - itkGetConstMacro( Mean, TMean ); - - protected: - LightCompensationFilter( ); - virtual ~LightCompensationFilter( ); - - private: - virtual void BeforeThreadedGenerateData( ); - virtual void ThreadedGenerateData( - const TRegion& region, itk::ThreadIdType id - ); - virtual void AfterThreadedGenerateData( ); - - protected: - TMean m_Mean; - TMean m_Coefficient; - }; + public: + typedef LightCompensationFilter Self; + typedef itk::InPlaceImageFilter< I, I > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef I TImage; + typedef typename I::RegionType TRegion; + + typedef cpExtensions::Algorithms::ParallelImageMean< I > TMeanCalculator; + typedef typename TMeanCalculator::TMean TMean; + + public: + itkNewMacro( Self ); + itkTypeMacro( LightCompensationFilter, itkInPlaceImageFilter ); + + itkGetConstMacro( Mean, TMean ); + + protected: + LightCompensationFilter( ); + virtual ~LightCompensationFilter( ); + + private: + virtual void BeforeThreadedGenerateData( ); + virtual void ThreadedGenerateData( + const TRegion& region, itk::ThreadIdType id + ); + virtual void AfterThreadedGenerateData( ); + + protected: + TMean m_Mean; + TMean m_Coefficient; + }; } // ecapseman diff --git a/lib/cpExtensions/Algorithms/MultiScaleGaussianImageFilter.h b/lib/cpExtensions/Algorithms/MultiScaleGaussianImageFilter.h index 2ad1b50..079d9d4 100644 --- a/lib/cpExtensions/Algorithms/MultiScaleGaussianImageFilter.h +++ b/lib/cpExtensions/Algorithms/MultiScaleGaussianImageFilter.h @@ -9,85 +9,85 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class I, class O > + class MultiScaleGaussianImageFilter + : public itk::ImageToImageFilter< I, O > { + public: + typedef MultiScaleGaussianImageFilter Self; + typedef itk::ImageToImageFilter< I, O > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef I TInputImage; + typedef O TOutputImage; + + typedef std::set< double > TScalesContainer; + + enum FilterId + { + Gradient = 0, + GradientMagnitude, + Hessian, + None + }; + + protected: /** */ - template< class I, class O > - class MultiScaleGaussianImageFilter - : public itk::ImageToImageFilter< I, O > + class _Greater { public: - typedef MultiScaleGaussianImageFilter Self; - typedef itk::ImageToImageFilter< I, O > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef I TInputImage; - typedef O TOutputImage; - - typedef std::set< double > TScalesContainer; - - enum FilterId - { - Gradient = 0, - GradientMagnitude, - Hessian, - None - }; - - protected: - /** - */ - class _Greater - { - public: - typedef typename O::PixelType _T; - - public: - _Greater( ); - virtual ~_Greater( ); - bool operator!=( const _Greater& b ) const; - bool operator==( const _Greater& b ) const; - inline _T operator()( const _T& a ) const; - inline _T operator()( const _T& a, const _T& b ) const; - }; + typedef typename O::PixelType _T; public: - itkNewMacro( Self ); - itkTypeMacro( MultiScaleGaussianImageFilter, itkImageToImageFilter ); + _Greater( ); + virtual ~_Greater( ); + bool operator!=( const _Greater& b ) const; + bool operator==( const _Greater& b ) const; + inline _T operator()( const _T& a ) const; + inline _T operator()( const _T& a, const _T& b ) const; + }; - public: - void SetFilterToGradient( ); - void SetFilterToGradientMagnitude( ); - void SetFilterToHessian( ); + public: + itkNewMacro( Self ); + itkTypeMacro( MultiScaleGaussianImageFilter, itkImageToImageFilter ); - bool IsGradientFilter( ) const; - bool IsGradientMagnitudeFilter( ) const; - bool IsHessianFilter( ) const; + public: + void SetFilterToGradient( ); + void SetFilterToGradientMagnitude( ); + void SetFilterToHessian( ); - void AddScale( const double& s ); - unsigned long GetNumberOfScales( ) const; + bool IsGradientFilter( ) const; + bool IsGradientMagnitudeFilter( ) const; + bool IsHessianFilter( ) const; - protected: - MultiScaleGaussianImageFilter( ); - virtual ~MultiScaleGaussianImageFilter( ); + void AddScale( const double& s ); + unsigned long GetNumberOfScales( ) const; - virtual void GenerateData( ); + protected: + MultiScaleGaussianImageFilter( ); + virtual ~MultiScaleGaussianImageFilter( ); - template< class F > - void _GenerateData( ); + virtual void GenerateData( ); - private: - // Purposely not implemented. - MultiScaleGaussianImageFilter( const Self& ); - void operator=( const Self& ); + template< class F > + void _GenerateData( ); - protected: - TScalesContainer m_Scales; - FilterId m_FilterId; - }; + private: + // Purposely not implemented. + MultiScaleGaussianImageFilter( const Self& ); + void operator=( const Self& ); + + protected: + TScalesContainer m_Scales; + FilterId m_FilterId; + }; } // ecapseman diff --git a/lib/cpExtensions/Algorithms/ParallelImageMean.h b/lib/cpExtensions/Algorithms/ParallelImageMean.h index f34ca6e..1fe204a 100644 --- a/lib/cpExtensions/Algorithms/ParallelImageMean.h +++ b/lib/cpExtensions/Algorithms/ParallelImageMean.h @@ -11,53 +11,53 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class I > + class ParallelImageMean + : public itk::DomainThreader< itk::ThreadedImageRegionPartitioner< I::ImageDimension >, I > { - /** - */ - template< class I > - class ParallelImageMean - : public itk::DomainThreader< itk::ThreadedImageRegionPartitioner< I::ImageDimension >, I > - { - public: - // Standard ITK typedefs. - typedef itk::DomainThreader< itk::ThreadedImageRegionPartitioner< I::ImageDimension >, I > Superclass; - typedef ParallelImageMean Self; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef typename Superclass::DomainType DomainType; - - typedef itk::Array< double > TMean; - - protected: - typedef itk::NumericTraits< typename I::PixelType > _TPixelTraits; - - - public: - itkNewMacro( Self ); - itkTypeMacro( ParallelImageMean, itkDomainThreader ); - - itkGetConstMacro( Mean, TMean ); - - protected: - ParallelImageMean( ); - virtual ~ParallelImageMean( ); - - private: - virtual void BeforeThreadedExecution( ); - virtual void ThreadedExecution( - const DomainType& region, const itk::ThreadIdType id - ); - virtual void AfterThreadedExecution( ); - - protected: - itk::Array< double > m_Mean; - unsigned long m_N; - }; - - } // ecapseman + public: + // Standard ITK typedefs. + typedef itk::DomainThreader< itk::ThreadedImageRegionPartitioner< I::ImageDimension >, I > Superclass; + typedef ParallelImageMean Self; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef typename Superclass::DomainType DomainType; + + typedef itk::Array< double > TMean; + + protected: + typedef itk::NumericTraits< typename I::PixelType > _TPixelTraits; + + + public: + itkNewMacro( Self ); + itkTypeMacro( ParallelImageMean, itkDomainThreader ); + + itkGetConstMacro( Mean, TMean ); + + protected: + ParallelImageMean( ); + virtual ~ParallelImageMean( ); + + private: + virtual void BeforeThreadedExecution( ); + virtual void ThreadedExecution( + const DomainType& region, const itk::ThreadIdType id + ); + virtual void AfterThreadedExecution( ); + + protected: + itk::Array< double > m_Mean; + unsigned long m_N; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/RGBExtractFunction.h b/lib/cpExtensions/Algorithms/RGBExtractFunction.h index 8db1697..9dd11b5 100644 --- a/lib/cpExtensions/Algorithms/RGBExtractFunction.h +++ b/lib/cpExtensions/Algorithms/RGBExtractFunction.h @@ -13,39 +13,39 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class O > + struct RGBExtractFunction { - /** - */ - template< class O > - struct RGBExtractFunction - { - typedef RGBExtractFunction Self; - typedef itk::Vector< O, 3 > TOutPixel; - - template< class Tr, class Tg, class Tb > - TOutPixel operator()( const Tr& r, const Tg& g, const Tb& b ) const - { - TOutPixel rgb; - rgb[ 0 ] = O( r ); - rgb[ 1 ] = O( g ); - rgb[ 2 ] = O( b ); - return( rgb ); - } - - template< class C > - TOutPixel operator()( const itk::RGBPixel< C >& rgb ) const - { - return( - this->operator()( - rgb.GetRed( ), rgb.GetGreen( ), rgb.GetBlue( ) - ) - ); - } - }; - - } // ecapseman + typedef RGBExtractFunction Self; + typedef itk::Vector< O, 3 > TOutPixel; + + template< class Tr, class Tg, class Tb > + TOutPixel operator()( const Tr& r, const Tg& g, const Tb& b ) const + { + TOutPixel rgb; + rgb[ 0 ] = O( r ); + rgb[ 1 ] = O( g ); + rgb[ 2 ] = O( b ); + return( rgb ); + } + + template< class C > + TOutPixel operator()( const itk::RGBPixel< C >& rgb ) const + { + return( + this->operator()( + rgb.GetRed( ), rgb.GetGreen( ), rgb.GetBlue( ) + ) + ); + } + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/RGBImageToOtherChannelsFilter.h b/lib/cpExtensions/Algorithms/RGBImageToOtherChannelsFilter.h index fb04b77..b537015 100644 --- a/lib/cpExtensions/Algorithms/RGBImageToOtherChannelsFilter.h +++ b/lib/cpExtensions/Algorithms/RGBImageToOtherChannelsFilter.h @@ -8,66 +8,66 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class I, class O, class C > + class RGBImageToOtherChannelsFilter + : public itk::ImageToImageFilter< I, O > { - /** - */ - template< class I, class O, class C > - class RGBImageToOtherChannelsFilter - : public itk::ImageToImageFilter< I, O > - { - public: - typedef RGBImageToOtherChannelsFilter Self; - typedef itk::ImageToImageFilter< I, O > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef I TInputImage; - typedef O TOutputImage; - typedef C TConverter; - typedef typename I::PixelType TInputPixel; - typedef typename O::PixelType TOutputPixel; - - public: - itkNewMacro( Self ); - itkTypeMacro( RGBImageToOtherChannelsFilter, itkImageToImageFilter ); - - public: - O* GetChannel1( ); - O* GetChannel2( ); - O* GetChannel3( ); - - const O* GetChannel1( ) const; - const O* GetChannel2( ) const; - const O* GetChannel3( ) const; - - void GraftChannel1( O* c1 ); - void GraftChannel2( O* c2 ); - void GraftChannel3( O* c3 ); - - protected: - RGBImageToOtherChannelsFilter( ); - virtual ~RGBImageToOtherChannelsFilter( ); - - virtual void BeforeThreadedGenerateData( ); - virtual void AfterThreadedGenerateData( ); - - virtual void ThreadedGenerateData( - const typename Superclass::OutputImageRegionType& region, - itk::ThreadIdType threadId - ); - - private: - // Purposely not implemented - RGBImageToOtherChannelsFilter( const Self& other ); - void operator=( const Self& other ); - - private: - TConverter Converter; - }; - - } // ecapseman + public: + typedef RGBImageToOtherChannelsFilter Self; + typedef itk::ImageToImageFilter< I, O > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef I TInputImage; + typedef O TOutputImage; + typedef C TConverter; + typedef typename I::PixelType TInputPixel; + typedef typename O::PixelType TOutputPixel; + + public: + itkNewMacro( Self ); + itkTypeMacro( RGBImageToOtherChannelsFilter, itkImageToImageFilter ); + + public: + O* GetChannel1( ); + O* GetChannel2( ); + O* GetChannel3( ); + + const O* GetChannel1( ) const; + const O* GetChannel2( ) const; + const O* GetChannel3( ) const; + + void GraftChannel1( O* c1 ); + void GraftChannel2( O* c2 ); + void GraftChannel3( O* c3 ); + + protected: + RGBImageToOtherChannelsFilter( ); + virtual ~RGBImageToOtherChannelsFilter( ); + + virtual void BeforeThreadedGenerateData( ); + virtual void AfterThreadedGenerateData( ); + + virtual void ThreadedGenerateData( + const typename Superclass::OutputImageRegionType& region, + itk::ThreadIdType threadId + ); + + private: + // Purposely not implemented + RGBImageToOtherChannelsFilter( const Self& other ); + void operator=( const Self& other ); + + private: + TConverter Converter; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/RGBToHSVFunction.h b/lib/cpExtensions/Algorithms/RGBToHSVFunction.h index 8536b4a..326ec5d 100644 --- a/lib/cpExtensions/Algorithms/RGBToHSVFunction.h +++ b/lib/cpExtensions/Algorithms/RGBToHSVFunction.h @@ -13,70 +13,70 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class O > + struct RGBToHSVFunction { - /** - */ - template< class O > - struct RGBToHSVFunction - { - typedef RGBToHSVFunction Self; - typedef itk::Vector< O, 3 > TOutPixel; + typedef RGBToHSVFunction Self; + typedef itk::Vector< O, 3 > TOutPixel; - template< class Tr, class Tg, class Tb > - TOutPixel operator()( const Tr& r, const Tg& g, const Tb& b ) const - { - static const double mVal = - double( std::numeric_limits< O >::max( ) ); - static const double _0 = double( 0 ); - static const double _1 = double( 1 ); - static const double _2 = double( 2 ); - static const double _3 = double( 3 ); - static const double _2pi = _2 * double( vnl_math::pi ); - - TOutPixel hsv; + template< class Tr, class Tg, class Tb > + TOutPixel operator()( const Tr& r, const Tg& g, const Tb& b ) const + { + static const double mVal = + double( std::numeric_limits< O >::max( ) ); + static const double _0 = double( 0 ); + static const double _1 = double( 1 ); + static const double _2 = double( 2 ); + static const double _3 = double( 3 ); + static const double _2pi = _2 * double( vnl_math::pi ); - double R = double( r ); - double G = double( g ); - double B = double( b ); - double sRGB = R + G + B; - double RG = R - G; - double RB = R - B; - double GB = G - B; + TOutPixel hsv; - // Hue - double A = std::sqrt( ( RG * RG ) + ( RB * GB ) ); - if( A != _0 ) - A = std::acos( ( RG + RB ) / ( _2 * A ) ); - A /= _2pi; - hsv[ 0 ] = O( mVal * ( ( G >= B )? A: _1 - A ) ); + double R = double( r ); + double G = double( g ); + double B = double( b ); + double sRGB = R + G + B; + double RG = R - G; + double RB = R - B; + double GB = G - B; - // Saturation - if( sRGB != _0 ) - { - double C = ( G < R )? G: R; - C = ( B < C )? B: C; - hsv[ 1 ] = O( mVal * ( _1 - ( ( _3 * C ) / sRGB ) ) ); - } - else - hsv[ 1 ] = O( 0 ); - - // Value - hsv[ 2 ] = O( sRGB / _3 ); - return( hsv ); - } + // Hue + double A = std::sqrt( ( RG * RG ) + ( RB * GB ) ); + if( A != _0 ) + A = std::acos( ( RG + RB ) / ( _2 * A ) ); + A /= _2pi; + hsv[ 0 ] = O( mVal * ( ( G >= B )? A: _1 - A ) ); - template< class C > - TOutPixel operator()( const itk::RGBPixel< C >& rgb ) const + // Saturation + if( sRGB != _0 ) { - return( - this->operator()( - rgb.GetRed( ), rgb.GetGreen( ), rgb.GetBlue( ) - ) - ); + double C = ( G < R )? G: R; + C = ( B < C )? B: C; + hsv[ 1 ] = O( mVal * ( _1 - ( ( _3 * C ) / sRGB ) ) ); } - }; + else + hsv[ 1 ] = O( 0 ); + + // Value + hsv[ 2 ] = O( sRGB / _3 ); + return( hsv ); + } + + template< class C > + TOutPixel operator()( const itk::RGBPixel< C >& rgb ) const + { + return( + this->operator()( + rgb.GetRed( ), rgb.GetGreen( ), rgb.GetBlue( ) + ) + ); + } + }; } // ecapseman diff --git a/lib/cpExtensions/Algorithms/RGBToRGBFunction.h b/lib/cpExtensions/Algorithms/RGBToRGBFunction.h index 97b85ce..b7d5908 100644 --- a/lib/cpExtensions/Algorithms/RGBToRGBFunction.h +++ b/lib/cpExtensions/Algorithms/RGBToRGBFunction.h @@ -10,39 +10,39 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class O > + struct RGBToRGBFunction { - /** - */ - template< class O > - struct RGBToRGBFunction - { - typedef RGBToRGBFunction Self; - typedef itk::Vector< O, 3 > TOutPixel; - - template< class Tr, class Tg, class Tb > - TOutPixel operator()( const Tr& r, const Tg& g, const Tb& b ) const - { - TOutPixel rgb; - rgb[ 0 ] = O( r ); - rgb[ 1 ] = O( g ); - rgb[ 2 ] = O( b ); - return( rgb ); - } - - template< class C > - TOutPixel operator()( const itk::RGBPixel< C >& rgb ) const - { - return( - this->operator()( - rgb.GetRed( ), rgb.GetGreen( ), rgb.GetBlue( ) - ) - ); - } - }; - - } // ecapseman + typedef RGBToRGBFunction Self; + typedef itk::Vector< O, 3 > TOutPixel; + + template< class Tr, class Tg, class Tb > + TOutPixel operator()( const Tr& r, const Tg& g, const Tb& b ) const + { + TOutPixel rgb; + rgb[ 0 ] = O( r ); + rgb[ 1 ] = O( g ); + rgb[ 2 ] = O( b ); + return( rgb ); + } + + template< class C > + TOutPixel operator()( const itk::RGBPixel< C >& rgb ) const + { + return( + this->operator()( + rgb.GetRed( ), rgb.GetGreen( ), rgb.GetBlue( ) + ) + ); + } + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Algorithms/RGBToYPbPrFunction.h b/lib/cpExtensions/Algorithms/RGBToYPbPrFunction.h index 5b13a07..fb9da02 100644 --- a/lib/cpExtensions/Algorithms/RGBToYPbPrFunction.h +++ b/lib/cpExtensions/Algorithms/RGBToYPbPrFunction.h @@ -15,48 +15,48 @@ #include namespace cpExtensions +{ + namespace Algorithms { - namespace Algorithms + /** + */ + template< class O > + struct RGBToYPbPrFunction { - /** - */ - template< class O > - struct RGBToYPbPrFunction - { - typedef RGBToYPbPrFunction Self; - typedef itk::Vector< O, 3 > TOutPixel; + typedef RGBToYPbPrFunction Self; + typedef itk::Vector< O, 3 > TOutPixel; - template< class Tr, class Tg, class Tb > - TOutPixel operator()( const Tr& r, const Tg& g, const Tb& b ) const - { - static const O M[] = - { - O( 0.2990 ), O( 0.5870 ), O( 0.1140 ), - O( -0.1687 ), O( -0.3313 ), O( 0.5000 ), - O( 0.5000 ), O( -0.4187 ), O( -0.0813 ) - }; - static const vnl_matrix< O > vM( M, 3, 3 ); - static const itk::Matrix< O, 3, 3 > iM( vM ); + template< class Tr, class Tg, class Tb > + TOutPixel operator()( const Tr& r, const Tg& g, const Tb& b ) const + { + static const O M[] = + { + O( 0.2990 ), O( 0.5870 ), O( 0.1140 ), + O( -0.1687 ), O( -0.3313 ), O( 0.5000 ), + O( 0.5000 ), O( -0.4187 ), O( -0.0813 ) + }; + static const vnl_matrix< O > vM( M, 3, 3 ); + static const itk::Matrix< O, 3, 3 > iM( vM ); - TOutPixel rgb; - rgb[ 0 ] = O( r ); - rgb[ 1 ] = O( g ); - rgb[ 2 ] = O( b ); - return( iM * rgb ); - } + TOutPixel rgb; + rgb[ 0 ] = O( r ); + rgb[ 1 ] = O( g ); + rgb[ 2 ] = O( b ); + return( iM * rgb ); + } - template< class C > - TOutPixel operator()( const itk::RGBPixel< C >& rgb ) const - { - return( - this->operator()( - rgb.GetRed( ), rgb.GetGreen( ), rgb.GetBlue( ) - ) - ); - } - }; + template< class C > + TOutPixel operator()( const itk::RGBPixel< C >& rgb ) const + { + return( + this->operator()( + rgb.GetRed( ), rgb.GetGreen( ), rgb.GetBlue( ) + ) + ); + } + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/DataStructures/ITKAndVTKImage.h b/lib/cpExtensions/DataStructures/ITKAndVTKImage.h index a3e2aac..dfcad3f 100644 --- a/lib/cpExtensions/DataStructures/ITKAndVTKImage.h +++ b/lib/cpExtensions/DataStructures/ITKAndVTKImage.h @@ -7,98 +7,98 @@ #include namespace cpExtensions +{ + namespace DataStructures { - namespace DataStructures + /** + */ + template< typename P, unsigned int D > + struct ITKAndVTKImage { - /** - */ - template< typename P, unsigned int D > - struct ITKAndVTKImage - { - typedef itk::Image< P, D > TImage; - typedef itk::ImageToVTKImageFilter< TImage > TItk2Vtk; - - typename TImage::Pointer ITK; - typename TItk2Vtk::Pointer VTK; - - void CopyInformation( const itk::ImageBase< D >* i ) + typedef itk::Image< P, D > TImage; + typedef itk::ImageToVTKImageFilter< TImage > TItk2Vtk; + + typename TImage::Pointer ITK; + typename TItk2Vtk::Pointer VTK; + + void CopyInformation( const itk::ImageBase< D >* i ) + { + this->ITK = TImage::New( ); + this->ITK->SetLargestPossibleRegion( i->GetLargestPossibleRegion( ) ); + this->ITK->SetRequestedRegion( i->GetRequestedRegion( ) ); + this->ITK->SetBufferedRegion( i->GetBufferedRegion( ) ); + this->ITK->SetSpacing( i->GetSpacing( ) ); + this->ITK->SetOrigin( i->GetOrigin( ) ); + this->ITK->SetDirection( i->GetDirection( ) ); + this->ITK->Allocate( ); + } + + void SetItkImage( TImage* image ) + { + this->ITK = image; + this->_Synch( ); + } + + std::string ReadFromFile( const std::string& filename ) + { + typename itk::ImageFileReader< TImage >::Pointer r = + itk::ImageFileReader< TImage >::New( ); + r->SetFileName( filename ); + try { - this->ITK = TImage::New( ); - this->ITK->SetLargestPossibleRegion( i->GetLargestPossibleRegion( ) ); - this->ITK->SetRequestedRegion( i->GetRequestedRegion( ) ); - this->ITK->SetBufferedRegion( i->GetBufferedRegion( ) ); - this->ITK->SetSpacing( i->GetSpacing( ) ); - this->ITK->SetOrigin( i->GetOrigin( ) ); - this->ITK->SetDirection( i->GetDirection( ) ); - this->ITK->Allocate( ); + r->Update( ); } - - void SetItkImage( TImage* image ) + catch( itk::ExceptionObject& err ) { - this->ITK = image; - this->_Synch( ); - } - - std::string ReadFromFile( const std::string& filename ) - { - typename itk::ImageFileReader< TImage >::Pointer r = - itk::ImageFileReader< TImage >::New( ); - r->SetFileName( filename ); - try - { - r->Update( ); - } - catch( itk::ExceptionObject& err ) - { - this->ITK = NULL; - return( err.GetDescription( ) ); - - } // fi - this->ITK = r->GetOutput( ); - this->ITK->DisconnectPipeline( ); - this->_Synch( ); - return( "" ); - } - - std::string WriteToFile( const std::string& filename ) const + this->ITK = NULL; + return( err.GetDescription( ) ); + + } // fi + this->ITK = r->GetOutput( ); + this->ITK->DisconnectPipeline( ); + this->_Synch( ); + return( "" ); + } + + std::string WriteToFile( const std::string& filename ) const + { + typename itk::ImageFileWriter< TImage >::Pointer w = + itk::ImageFileWriter< TImage >::New( ); + w->SetFileName( filename ); + w->SetInput( this->ITK ); + try { - typename itk::ImageFileWriter< TImage >::Pointer w = - itk::ImageFileWriter< TImage >::New( ); - w->SetFileName( filename ); - w->SetInput( this->ITK ); - try - { - w->Update( ); - } - catch( itk::ExceptionObject& err ) - { - return( err.GetDescription( ) ); - - } // fi - return( "" ); + w->Update( ); } - - TImage* GetItkImage( ) - { return( this->ITK ); } - vtkImageData* GetVtkImage( ) - { return( this->VTK->GetOutput( ) ); } - const TImage* GetItkImage( ) const - { return( this->ITK ); } - const vtkImageData* GetVtkImage( ) const - { return( this->VTK->GetOutput( ) ); } - void DisconnectPipeline( ) - { this->ITK->DisconnectPipeline( ); } - - void _Synch( ) + catch( itk::ExceptionObject& err ) { - this->VTK = TItk2Vtk::New( ); - this->VTK->SetInput( this->ITK ); - this->VTK->Update( ); - } - - }; - - } // ecapseman + return( err.GetDescription( ) ); + + } // fi + return( "" ); + } + + TImage* GetItkImage( ) + { return( this->ITK ); } + vtkImageData* GetVtkImage( ) + { return( this->VTK->GetOutput( ) ); } + const TImage* GetItkImage( ) const + { return( this->ITK ); } + const vtkImageData* GetVtkImage( ) const + { return( this->VTK->GetOutput( ) ); } + void DisconnectPipeline( ) + { this->ITK->DisconnectPipeline( ); } + + void _Synch( ) + { + this->VTK = TItk2Vtk::New( ); + this->VTK->SetInput( this->ITK ); + this->VTK->Update( ); + } + + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/DataStructures/QuadEdge.h b/lib/cpExtensions/DataStructures/QuadEdge.h index 9b0a660..1914d03 100644 --- a/lib/cpExtensions/DataStructures/QuadEdge.h +++ b/lib/cpExtensions/DataStructures/QuadEdge.h @@ -5,460 +5,460 @@ #include namespace cpExtensions +{ + namespace DataStructures { - namespace DataStructures + /** + */ + template< typename P, typename D, bool IsPrimal = true > + class QuadEdge + : public itk::LightObject { + public: + typedef QuadEdge Self; + typedef itk::LightObject Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + /// Vertices and faces types + typedef P TPrimalGeometry; + typedef D TDualGeometry; + + /** + * Dual type, basically the same type with swapped template + * parameters. + */ + typedef QuadEdge< D, P, !IsPrimal > TDual; + typedef Self TPrimal; + typedef typename TDual::Pointer PtrDual; + friend TDual; + + /// Iterators + typedef QuadEdgeIterator< TPrimal > Iterator; + typedef QuadEdgeConstIterator< TPrimal > ConstIterator; + typedef QuadEdgePointIterator< TPrimal > PointIterator; + typedef QuadEdgePointConstIterator< TPrimal > PointConstIterator; + + public: + itkNewMacro( Self ); + itkTypeMacro( QuadEdge, itkLightObject ); + + cpPluginsExtensionsQEAllIteratorsMacro( Onext ); + cpPluginsExtensionsQEAllIteratorsMacro( Lnext ); + cpPluginsExtensionsQEAllIteratorsMacro( Rnext ); + cpPluginsExtensionsQEAllIteratorsMacro( Dnext ); + cpPluginsExtensionsQEAllIteratorsMacro( Oprev ); + cpPluginsExtensionsQEAllIteratorsMacro( Lprev ); + cpPluginsExtensionsQEAllIteratorsMacro( Rprev ); + cpPluginsExtensionsQEAllIteratorsMacro( Dprev ); + + public: + void CreateRings( ); + + /// First order access methods + inline TPrimal* GetOnext( ) + { return( this->m_Onext ); } + inline TDual* GetRot( ) + { return( this->m_Rot ); } + inline const TPrimal* GetOnext( ) const + { return( this->m_Onext ); } + inline const TDual* GetRot( ) const + { return( this->m_Rot ); } + + /// First order configuration methods + inline void SetOnext( TPrimal* e ) + { this->m_Onext = e; } + inline void SetRot( TDual* e ) + { this->m_Rot = e; } + + /// Second order accessors: around base rings + inline TPrimal* GetSym( ) + { return( this->m_Rot->m_Rot ); } + inline TDual* GetInvRot( ) + { return( this->m_Rot->m_Rot->m_Rot ); } + + /// Second order accessors: neighboring topology + inline TPrimal* GetLnext( ) + { return( this->m_Rot->m_Rot->m_Rot->m_Onext->m_Rot ); } + inline TPrimal* GetRnext( ) + { return( this->m_Rot->m_Onext->m_Rot->m_Rot->m_Rot ); } + inline TPrimal* GetDnext( ) + { return( this->m_Rot->m_Rot->m_Onext->m_Rot->m_Rot ); } + inline TPrimal* GetOprev( ) + { return( this->m_Rot->m_Onext->m_Rot ); } + inline TPrimal* GetLprev( ) + { return( this->m_Onext->m_Rot->m_Rot ); } + inline TPrimal* GetRprev( ) + { return( this->m_Rot->m_Rot->m_Onext ); } + inline TPrimal* GetDprev( ) + { + return( this->m_Rot->m_Rot->m_Rot->m_Onext->m_Rot->m_Rot->m_Rot ); + } + + /// Second order accessors: around base rings (const versions) + inline const TPrimal* GetSym( ) const + { return( this->m_Rot->m_Rot ); } + inline const TDual* GetInvRot( ) const + { return( this->m_Rot->m_Rot->m_Rot ); } + + /// Second order accessors: neighboring topology (const versions) + inline const TPrimal* GetLnext( ) const + { return( this->m_Rot->m_Rot->m_Rot->m_Onext->m_Rot ); } + inline const TPrimal* GetRnext( ) const + { return( this->m_Rot->m_Onext->m_Rot->m_Rot->m_Rot ); } + inline const TPrimal* GetDnext( ) const + { return( this->m_Rot->m_Rot->m_Onext->m_Rot->m_Rot ); } + inline const TPrimal* GetOprev( ) const + { return( this->m_Rot->m_Onext->m_Rot ); } + inline const TPrimal* GetLprev( ) const + { return( this->m_Onext->m_Rot->m_Rot ); } + inline const TPrimal* GetRprev( ) const + { return( this->m_Rot->m_Rot->m_Onext ); } + inline const TPrimal* GetDprev( ) const + { + return( this->m_Rot->m_Rot->m_Rot->m_Onext->m_Rot->m_Rot->m_Rot ); + } + + /// Get geometry methods + inline P& GetOrigin( ) + { return ( this->m_Origin ); } + inline P& GetDestination( ) + { return ( this->m_Rot->m_Rot->m_Origin ); } + inline D& GetRight( ) + { return ( this->m_Rot->m_Origin ); } + inline D& GetLeft( ) + { return ( this->m_Rot->m_Rot->m_Rot->m_Origin ); } + + /// Get geometry methods (const versions) + inline const P& GetOrigin( ) const + { return ( this->m_Origin ); } + inline const P& GetDestination( ) const + { return ( this->m_Rot->m_Rot->m_Origin ); } + inline const D& GetRight( ) const + { return ( this->m_Rot->m_Origin ); } + inline const D& GetLeft( ) const + { return ( this->m_Rot->m_Rot->m_Rot->m_Origin ); } + + /// Set geometry methods + inline void SetOrigin( const P& v ) + { this->m_Origin = v; } + inline void SetDestination( const P& v ) + { this->m_Rot->m_Rot->m_Origin = v; } + inline void SetRight( const D& v ) + { this->m_Rot->m_Origin = v; } + inline void SetLeft( const D& v ) + { this->m_Rot->m_Rot->m_Rot->m_Origin = v; } + inline void UnsetOrigin( ) + { this->m_Origin = TPrimal::NoGeometry; } + inline void UnsetDestination( ) + { this->m_Rot->m_Rot->m_Origin = TPrimal::NoGeometry; } + inline void UnsetRight( ) + { this->m_Rot->m_Origin = TDual::NoGeometry; } + inline void UnsetLeft( ) + { this->m_Rot->m_Rot->m_Rot->m_Origin = TDual::NoGeometry; } + + /** + * Set the Left( ) of all the edges in the Lnext( ) ring of "this" + * with the same given geometrical information. + * @param faceGeom Looks at most maxSize edges in the Lnext( ) ring. + * @return Returns true on success. False otherwise. + */ + void SetLnextRingGeometry( const D& v ); + void UnsetLnextRingGeometry( ); + + /// Topological queries + inline bool IsIsolated( ) const + { return( this == this->m_Onext ); } + bool IsEdgeInOnextRing( const TPrimal* e ) const; + bool IsEdgeInLnextRing( const TPrimal* e ) const; + unsigned int GetOnextRingSize( ) const; + unsigned int GetLnextRingSize( ) const; + + /** + * @return Returns true when "this" has no faces set on both sides. + * Return false otherwise. + */ + inline bool IsWire( ) + { return( !( this->IsLeftSet( ) ) && !( this->IsRightSet( ) ) ); } + /** + * @return Returns true when "this" is on the boundary i.e. + * one and only one of the faces is set. Return false + * otherwise. */ - template< typename P, typename D, bool IsPrimal = true > - class QuadEdge - : public itk::LightObject - { - public: - typedef QuadEdge Self; - typedef itk::LightObject Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - /// Vertices and faces types - typedef P TPrimalGeometry; - typedef D TDualGeometry; - - /** - * Dual type, basically the same type with swapped template - * parameters. - */ - typedef QuadEdge< D, P, !IsPrimal > TDual; - typedef Self TPrimal; - typedef typename TDual::Pointer PtrDual; - friend TDual; - - /// Iterators - typedef QuadEdgeIterator< TPrimal > Iterator; - typedef QuadEdgeConstIterator< TPrimal > ConstIterator; - typedef QuadEdgePointIterator< TPrimal > PointIterator; - typedef QuadEdgePointConstIterator< TPrimal > PointConstIterator; - - public: - itkNewMacro( Self ); - itkTypeMacro( QuadEdge, itkLightObject ); - - cpPluginsExtensionsQEAllIteratorsMacro( Onext ); - cpPluginsExtensionsQEAllIteratorsMacro( Lnext ); - cpPluginsExtensionsQEAllIteratorsMacro( Rnext ); - cpPluginsExtensionsQEAllIteratorsMacro( Dnext ); - cpPluginsExtensionsQEAllIteratorsMacro( Oprev ); - cpPluginsExtensionsQEAllIteratorsMacro( Lprev ); - cpPluginsExtensionsQEAllIteratorsMacro( Rprev ); - cpPluginsExtensionsQEAllIteratorsMacro( Dprev ); - - public: - void CreateRings( ); - - /// First order access methods - inline TPrimal* GetOnext( ) - { return( this->m_Onext ); } - inline TDual* GetRot( ) - { return( this->m_Rot ); } - inline const TPrimal* GetOnext( ) const - { return( this->m_Onext ); } - inline const TDual* GetRot( ) const - { return( this->m_Rot ); } - - /// First order configuration methods - inline void SetOnext( TPrimal* e ) - { this->m_Onext = e; } - inline void SetRot( TDual* e ) - { this->m_Rot = e; } - - /// Second order accessors: around base rings - inline TPrimal* GetSym( ) - { return( this->m_Rot->m_Rot ); } - inline TDual* GetInvRot( ) - { return( this->m_Rot->m_Rot->m_Rot ); } - - /// Second order accessors: neighboring topology - inline TPrimal* GetLnext( ) - { return( this->m_Rot->m_Rot->m_Rot->m_Onext->m_Rot ); } - inline TPrimal* GetRnext( ) - { return( this->m_Rot->m_Onext->m_Rot->m_Rot->m_Rot ); } - inline TPrimal* GetDnext( ) - { return( this->m_Rot->m_Rot->m_Onext->m_Rot->m_Rot ); } - inline TPrimal* GetOprev( ) - { return( this->m_Rot->m_Onext->m_Rot ); } - inline TPrimal* GetLprev( ) - { return( this->m_Onext->m_Rot->m_Rot ); } - inline TPrimal* GetRprev( ) - { return( this->m_Rot->m_Rot->m_Onext ); } - inline TPrimal* GetDprev( ) - { - return( this->m_Rot->m_Rot->m_Rot->m_Onext->m_Rot->m_Rot->m_Rot ); - } - - /// Second order accessors: around base rings (const versions) - inline const TPrimal* GetSym( ) const - { return( this->m_Rot->m_Rot ); } - inline const TDual* GetInvRot( ) const - { return( this->m_Rot->m_Rot->m_Rot ); } - - /// Second order accessors: neighboring topology (const versions) - inline const TPrimal* GetLnext( ) const - { return( this->m_Rot->m_Rot->m_Rot->m_Onext->m_Rot ); } - inline const TPrimal* GetRnext( ) const - { return( this->m_Rot->m_Onext->m_Rot->m_Rot->m_Rot ); } - inline const TPrimal* GetDnext( ) const - { return( this->m_Rot->m_Rot->m_Onext->m_Rot->m_Rot ); } - inline const TPrimal* GetOprev( ) const - { return( this->m_Rot->m_Onext->m_Rot ); } - inline const TPrimal* GetLprev( ) const - { return( this->m_Onext->m_Rot->m_Rot ); } - inline const TPrimal* GetRprev( ) const - { return( this->m_Rot->m_Rot->m_Onext ); } - inline const TPrimal* GetDprev( ) const - { - return( this->m_Rot->m_Rot->m_Rot->m_Onext->m_Rot->m_Rot->m_Rot ); - } - - /// Get geometry methods - inline P& GetOrigin( ) - { return ( this->m_Origin ); } - inline P& GetDestination( ) - { return ( this->m_Rot->m_Rot->m_Origin ); } - inline D& GetRight( ) - { return ( this->m_Rot->m_Origin ); } - inline D& GetLeft( ) - { return ( this->m_Rot->m_Rot->m_Rot->m_Origin ); } - - /// Get geometry methods (const versions) - inline const P& GetOrigin( ) const - { return ( this->m_Origin ); } - inline const P& GetDestination( ) const - { return ( this->m_Rot->m_Rot->m_Origin ); } - inline const D& GetRight( ) const - { return ( this->m_Rot->m_Origin ); } - inline const D& GetLeft( ) const - { return ( this->m_Rot->m_Rot->m_Rot->m_Origin ); } - - /// Set geometry methods - inline void SetOrigin( const P& v ) - { this->m_Origin = v; } - inline void SetDestination( const P& v ) - { this->m_Rot->m_Rot->m_Origin = v; } - inline void SetRight( const D& v ) - { this->m_Rot->m_Origin = v; } - inline void SetLeft( const D& v ) - { this->m_Rot->m_Rot->m_Rot->m_Origin = v; } - inline void UnsetOrigin( ) - { this->m_Origin = TPrimal::NoGeometry; } - inline void UnsetDestination( ) - { this->m_Rot->m_Rot->m_Origin = TPrimal::NoGeometry; } - inline void UnsetRight( ) - { this->m_Rot->m_Origin = TDual::NoGeometry; } - inline void UnsetLeft( ) - { this->m_Rot->m_Rot->m_Rot->m_Origin = TDual::NoGeometry; } - - /** - * Set the Left( ) of all the edges in the Lnext( ) ring of "this" - * with the same given geometrical information. - * @param faceGeom Looks at most maxSize edges in the Lnext( ) ring. - * @return Returns true on success. False otherwise. - */ - void SetLnextRingGeometry( const D& v ); - void UnsetLnextRingGeometry( ); - - /// Topological queries - inline bool IsIsolated( ) const - { return( this == this->m_Onext ); } - bool IsEdgeInOnextRing( const TPrimal* e ) const; - bool IsEdgeInLnextRing( const TPrimal* e ) const; - unsigned int GetOnextRingSize( ) const; - unsigned int GetLnextRingSize( ) const; - - /** - * @return Returns true when "this" has no faces set on both sides. - * Return false otherwise. - */ - inline bool IsWire( ) - { return( !( this->IsLeftSet( ) ) && !( this->IsRightSet( ) ) ); } - - /** - * @return Returns true when "this" is on the boundary i.e. - * one and only one of the faces is set. Return false - * otherwise. - */ - inline bool IsAtBorder( ) const; - - /** - * @return Returns true when "this" has faces set on both sides. - * Return false otherwise. - */ - inline bool IsInternal( ) const - { return ( this->IsLeftSet( ) && this->IsRightSet( ) ); } - - /// Geometrical queries - inline bool IsOriginSet( ) const - { return ( this->m_Origin != Self::NoGeometry ); } - inline bool IsDestinationSet( ) const - { return ( this->m_Rot->m_Rot->IsOriginSet( ) ); } - inline bool IsRightSet( ) const - { return ( this->m_Rot->IsOriginSet( ) ); } - inline bool IsLeftSet( ) const - { return ( this->m_Rot->m_Rot->m_Rot->IsOriginSet( ) ); } - - /** - * \brief Check wether edge's Origin is internal to the mesh (as - * opposed to being on the boundary) by looking if all the edges - * in the Onext() ring have a face set on both their Left() and - * Right() side. - */ - bool IsOriginInternal( ) const; - - /** - * Definition: an edge is said to be a boundary edge when it is - * adjacent to i.e. when at least one of the faces edge->GetLeft() or - * edge->GetRight() is unset. Definition: an point is said to be a - * boundary point when at least one of the edges of it's Onext() ring - * is a boundary edge. - * - * Assume "this" edge belongs to a triangulation (i.e. it belongs to a - * QEMesh which represents a 2-manifold) which possesses a boundary. - * Assume "this" edge instance is a boundary edge. Let us denote by P - * the point which is the origin of "this" edge i.e. P is - * this->Origin(). By definition P is a boundary point. Then AT - * LEAST two [see the note below] edges of the Onext() ring of P - * [which all have the point P as Origin()] are themselves boundary - * edges. And among those boundary edges AT LEAST one has it's Left() - * face unset. By iterating over the Onext() ring (which defines a - * local ordering on edges) this method searches for the first edge - * whose Left() face is unset AND which is encountered AFTER edgeTest. - * - * @param edgeTest When present, this edge will be considered as - * the entry edge in the Onext() ring. When absent it shall - * be defaulted to "this" edge. (see the warning below). - * @return When "this" edge is a boundary edge, return the first - * edge in "this" Onext() ring whose Left() face is unset - * AND located after edgeTest. - * When "this" edge is NOT a boundary edge the 0 is - * returned. - * @warning When the Mesh possessing "this" edge is a 2-manifold - * then result of this method is unique in the sense that - * it is independent from the edgeTest parameter. - * But when the Mesh is not 2-manifold (this state can - * happen at intermediary stages of the building process, - * or during "surgical" operations on the Mesh, and - * even though the Mesh represents a triangulation) - * the result of this method is not unique in the sense - * that the result depends on the edgeTest parameter. - * Let us illusatre this dependence by considering a - * Mesh (which is a triangulation) which is not a 2-manifold. - * Assume the point P (the origin of "this" edge i.e. - * P = this->Originv()) is TWICE on the border i.e. it - * is adjacent twice to noface. We can consider the situation - * of the following diagram, which depicts some Onext() - * ring around point P: - * - * \ / // - * \ * / // - * i3 b2 counter-clockwise // - * * \ / NO FACE Onext() order. // - * \ / // - * ----b4-----P----b1------ // - * /|\ // - * NO FACE / | \ // - * / | \ * <------ a * indicates the // - * / | \ the presence of a face // - * / | \ // - * b5 i6 i7 // - * / * | * \ // - * / | \ // - * - * On this example, and if we assume the Onext() oder is - * represented counter-clockwise, the edges are ordered as - * follows: - * b1, b2, i3, b4, b5, i6, i7 - * (when arbitrarily starting at edge b1). - * We have four Boundary edges labeled b1, b2, b4, b5 and - * we have three internal edges (i.e. non boundary edges) - * labeled i3, i6 and i7. - * Depending on edgeTest, the result of this method - * will NOT return the same edge: - * - when edgeTest == b5 (or i6 or i7 or b1) then the edge - * b1 will be returned, - * - when edgeTest == b2 (or i3 or b4) then the edge - * b4 will be returned, - * Eventually, when edgeTest is absent, the result shall - * depend on the position of "this" in the Onext() ring(). - * - */ - TPrimal* GetNextBorderEdgeWithUnsetLeft( TPrimal* edge = NULL ) const; - - /** - * Assume "this->Originv()" is a boundary point P that is thrice - * adjacent to noface and consider the given situation is the one - * depicted by the following diagram where: - * - P is "this->Originv()" instance, - * - the * (star) indicates the presence of a face, - * - b1, b2, b3, b4, b5, b6 denote boundary edges, - * - p denotes some generic point, - * - A and B denote some specific points we want to discuss, - * - the Onext() ring order is represented counter-clockwise - * [which is coherent with the definition of edge->GetRigth()] - * i.e. the ordering of the edges is: - * b1, b2, b3, b4, b5, b6, b1... - * - * p N p - * / \ O / \ // - * / \ / \ // - * / \ F / \ counter-clockwise // - * / b3 A b2 \ Onext() ring order // - * / \ C / \ // - * / * \ E / * \ // - * / \ / \ // - * A------b4------P------b1-------B // - * / \ // - * / \ // - * NO FACE / \ NO FACE // - * / \ // - * b5 b6 // - * / * \ // - * / \ // - * p---------------p // - * - * At P this Mesh doesn't represent a 2-manifold (since we are thrice - * on the boundary). Nevertheless such a situation could arise in - * intermediary stages (e.g. when building the Mesh, or during - * surgical changes on the Mesh). - * Now, assume we are asked to build the triangle [P, A, B]. Note - * that this request is not absurd since the current situation at - * P isn't the one of a 2-manifold: hence when building the current - * Onext() ring of P, we had not enough information to decide - * wheter b4.Onext() should be b5 or b1. It is ONLY when we are - * required to build the triangle [P, A, B] that we have the - * additional information that b4.Onext() is indeed b1. - * When we are required to build triangle [P, A, B], we hence - * need to change the Onext() ring order at P, i.e. we need to deal - * with the triangle [P, b5, b6] which currently prevents - * b4.Onext() to be b1. In other terms, when considering the - * additional information that b4.Onext() is b1, and before - * building the triangle [P, A, B], we need to reorder - * the Onext() ring of P from it's current state - * b1, b2, b3, b4, b5, b6, b1... - * to an order coherent with the [P, A, B] request, i.e. - * b1, b2, b5, b6, b3, b4, b1... - * - * In order to establish the "proper" Onext() ring at P we use - * two Splice operations. The algorithm goes: - * - first disconnect the piece of the surface containing the edge - * [PB] (it would be the same process if we chose [PA]) from - * the Onext() ring at P. - * - second, re-integrate the disconnected piece at the desired - * location i.e. side by side with [PA] (respectively [PB] if - * we chose [PA] at first stage). - * By "piece of surface containing the edge [PB]" we mean [all] - * the triangle[s] starting at [PB] in the Onext() order and - * having a left face set. - * - * We can illustrate this process on bit more general diagram than - * the last case (where the "piece of surface containing the edge - * [PB]" is constituted by two triangles) and when using - * the arguments of this method (i.e. [PA] = this and [PB] = second). - * The initial stage is the following (we note first=this=[PA] and - * second=[PB]) where the Onext() ring order is: - * first, b2, b3, second, b5, bsplice, b7, first... - * - * p N A // - * / \ O / \ // - * / \ / \ // - * / \ F / \ counter-clockwise // - * / b2 A first \ Onext() ring order // - * / \ C / \ // - * / * \ E / * \ // - * / \ / \ // - * p-------b3------P------b7-------p // - * /|\ // - * / | \ // - * NO FACE / | \ NO FACE // - * / | \ // - * second b5 bsplice // - * / * | * \ // - * / | \ // - * B-------p-------p // - * - * The first stage, implemented as - * second->Oprev()->Splice( bsplice ), - * yields the following diagram: - * - * p N A // - * / \ O / \ // - * / \ F / \ // - * / \ A / \ counter-clockwise // - * / b2 C first \ Onext() ring order // - * / \ E / \ // - * / * \ / * \ // - * / \ / \ // - * p-------b3------P------b7-------p // - * // - * NO FACE // - * // - * /|\ // - * / | \ // - * / | \ // - * / | \ // - * second b5 bsplice // - * / * | * \ // - * / | \ // - * B-------p-------p // - * - * and the second stage, implemented as - * first->Splice( bsplice ), - * yields the following diagram: - * - * A // - * B__ NO FACE / \ // - * | \__ / \ // - * | \__ / \ counter- // - * | second first \ clockwise for all // - * | \__ / \ // - * | * \__ / * \ // - * | \ / \ // - * p-------b5---------P------b7-------p // - * | __/|\ // - * | * __/ | \ // - * | / | \ NO FACE // - * | bsplice | \ // - * | __/ b2 b3 // - * p__/ | * \ // - * NO FACE | \ // - * p-------p // - * - */ - inline static bool ReorderOnextRing( TPrimal* first, TPrimal* second ); - - /** - * \brief Basic quad-edge topological method. - * - * This method describes all possible topological operations on an - * edge since it is its own inverse. It works in two ways: - * - * 1. If this->m_Org != b->m_Org, it slice a face in two. - * 2. If this->m_Org == b->m_Org, it unifies two faces. - */ - inline static void Splice( TPrimal* a, TPrimal* b ); - - protected: - QuadEdge( ); - virtual ~QuadEdge( ); - - public: - static const TPrimalGeometry NoGeometry; - - protected: - Pointer m_Onext; /**< Onext ring */ - PtrDual m_Rot; /**< Rot ring */ - TPrimalGeometry m_Origin; /**< Geometry attached to edge's origin */ - }; - - } // ecapseman + inline bool IsAtBorder( ) const; + + /** + * @return Returns true when "this" has faces set on both sides. + * Return false otherwise. + */ + inline bool IsInternal( ) const + { return ( this->IsLeftSet( ) && this->IsRightSet( ) ); } + + /// Geometrical queries + inline bool IsOriginSet( ) const + { return ( this->m_Origin != Self::NoGeometry ); } + inline bool IsDestinationSet( ) const + { return ( this->m_Rot->m_Rot->IsOriginSet( ) ); } + inline bool IsRightSet( ) const + { return ( this->m_Rot->IsOriginSet( ) ); } + inline bool IsLeftSet( ) const + { return ( this->m_Rot->m_Rot->m_Rot->IsOriginSet( ) ); } + + /** + * \brief Check wether edge's Origin is internal to the mesh (as + * opposed to being on the boundary) by looking if all the edges + * in the Onext() ring have a face set on both their Left() and + * Right() side. + */ + bool IsOriginInternal( ) const; + + /** + * Definition: an edge is said to be a boundary edge when it is + * adjacent to i.e. when at least one of the faces edge->GetLeft() or + * edge->GetRight() is unset. Definition: an point is said to be a + * boundary point when at least one of the edges of it's Onext() ring + * is a boundary edge. + * + * Assume "this" edge belongs to a triangulation (i.e. it belongs to a + * QEMesh which represents a 2-manifold) which possesses a boundary. + * Assume "this" edge instance is a boundary edge. Let us denote by P + * the point which is the origin of "this" edge i.e. P is + * this->Origin(). By definition P is a boundary point. Then AT + * LEAST two [see the note below] edges of the Onext() ring of P + * [which all have the point P as Origin()] are themselves boundary + * edges. And among those boundary edges AT LEAST one has it's Left() + * face unset. By iterating over the Onext() ring (which defines a + * local ordering on edges) this method searches for the first edge + * whose Left() face is unset AND which is encountered AFTER edgeTest. + * + * @param edgeTest When present, this edge will be considered as + * the entry edge in the Onext() ring. When absent it shall + * be defaulted to "this" edge. (see the warning below). + * @return When "this" edge is a boundary edge, return the first + * edge in "this" Onext() ring whose Left() face is unset + * AND located after edgeTest. + * When "this" edge is NOT a boundary edge the 0 is + * returned. + * @warning When the Mesh possessing "this" edge is a 2-manifold + * then result of this method is unique in the sense that + * it is independent from the edgeTest parameter. + * But when the Mesh is not 2-manifold (this state can + * happen at intermediary stages of the building process, + * or during "surgical" operations on the Mesh, and + * even though the Mesh represents a triangulation) + * the result of this method is not unique in the sense + * that the result depends on the edgeTest parameter. + * Let us illusatre this dependence by considering a + * Mesh (which is a triangulation) which is not a 2-manifold. + * Assume the point P (the origin of "this" edge i.e. + * P = this->Originv()) is TWICE on the border i.e. it + * is adjacent twice to noface. We can consider the situation + * of the following diagram, which depicts some Onext() + * ring around point P: + * + * \ / // + * \ * / // + * i3 b2 counter-clockwise // + * * \ / NO FACE Onext() order. // + * \ / // + * ----b4-----P----b1------ // + * /|\ // + * NO FACE / | \ // + * / | \ * <------ a * indicates the // + * / | \ the presence of a face // + * / | \ // + * b5 i6 i7 // + * / * | * \ // + * / | \ // + * + * On this example, and if we assume the Onext() oder is + * represented counter-clockwise, the edges are ordered as + * follows: + * b1, b2, i3, b4, b5, i6, i7 + * (when arbitrarily starting at edge b1). + * We have four Boundary edges labeled b1, b2, b4, b5 and + * we have three internal edges (i.e. non boundary edges) + * labeled i3, i6 and i7. + * Depending on edgeTest, the result of this method + * will NOT return the same edge: + * - when edgeTest == b5 (or i6 or i7 or b1) then the edge + * b1 will be returned, + * - when edgeTest == b2 (or i3 or b4) then the edge + * b4 will be returned, + * Eventually, when edgeTest is absent, the result shall + * depend on the position of "this" in the Onext() ring(). + * + */ + TPrimal* GetNextBorderEdgeWithUnsetLeft( TPrimal* edge = NULL ) const; + + /** + * Assume "this->Originv()" is a boundary point P that is thrice + * adjacent to noface and consider the given situation is the one + * depicted by the following diagram where: + * - P is "this->Originv()" instance, + * - the * (star) indicates the presence of a face, + * - b1, b2, b3, b4, b5, b6 denote boundary edges, + * - p denotes some generic point, + * - A and B denote some specific points we want to discuss, + * - the Onext() ring order is represented counter-clockwise + * [which is coherent with the definition of edge->GetRigth()] + * i.e. the ordering of the edges is: + * b1, b2, b3, b4, b5, b6, b1... + * + * p N p + * / \ O / \ // + * / \ / \ // + * / \ F / \ counter-clockwise // + * / b3 A b2 \ Onext() ring order // + * / \ C / \ // + * / * \ E / * \ // + * / \ / \ // + * A------b4------P------b1-------B // + * / \ // + * / \ // + * NO FACE / \ NO FACE // + * / \ // + * b5 b6 // + * / * \ // + * / \ // + * p---------------p // + * + * At P this Mesh doesn't represent a 2-manifold (since we are thrice + * on the boundary). Nevertheless such a situation could arise in + * intermediary stages (e.g. when building the Mesh, or during + * surgical changes on the Mesh). + * Now, assume we are asked to build the triangle [P, A, B]. Note + * that this request is not absurd since the current situation at + * P isn't the one of a 2-manifold: hence when building the current + * Onext() ring of P, we had not enough information to decide + * wheter b4.Onext() should be b5 or b1. It is ONLY when we are + * required to build the triangle [P, A, B] that we have the + * additional information that b4.Onext() is indeed b1. + * When we are required to build triangle [P, A, B], we hence + * need to change the Onext() ring order at P, i.e. we need to deal + * with the triangle [P, b5, b6] which currently prevents + * b4.Onext() to be b1. In other terms, when considering the + * additional information that b4.Onext() is b1, and before + * building the triangle [P, A, B], we need to reorder + * the Onext() ring of P from it's current state + * b1, b2, b3, b4, b5, b6, b1... + * to an order coherent with the [P, A, B] request, i.e. + * b1, b2, b5, b6, b3, b4, b1... + * + * In order to establish the "proper" Onext() ring at P we use + * two Splice operations. The algorithm goes: + * - first disconnect the piece of the surface containing the edge + * [PB] (it would be the same process if we chose [PA]) from + * the Onext() ring at P. + * - second, re-integrate the disconnected piece at the desired + * location i.e. side by side with [PA] (respectively [PB] if + * we chose [PA] at first stage). + * By "piece of surface containing the edge [PB]" we mean [all] + * the triangle[s] starting at [PB] in the Onext() order and + * having a left face set. + * + * We can illustrate this process on bit more general diagram than + * the last case (where the "piece of surface containing the edge + * [PB]" is constituted by two triangles) and when using + * the arguments of this method (i.e. [PA] = this and [PB] = second). + * The initial stage is the following (we note first=this=[PA] and + * second=[PB]) where the Onext() ring order is: + * first, b2, b3, second, b5, bsplice, b7, first... + * + * p N A // + * / \ O / \ // + * / \ / \ // + * / \ F / \ counter-clockwise // + * / b2 A first \ Onext() ring order // + * / \ C / \ // + * / * \ E / * \ // + * / \ / \ // + * p-------b3------P------b7-------p // + * /|\ // + * / | \ // + * NO FACE / | \ NO FACE // + * / | \ // + * second b5 bsplice // + * / * | * \ // + * / | \ // + * B-------p-------p // + * + * The first stage, implemented as + * second->Oprev()->Splice( bsplice ), + * yields the following diagram: + * + * p N A // + * / \ O / \ // + * / \ F / \ // + * / \ A / \ counter-clockwise // + * / b2 C first \ Onext() ring order // + * / \ E / \ // + * / * \ / * \ // + * / \ / \ // + * p-------b3------P------b7-------p // + * // + * NO FACE // + * // + * /|\ // + * / | \ // + * / | \ // + * / | \ // + * second b5 bsplice // + * / * | * \ // + * / | \ // + * B-------p-------p // + * + * and the second stage, implemented as + * first->Splice( bsplice ), + * yields the following diagram: + * + * A // + * B__ NO FACE / \ // + * | \__ / \ // + * | \__ / \ counter- // + * | second first \ clockwise for all // + * | \__ / \ // + * | * \__ / * \ // + * | \ / \ // + * p-------b5---------P------b7-------p // + * | __/|\ // + * | * __/ | \ // + * | / | \ NO FACE // + * | bsplice | \ // + * | __/ b2 b3 // + * p__/ | * \ // + * NO FACE | \ // + * p-------p // + * + */ + inline static bool ReorderOnextRing( TPrimal* first, TPrimal* second ); + + /** + * \brief Basic quad-edge topological method. + * + * This method describes all possible topological operations on an + * edge since it is its own inverse. It works in two ways: + * + * 1. If this->m_Org != b->m_Org, it slice a face in two. + * 2. If this->m_Org == b->m_Org, it unifies two faces. + */ + inline static void Splice( TPrimal* a, TPrimal* b ); + + protected: + QuadEdge( ); + virtual ~QuadEdge( ); + + public: + static const TPrimalGeometry NoGeometry; + + protected: + Pointer m_Onext; /**< Onext ring */ + PtrDual m_Rot; /**< Rot ring */ + TPrimalGeometry m_Origin; /**< Geometry attached to edge's origin */ + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/DataStructures/QuadEdgeCell.h b/lib/cpExtensions/DataStructures/QuadEdgeCell.h index ff7e5a4..d177e3d 100644 --- a/lib/cpExtensions/DataStructures/QuadEdgeCell.h +++ b/lib/cpExtensions/DataStructures/QuadEdgeCell.h @@ -4,116 +4,116 @@ #include namespace cpExtensions +{ + namespace DataStructures { - namespace DataStructures + /** + */ + template< class I, class E > + class QuadEdgeCell + : public I { - /** - */ - template< class I, class E > - class QuadEdgeCell - : public I - { - public: - // Base types - typedef QuadEdgeCell Self; - typedef I Superclass; - typedef itk::AutoPointer< Self > SelfAutoPointer; - typedef itk::AutoPointer< const Self > ConstSelfAutoPointer; - typedef Self* RawPointer; - typedef const Self* ConstRawPointer; - - // QuadEdge objects - typedef E TPrimalEdge; - typedef typename E::TDual TDualEdge; - - // Inherited types - typedef typename I::PixelType PixelType; - typedef typename I::CellType CellType; - typedef typename I::CellAutoPointer CellAutoPointer; - typedef typename I::CellConstAutoPointer CellConstAutoPointer; - typedef typename I::CellRawPointer CellRawPointer; - typedef typename I::CellConstRawPointer CellConstRawPointer; - typedef typename I::CellTraits CellTraits; - typedef typename I::CoordRepType CoordRepType; - typedef typename I::InterpolationWeightType InterpolationWeightType; - typedef typename I::PointIdentifier PointIdentifier; - typedef typename I::PointIdIterator PointIdIterator; - typedef typename I::PointIdConstIterator PointIdConstIterator; - typedef typename I::CellIdentifier CellIdentifier; - typedef typename I::CellFeatureIdentifier CellFeatureIdentifier; - typedef typename I::CellFeatureIdentifier CellFeatureCount; - typedef typename I::PointType PointType; - typedef typename I::VectorType VectorType; - typedef typename I::PointsContainer PointsContainer; - typedef typename I::UsingCellsContainer UsingCellsContainer; - typedef typename I::CellGeometry CellGeometry; - typedef typename I::ParametricCoordArrayType ParametricCoordArrayType; - typedef typename I::ShapeFunctionsArrayType ShapeFunctionsArrayType; - - itkStaticConstMacro( PointDimension, unsigned int, I::PointDimension ); - itkStaticConstMacro( CellDimension, unsigned int, 2 ); - - public: - itkTypeMacro( QuadEdgeCell, I ); - - public: - QuadEdgeCell( ); - QuadEdgeCell( E* entry ); - virtual ~QuadEdgeCell( ); - - /// Implement the standard CellInterface. - virtual CellGeometry GetType( ) const; - virtual void MakeCopy( CellAutoPointer& other ) const; - virtual unsigned int GetDimension( ) const; - virtual unsigned int GetNumberOfPoints( ) const; - virtual CellFeatureCount GetNumberOfBoundaryFeatures( - int dimension - ) const; - virtual bool GetBoundaryFeature( - int dimension, CellFeatureIdentifier fId, CellAutoPointer& ptr - ); - virtual void SetPointIds( PointIdConstIterator first ); - virtual void SetPointIds( - PointIdConstIterator first, PointIdConstIterator last - ); - virtual void AddPointId( PointIdentifier pId ); - virtual void RemovePointId( PointIdentifier pId ); - virtual void SetPointIds( - int dummy, int num, PointIdConstIterator first - ); - virtual void BuildEdges( ); - virtual void ClearPoints( ); - virtual void SetPointId( int localId, PointIdentifier pId ); - - // Visitor methods - static int GetTopologyId( ); - virtual void Accept( - CellIdentifier cellid, - typename itk::CellInterface< PixelType, CellTraits >:: - MultiVisitor* mv - ); - - // Iterators - virtual PointIdIterator PointIdsBegin( ); - virtual PointIdConstIterator PointIdsBegin( ) const; - virtual PointIdIterator PointIdsEnd( ); - virtual PointIdConstIterator PointIdsEnd( ) const; - - /// QuadEdgeCell-specific interface. - virtual E* GetEntryPrimalEdge( ); - virtual const E* GetEntryPrimalEdge( ) const; - virtual void SetEntryPrimalEdge( E* entry ); - - private: - /// Purposely not implemented. - QuadEdgeCell( const Self& ); - Self& operator=( const Self& ); - - protected: - E* m_EntryEdge; - }; - - } // ecapseman + public: + // Base types + typedef QuadEdgeCell Self; + typedef I Superclass; + typedef itk::AutoPointer< Self > SelfAutoPointer; + typedef itk::AutoPointer< const Self > ConstSelfAutoPointer; + typedef Self* RawPointer; + typedef const Self* ConstRawPointer; + + // QuadEdge objects + typedef E TPrimalEdge; + typedef typename E::TDual TDualEdge; + + // Inherited types + typedef typename I::PixelType PixelType; + typedef typename I::CellType CellType; + typedef typename I::CellAutoPointer CellAutoPointer; + typedef typename I::CellConstAutoPointer CellConstAutoPointer; + typedef typename I::CellRawPointer CellRawPointer; + typedef typename I::CellConstRawPointer CellConstRawPointer; + typedef typename I::CellTraits CellTraits; + typedef typename I::CoordRepType CoordRepType; + typedef typename I::InterpolationWeightType InterpolationWeightType; + typedef typename I::PointIdentifier PointIdentifier; + typedef typename I::PointIdIterator PointIdIterator; + typedef typename I::PointIdConstIterator PointIdConstIterator; + typedef typename I::CellIdentifier CellIdentifier; + typedef typename I::CellFeatureIdentifier CellFeatureIdentifier; + typedef typename I::CellFeatureIdentifier CellFeatureCount; + typedef typename I::PointType PointType; + typedef typename I::VectorType VectorType; + typedef typename I::PointsContainer PointsContainer; + typedef typename I::UsingCellsContainer UsingCellsContainer; + typedef typename I::CellGeometry CellGeometry; + typedef typename I::ParametricCoordArrayType ParametricCoordArrayType; + typedef typename I::ShapeFunctionsArrayType ShapeFunctionsArrayType; + + itkStaticConstMacro( PointDimension, unsigned int, I::PointDimension ); + itkStaticConstMacro( CellDimension, unsigned int, 2 ); + + public: + itkTypeMacro( QuadEdgeCell, I ); + + public: + QuadEdgeCell( ); + QuadEdgeCell( E* entry ); + virtual ~QuadEdgeCell( ); + + /// Implement the standard CellInterface. + virtual CellGeometry GetType( ) const; + virtual void MakeCopy( CellAutoPointer& other ) const; + virtual unsigned int GetDimension( ) const; + virtual unsigned int GetNumberOfPoints( ) const; + virtual CellFeatureCount GetNumberOfBoundaryFeatures( + int dimension + ) const; + virtual bool GetBoundaryFeature( + int dimension, CellFeatureIdentifier fId, CellAutoPointer& ptr + ); + virtual void SetPointIds( PointIdConstIterator first ); + virtual void SetPointIds( + PointIdConstIterator first, PointIdConstIterator last + ); + virtual void AddPointId( PointIdentifier pId ); + virtual void RemovePointId( PointIdentifier pId ); + virtual void SetPointIds( + int dummy, int num, PointIdConstIterator first + ); + virtual void BuildEdges( ); + virtual void ClearPoints( ); + virtual void SetPointId( int localId, PointIdentifier pId ); + + // Visitor methods + static int GetTopologyId( ); + virtual void Accept( + CellIdentifier cellid, + typename itk::CellInterface< PixelType, CellTraits >:: + MultiVisitor* mv + ); + + // Iterators + virtual PointIdIterator PointIdsBegin( ); + virtual PointIdConstIterator PointIdsBegin( ) const; + virtual PointIdIterator PointIdsEnd( ); + virtual PointIdConstIterator PointIdsEnd( ) const; + + /// QuadEdgeCell-specific interface. + virtual E* GetEntryPrimalEdge( ); + virtual const E* GetEntryPrimalEdge( ) const; + virtual void SetEntryPrimalEdge( E* entry ); + + private: + /// Purposely not implemented. + QuadEdgeCell( const Self& ); + Self& operator=( const Self& ); + + protected: + E* m_EntryEdge; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/DataStructures/QuadEdgeIterators.h b/lib/cpExtensions/DataStructures/QuadEdgeIterators.h index 9f0973b..c1a06a7 100644 --- a/lib/cpExtensions/DataStructures/QuadEdgeIterators.h +++ b/lib/cpExtensions/DataStructures/QuadEdgeIterators.h @@ -31,136 +31,136 @@ cpPluginsExtensionsQEPointIteratorsMacro( op, Iterator, ConstIterator ); namespace cpExtensions +{ + namespace DataStructures { - namespace DataStructures + /** + */ + template< class E > + class QuadEdgeBaseIterator { - /** - */ - template< class E > - class QuadEdgeBaseIterator - { - public: - typedef QuadEdgeBaseIterator Self; - typedef E TQuadEdge; - - // Different types of logical iterators - enum - { - OpOnext = 0, - OpLnext = 1, - OpRnext = 2, - OpDnext = 3, - OpOprev = 4, - OpLprev = 5, - OpRprev = 6, - OpDprev = 7 - }; - - public: - QuadEdgeBaseIterator( E* e, int op = OpOnext, bool start = true ); - virtual ~QuadEdgeBaseIterator( ); - Self& operator=( const Self& r ); - - E* GetStartEdge( ) const; - E* GetIterator( ) const; - int GetOpType( ) const; - bool GetStart( ) const; - - bool operator==( Self& r ); - bool operator==( const Self& r ) const; - bool operator!=( Self& r ); - bool operator!=( const Self& r ) const; - Self& operator++( ); - Self& operator++( int ); - - protected: - /// Method that should do all the iteration work - virtual void _GoToNext( ); - - protected: - E* m_StartEdge; /**< Start edge */ - E* m_Iterator; /**< Current iteration position */ - int m_OpType; /**< Operation type */ - bool m_Start; /**< Indicates iteration has just started */ - }; - - /** - */ - template< class E > - class QuadEdgeIterator - : public QuadEdgeBaseIterator< E > - { - public: - typedef QuadEdgeIterator Self; - typedef QuadEdgeBaseIterator< E > Superclass; - typedef E TQuadEdge; - - public: - QuadEdgeIterator( - E* e = NULL, int op = Superclass::OpOnext, bool start = true - ); - virtual ~QuadEdgeIterator( ); - E* operator*( ); - }; - - /** - */ - template< class E > - class QuadEdgeConstIterator - : public QuadEdgeBaseIterator< const E > - { - public: - typedef QuadEdgeConstIterator Self; - typedef QuadEdgeBaseIterator< const E > Superclass; - typedef E TQuadEdge; - - public: - QuadEdgeConstIterator( - const E* e = NULL, int op = Superclass::OpOnext, bool start = true - ); - virtual ~QuadEdgeConstIterator( ); - const E* operator*( ) const; - }; + public: + typedef QuadEdgeBaseIterator Self; + typedef E TQuadEdge; - /** - */ - template< class E > - class QuadEdgePointIterator - : public QuadEdgeBaseIterator< const E > + // Different types of logical iterators + enum { - public: - typedef QuadEdgePointIterator Self; - typedef QuadEdgeBaseIterator< const E > Superclass; - typedef E TQuadEdge; - - public: - QuadEdgePointIterator( - const E* e = NULL, int op = Superclass::OpOnext, bool start = true - ); - virtual ~QuadEdgePointIterator( ); - typename E::TPrimalGeometry& operator*( ); + OpOnext = 0, + OpLnext = 1, + OpRnext = 2, + OpDnext = 3, + OpOprev = 4, + OpLprev = 5, + OpRprev = 6, + OpDprev = 7 }; - /** - */ - template< class E > - class QuadEdgePointConstIterator - : public QuadEdgeBaseIterator< const E > - { - public: - typedef QuadEdgePointConstIterator Self; - typedef QuadEdgeBaseIterator< const E > Superclass; - typedef E TQuadEdge; - - public: - QuadEdgePointConstIterator( - const E* e = NULL, int op = Superclass::OpOnext, bool start = true - ); - virtual ~QuadEdgePointConstIterator( ); - const typename E::TPrimalGeometry& operator*( ) const; - }; - - } // ecapseman + public: + QuadEdgeBaseIterator( E* e, int op = OpOnext, bool start = true ); + virtual ~QuadEdgeBaseIterator( ); + Self& operator=( const Self& r ); + + E* GetStartEdge( ) const; + E* GetIterator( ) const; + int GetOpType( ) const; + bool GetStart( ) const; + + bool operator==( Self& r ); + bool operator==( const Self& r ) const; + bool operator!=( Self& r ); + bool operator!=( const Self& r ) const; + Self& operator++( ); + Self& operator++( int ); + + protected: + /// Method that should do all the iteration work + virtual void _GoToNext( ); + + protected: + E* m_StartEdge; /**< Start edge */ + E* m_Iterator; /**< Current iteration position */ + int m_OpType; /**< Operation type */ + bool m_Start; /**< Indicates iteration has just started */ + }; + + /** + */ + template< class E > + class QuadEdgeIterator + : public QuadEdgeBaseIterator< E > + { + public: + typedef QuadEdgeIterator Self; + typedef QuadEdgeBaseIterator< E > Superclass; + typedef E TQuadEdge; + + public: + QuadEdgeIterator( + E* e = NULL, int op = Superclass::OpOnext, bool start = true + ); + virtual ~QuadEdgeIterator( ); + E* operator*( ); + }; + + /** + */ + template< class E > + class QuadEdgeConstIterator + : public QuadEdgeBaseIterator< const E > + { + public: + typedef QuadEdgeConstIterator Self; + typedef QuadEdgeBaseIterator< const E > Superclass; + typedef E TQuadEdge; + + public: + QuadEdgeConstIterator( + const E* e = NULL, int op = Superclass::OpOnext, bool start = true + ); + virtual ~QuadEdgeConstIterator( ); + const E* operator*( ) const; + }; + + /** + */ + template< class E > + class QuadEdgePointIterator + : public QuadEdgeBaseIterator< const E > + { + public: + typedef QuadEdgePointIterator Self; + typedef QuadEdgeBaseIterator< const E > Superclass; + typedef E TQuadEdge; + + public: + QuadEdgePointIterator( + const E* e = NULL, int op = Superclass::OpOnext, bool start = true + ); + virtual ~QuadEdgePointIterator( ); + typename E::TPrimalGeometry& operator*( ); + }; + + /** + */ + template< class E > + class QuadEdgePointConstIterator + : public QuadEdgeBaseIterator< const E > + { + public: + typedef QuadEdgePointConstIterator Self; + typedef QuadEdgeBaseIterator< const E > Superclass; + typedef E TQuadEdge; + + public: + QuadEdgePointConstIterator( + const E* e = NULL, int op = Superclass::OpOnext, bool start = true + ); + virtual ~QuadEdgePointConstIterator( ); + const typename E::TPrimalGeometry& operator*( ) const; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/DataStructures/QuadEdgeMesh.h b/lib/cpExtensions/DataStructures/QuadEdgeMesh.h index 977bc5d..7ce48fe 100644 --- a/lib/cpExtensions/DataStructures/QuadEdgeMesh.h +++ b/lib/cpExtensions/DataStructures/QuadEdgeMesh.h @@ -9,270 +9,270 @@ #include namespace cpExtensions +{ + namespace DataStructures { - namespace DataStructures + /** + */ + template< typename P, unsigned int D = 3, typename T = itk::DefaultStaticMeshTraits< P, D, D > > + class QuadEdgeMesh + : public itk::Mesh< P, D, T > { - /** - */ - template< typename P, unsigned int D = 3, typename T = itk::DefaultStaticMeshTraits< P, D, D > > - class QuadEdgeMesh - : public itk::Mesh< P, D, T > - { - public: - typedef QuadEdgeMesh Self; - typedef itk::Mesh< P, D, T > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - /// Types from superclass - typedef typename - Superclass::BoundaryAssignmentsContainer - BoundaryAssignmentsContainer; - - typedef typename - Superclass::BoundaryAssignmentsContainerPointer - BoundaryAssignmentsContainerPointer; - - typedef typename Superclass::BoundingBoxType BoundingBoxType; - typedef typename Superclass::CellAutoPointer CellAutoPointer; - typedef typename Superclass::CellsContainer CellsContainer; - typedef typename Superclass::CellDataContainer CellDataContainer; - typedef typename Superclass::CellFeatureCount CellFeatureCount; - typedef typename Superclass::CellFeatureIdentifier CellFeatureIdentifier; - typedef typename Superclass::CellIdentifier CellIdentifier; - typedef typename Superclass::CellLinksContainer CellLinksContainer; - typedef typename Superclass::CellMultiVisitorType CellMultiVisitorType; - typedef typename Superclass::CellPixelType CellPixelType; - typedef typename Superclass::CellType CellType; - typedef typename Superclass::PointIdentifier PointIdentifier; - typedef typename Superclass::PointsContainer PointsContainer; - typedef typename Superclass::PointType PointType; - - /// QuadEdge types (primal and dual) - typedef QuadEdge< PointIdentifier, CellIdentifier > TPrimalEdge; - typedef typename TPrimalEdge::TDual TDualEdge; - typedef QuadEdgeCell< CellType, TPrimalEdge > TQuadEdgeCell; - - /// Memory management objects - typedef std::set< typename TPrimalEdge::Pointer > CntPrimalEdges; - typedef std::set< typename TDualEdge::Pointer > CntDualEdges; - typedef std::vector< TPrimalEdge* > CntOnextRings; - - /// More geometry types - typedef typename PointType::VectorType VectorType; - typedef typename VectorType::ValueType TScalar; - typedef std::vector< VectorType > CntNormals; - typedef typename CntNormals::const_iterator NormalsIterator; - - protected: - typedef std::vector< TPrimalEdge* > _TEdges; - - public: - itkNewMacro( Self ); - itkTypeMacro( QuadEdgeMesh, itkMesh ); - - public: - // Edge related methods - TPrimalEdge* FindEdge( const PointIdentifier& a ) const; - TPrimalEdge* FindEdge( - const PointIdentifier& a, const PointIdentifier& b - ) const; - TPrimalEdge* FindEntryEdge( const CellIdentifier& i ) const; - - /// New geometric methods - const CntNormals& GetPointNormalsContainer( ) const; - NormalsIterator BeginPointNormals( ) const; - NormalsIterator EndPointNormals( ) const; - const VectorType& GetPointNormal( const PointIdentifier& id ) const; - - /// itk::DataObject methods overloading - virtual bool RequestedRegionIsOutsideOfTheBufferedRegion( ); - - /// itk::PointSet methods overloading - virtual void SetPoints( PointsContainer* points ); - virtual void SetPoint( PointIdentifier id , PointType point ); - - /// itk::Mesh methods overloading - virtual void PassStructure( Self* inputMesh ) - { - std::cout << "PassStructure" << std::endl; - std::exit( 1 ); - } - - virtual void Initialize( ); - virtual void Graft( const itk::DataObject* data ); - - void SetCellLinks( CellLinksContainer* cellLinks ) - { - std::cout << "SetCellLinks" << std::endl; - std::exit( 1 ); - } - virtual CellLinksContainer* GetCellLinks( ) - { - std::cout << "GetCellLinks" << std::endl; - std::exit( 1 ); - } - virtual const CellLinksContainer* GetCellLinks( ) const - { - std::cout << "GetCellLinks (const)" << std::endl; - std::exit( 1 ); - } - virtual void SetCells( CellsContainer* cells ); - virtual void SetCellData( CellDataContainer* data ); - virtual CellDataContainer* GetCellData( ) - { - std::cout << "GetCellData" << std::endl; - std::exit( 1 ); - } - virtual const CellDataContainer* GetCellData( ) const - { - std::cout << "GetCellData (const)" << std::endl; - std::exit( 1 ); - } + public: + typedef QuadEdgeMesh Self; + typedef itk::Mesh< P, D, T > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + /// Types from superclass + typedef typename + Superclass::BoundaryAssignmentsContainer + BoundaryAssignmentsContainer; + + typedef typename + Superclass::BoundaryAssignmentsContainerPointer + BoundaryAssignmentsContainerPointer; + + typedef typename Superclass::BoundingBoxType BoundingBoxType; + typedef typename Superclass::CellAutoPointer CellAutoPointer; + typedef typename Superclass::CellsContainer CellsContainer; + typedef typename Superclass::CellDataContainer CellDataContainer; + typedef typename Superclass::CellFeatureCount CellFeatureCount; + typedef typename Superclass::CellFeatureIdentifier CellFeatureIdentifier; + typedef typename Superclass::CellIdentifier CellIdentifier; + typedef typename Superclass::CellLinksContainer CellLinksContainer; + typedef typename Superclass::CellMultiVisitorType CellMultiVisitorType; + typedef typename Superclass::CellPixelType CellPixelType; + typedef typename Superclass::CellType CellType; + typedef typename Superclass::PointIdentifier PointIdentifier; + typedef typename Superclass::PointsContainer PointsContainer; + typedef typename Superclass::PointType PointType; + + /// QuadEdge types (primal and dual) + typedef QuadEdge< PointIdentifier, CellIdentifier > TPrimalEdge; + typedef typename TPrimalEdge::TDual TDualEdge; + typedef QuadEdgeCell< CellType, TPrimalEdge > TQuadEdgeCell; + + /// Memory management objects + typedef std::set< typename TPrimalEdge::Pointer > CntPrimalEdges; + typedef std::set< typename TDualEdge::Pointer > CntDualEdges; + typedef std::vector< TPrimalEdge* > CntOnextRings; + + /// More geometry types + typedef typename PointType::VectorType VectorType; + typedef typename VectorType::ValueType TScalar; + typedef std::vector< VectorType > CntNormals; + typedef typename CntNormals::const_iterator NormalsIterator; + + protected: + typedef std::vector< TPrimalEdge* > _TEdges; + + public: + itkNewMacro( Self ); + itkTypeMacro( QuadEdgeMesh, itkMesh ); + + public: + // Edge related methods + TPrimalEdge* FindEdge( const PointIdentifier& a ) const; + TPrimalEdge* FindEdge( + const PointIdentifier& a, const PointIdentifier& b + ) const; + TPrimalEdge* FindEntryEdge( const CellIdentifier& i ) const; + + /// New geometric methods + const CntNormals& GetPointNormalsContainer( ) const; + NormalsIterator BeginPointNormals( ) const; + NormalsIterator EndPointNormals( ) const; + const VectorType& GetPointNormal( const PointIdentifier& id ) const; + + /// itk::DataObject methods overloading + virtual bool RequestedRegionIsOutsideOfTheBufferedRegion( ); + + /// itk::PointSet methods overloading + virtual void SetPoints( PointsContainer* points ); + virtual void SetPoint( PointIdentifier id , PointType point ); + + /// itk::Mesh methods overloading + virtual void PassStructure( Self* inputMesh ) + { + std::cout << "PassStructure" << std::endl; + std::exit( 1 ); + } + + virtual void Initialize( ); + virtual void Graft( const itk::DataObject* data ); + + void SetCellLinks( CellLinksContainer* cellLinks ) + { + std::cout << "SetCellLinks" << std::endl; + std::exit( 1 ); + } + virtual CellLinksContainer* GetCellLinks( ) + { + std::cout << "GetCellLinks" << std::endl; + std::exit( 1 ); + } + virtual const CellLinksContainer* GetCellLinks( ) const + { + std::cout << "GetCellLinks (const)" << std::endl; + std::exit( 1 ); + } + virtual void SetCells( CellsContainer* cells ); + virtual void SetCellData( CellDataContainer* data ); + virtual CellDataContainer* GetCellData( ) + { + std::cout << "GetCellData" << std::endl; + std::exit( 1 ); + } + virtual const CellDataContainer* GetCellData( ) const + { + std::cout << "GetCellData (const)" << std::endl; + std::exit( 1 ); + } #if !defined( CABLE_CONFIGURATION ) - virtual void SetBoundaryAssignments( - int dimension, BoundaryAssignmentsContainer* container - ) - { - std::cout << "SetBoundaryAssignments" << std::endl; - std::exit( 1 ); - } - virtual BoundaryAssignmentsContainerPointer - GetBoundaryAssignments( int dimension ) - { - std::cout << "GetBoundaryAssignments" << std::endl; - std::exit( 1 ); - } - virtual const BoundaryAssignmentsContainerPointer - GetBoundaryAssignments( int dimension ) const - { - std::cout << "GetBoundaryAssignments (const)" << std::endl; - std::exit( 1 ); - } + virtual void SetBoundaryAssignments( + int dimension, BoundaryAssignmentsContainer* container + ) + { + std::cout << "SetBoundaryAssignments" << std::endl; + std::exit( 1 ); + } + virtual BoundaryAssignmentsContainerPointer + GetBoundaryAssignments( int dimension ) + { + std::cout << "GetBoundaryAssignments" << std::endl; + std::exit( 1 ); + } + virtual const BoundaryAssignmentsContainerPointer + GetBoundaryAssignments( int dimension ) const + { + std::cout << "GetBoundaryAssignments (const)" << std::endl; + std::exit( 1 ); + } #endif - virtual void SetCell( CellIdentifier id, CellAutoPointer& ptr ); - virtual void SetCellData( CellIdentifier id, CellPixelType data ); - virtual bool GetCellData( CellIdentifier id, CellPixelType* data ) const - { - std::cout << "GetCellData" << std::endl; - std::exit( 1 ); - } - virtual void SetBoundaryAssignment( - int dimension, CellIdentifier cellId, - CellFeatureIdentifier featureId, - CellIdentifier boundaryId - ) - { - std::cout << "SetBoundaryAssignment" << std::endl; - std::exit( 1 ); - } - virtual bool GetBoundaryAssignment( - int dimension, CellIdentifier cellId, - CellFeatureIdentifier featureId, - CellIdentifier* boundaryId - ) const - { - std::cout << "GetBoundaryAssignment" << std::endl; - std::exit( 1 ); - } - virtual bool RemoveBoundaryAssignment( - int dimension, CellIdentifier cellId, - CellFeatureIdentifier featureId - ) - { - std::cout << "RemoveBoundaryAssignment" << std::endl; - std::exit( 1 ); - } - virtual CellFeatureCount GetNumberOfCellBoundaryFeatures( - int dimension, - CellIdentifier id - ) const - { - std::cout << "GetNumberOfCellBoundaryFeatures" << std::endl; - std::exit( 1 ); - } - virtual bool GetCellBoundaryFeature( - int dimension, CellIdentifier id, - CellFeatureIdentifier fid, - CellAutoPointer& ptr - ) const - { - std::cout << "GetCellBoundaryFeature" << std::endl; - std::exit( 1 ); - } - virtual CellIdentifier GetCellBoundaryFeatureNeighbors( - int dimension, - CellIdentifier id, - CellFeatureIdentifier fid, - std::set< CellIdentifier >* cellSet ) - { - std::cout << "GetCellBoundaryFeatureNeighbors" << std::endl; - std::exit( 1 ); - } - virtual CellIdentifier GetCellNeighbors( - CellIdentifier cellId, - std::set< CellIdentifier >* cellSet - ) - { - std::cout << "GetCellNeighbors" << std::endl; - std::exit( 1 ); - } - virtual bool GetAssignedCellBoundaryIfOneExists( - int dimension, CellIdentifier id, - CellFeatureIdentifier fid, - CellAutoPointer& ptr - ) const - { - std::cout << "GetAssignedCellBoundaryIfOneExists" << std::endl; - std::exit( 1 ); - } - virtual void BuildCellLinks( ) const; - - virtual void Accept( CellMultiVisitorType* mv ) const - { - std::cout << "Accept" << std::endl; - std::exit( 1 ); - } - - protected: - QuadEdgeMesh( ); - virtual ~QuadEdgeMesh( ); - - virtual void ReleaseCellsMemory( ) - { - std::cout << "ReleaseCellsMemory" << std::endl; - std::exit( 1 ); - } - - inline bool _CheckPoints( const CellAutoPointer& ptr ) const; - inline void _DeletePoint( const PointIdentifier& pId ); - inline TPrimalEdge* _CreateQuadEdge( - const PointIdentifier& a, const PointIdentifier& b - ); - inline void _DeleteEdge( TPrimalEdge* edge ); - inline void _DeleteFace( const CellIdentifier& f ); - inline void _ConstructEdges( - _TEdges& edges, const CellAutoPointer& ptr - ); - virtual VectorType _ComputePointNormal( const TPrimalEdge* e ) const; - inline void _ReleaseQuadEdgeObjects( ); - - private: - QuadEdgeMesh( const Self& ); // Not implemented - void operator=( const Self& ); // Not implemented - - protected: - CntPrimalEdges m_PrimalEdges; - CntDualEdges m_DualEdges; - - CntOnextRings m_OnextRings; - - CntNormals m_PointNormals; - }; - - } // ecapseman + virtual void SetCell( CellIdentifier id, CellAutoPointer& ptr ); + virtual void SetCellData( CellIdentifier id, CellPixelType data ); + virtual bool GetCellData( CellIdentifier id, CellPixelType* data ) const + { + std::cout << "GetCellData" << std::endl; + std::exit( 1 ); + } + virtual void SetBoundaryAssignment( + int dimension, CellIdentifier cellId, + CellFeatureIdentifier featureId, + CellIdentifier boundaryId + ) + { + std::cout << "SetBoundaryAssignment" << std::endl; + std::exit( 1 ); + } + virtual bool GetBoundaryAssignment( + int dimension, CellIdentifier cellId, + CellFeatureIdentifier featureId, + CellIdentifier* boundaryId + ) const + { + std::cout << "GetBoundaryAssignment" << std::endl; + std::exit( 1 ); + } + virtual bool RemoveBoundaryAssignment( + int dimension, CellIdentifier cellId, + CellFeatureIdentifier featureId + ) + { + std::cout << "RemoveBoundaryAssignment" << std::endl; + std::exit( 1 ); + } + virtual CellFeatureCount GetNumberOfCellBoundaryFeatures( + int dimension, + CellIdentifier id + ) const + { + std::cout << "GetNumberOfCellBoundaryFeatures" << std::endl; + std::exit( 1 ); + } + virtual bool GetCellBoundaryFeature( + int dimension, CellIdentifier id, + CellFeatureIdentifier fid, + CellAutoPointer& ptr + ) const + { + std::cout << "GetCellBoundaryFeature" << std::endl; + std::exit( 1 ); + } + virtual CellIdentifier GetCellBoundaryFeatureNeighbors( + int dimension, + CellIdentifier id, + CellFeatureIdentifier fid, + std::set< CellIdentifier >* cellSet ) + { + std::cout << "GetCellBoundaryFeatureNeighbors" << std::endl; + std::exit( 1 ); + } + virtual CellIdentifier GetCellNeighbors( + CellIdentifier cellId, + std::set< CellIdentifier >* cellSet + ) + { + std::cout << "GetCellNeighbors" << std::endl; + std::exit( 1 ); + } + virtual bool GetAssignedCellBoundaryIfOneExists( + int dimension, CellIdentifier id, + CellFeatureIdentifier fid, + CellAutoPointer& ptr + ) const + { + std::cout << "GetAssignedCellBoundaryIfOneExists" << std::endl; + std::exit( 1 ); + } + virtual void BuildCellLinks( ) const; + + virtual void Accept( CellMultiVisitorType* mv ) const + { + std::cout << "Accept" << std::endl; + std::exit( 1 ); + } + + protected: + QuadEdgeMesh( ); + virtual ~QuadEdgeMesh( ); + + virtual void ReleaseCellsMemory( ) + { + std::cout << "ReleaseCellsMemory" << std::endl; + std::exit( 1 ); + } + + inline bool _CheckPoints( const CellAutoPointer& ptr ) const; + inline void _DeletePoint( const PointIdentifier& pId ); + inline TPrimalEdge* _CreateQuadEdge( + const PointIdentifier& a, const PointIdentifier& b + ); + inline void _DeleteEdge( TPrimalEdge* edge ); + inline void _DeleteFace( const CellIdentifier& f ); + inline void _ConstructEdges( + _TEdges& edges, const CellAutoPointer& ptr + ); + virtual VectorType _ComputePointNormal( const TPrimalEdge* e ) const; + inline void _ReleaseQuadEdgeObjects( ); + + private: + QuadEdgeMesh( const Self& ); // Not implemented + void operator=( const Self& ); // Not implemented + + protected: + CntPrimalEdges m_PrimalEdges; + CntDualEdges m_DualEdges; + + CntOnextRings m_OnextRings; + + CntNormals m_PointNormals; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/IO/MeshReader.h b/lib/cpExtensions/IO/MeshReader.h index 94880a9..d6e8e1f 100644 --- a/lib/cpExtensions/IO/MeshReader.h +++ b/lib/cpExtensions/IO/MeshReader.h @@ -5,53 +5,53 @@ #include namespace cpExtensions +{ + namespace IO { - namespace IO + /** + */ + template< typename M > + class MeshReader + : public itk::MeshSource< M > { - /** - */ - template< typename M > - class MeshReader - : public itk::MeshSource< M > - { - public: - typedef MeshReader Self; - typedef itk::MeshSource< M > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; - - typedef M MeshType; - - public: - itkNewMacro( Self ); - itkTypeMacro( MeshReader, itkMeshSource ); - - itkSetStringMacro( FileName ); - itkGetStringMacro( FileName ); - - public: - virtual itk::ModifiedTimeType GetMTime( ) const; - - protected: - MeshReader( ); - virtual ~MeshReader( ); - - virtual void GenerateData( ); - - template< class R > - void _Read( ); - - private: - // Purposely not implemented - MeshReader( const Self& ); - Self& operator=( const Self & ); - - protected: - typename Superclass::Pointer m_Reader; - std::string m_FileName; - }; - - } // ecapseman + public: + typedef MeshReader Self; + typedef itk::MeshSource< M > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; + + typedef M MeshType; + + public: + itkNewMacro( Self ); + itkTypeMacro( MeshReader, itkMeshSource ); + + itkSetStringMacro( FileName ); + itkGetStringMacro( FileName ); + + public: + virtual itk::ModifiedTimeType GetMTime( ) const; + + protected: + MeshReader( ); + virtual ~MeshReader( ); + + virtual void GenerateData( ); + + template< class R > + void _Read( ); + + private: + // Purposely not implemented + MeshReader( const Self& ); + Self& operator=( const Self & ); + + protected: + typename Superclass::Pointer m_Reader; + std::string m_FileName; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/IO/WaveFrontOBJReader.h b/lib/cpExtensions/IO/WaveFrontOBJReader.h index 9ce320d..98274d8 100644 --- a/lib/cpExtensions/IO/WaveFrontOBJReader.h +++ b/lib/cpExtensions/IO/WaveFrontOBJReader.h @@ -8,67 +8,67 @@ #include namespace cpExtensions +{ + namespace IO { - namespace IO + /** + * \class WaveFrontOBJReader + * \brief + * Reads a wavefront OBJ file and create an itkMesh. + * + * Caveat1: itkWaveFrontOBJReader will read only vertices and faces. + * Normal, parameters and textures vectors are ignored. + * + */ + template< typename M > + class WaveFrontOBJReader + : public itk::MeshSource< M > { - /** - * \class WaveFrontOBJReader - * \brief - * Reads a wavefront OBJ file and create an itkMesh. - * - * Caveat1: itkWaveFrontOBJReader will read only vertices and faces. - * Normal, parameters and textures vectors are ignored. - * - */ - template< typename M > - class WaveFrontOBJReader - : public itk::MeshSource< M > - { - public: - typedef WaveFrontOBJReader Self; - typedef itk::MeshSource< M > Superclass; - typedef itk::SmartPointer< Self > Pointer; - typedef itk::SmartPointer< const Self > ConstPointer; + public: + typedef WaveFrontOBJReader Self; + typedef itk::MeshSource< M > Superclass; + typedef itk::SmartPointer< Self > Pointer; + typedef itk::SmartPointer< const Self > ConstPointer; - typedef M MeshType; - typedef typename M::MeshTraits MeshTraits; - typedef typename M::PointType PointType; - typedef typename MeshTraits::PixelType PixelType; - typedef typename M::Pointer MeshPointer; - typedef typename M::CellTraits CellTraits; - typedef typename M::CellIdentifier CellIdentifier; - typedef typename M::CellType CellType; - typedef typename M::CellAutoPointer CellAutoPointer; - typedef typename M::PointIdentifier PointIdentifier; - typedef typename CellTraits::PointIdIterator PointIdIterator; - typedef typename M::PointsContainerPointer PointsContainerPointer; - typedef typename M::PointsContainer PointsContainer; + typedef M MeshType; + typedef typename M::MeshTraits MeshTraits; + typedef typename M::PointType PointType; + typedef typename MeshTraits::PixelType PixelType; + typedef typename M::Pointer MeshPointer; + typedef typename M::CellTraits CellTraits; + typedef typename M::CellIdentifier CellIdentifier; + typedef typename M::CellType CellType; + typedef typename M::CellAutoPointer CellAutoPointer; + typedef typename M::PointIdentifier PointIdentifier; + typedef typename CellTraits::PointIdIterator PointIdIterator; + typedef typename M::PointsContainerPointer PointsContainerPointer; + typedef typename M::PointsContainer PointsContainer; - typedef itk::PolygonCell< CellType > TPolygonCell; + typedef itk::PolygonCell< CellType > TPolygonCell; - public: - itkNewMacro( Self ); - itkTypeMacro( WaveFrontOBJReader, itkMeshSource ); + public: + itkNewMacro( Self ); + itkTypeMacro( WaveFrontOBJReader, itkMeshSource ); - itkSetStringMacro( FileName ); - itkGetStringMacro( FileName ); + itkSetStringMacro( FileName ); + itkGetStringMacro( FileName ); - protected: - WaveFrontOBJReader( ); - virtual ~WaveFrontOBJReader( ); + protected: + WaveFrontOBJReader( ); + virtual ~WaveFrontOBJReader( ); - virtual void GenerateData( ); + virtual void GenerateData( ); - private: - // Purposely not implemented - WaveFrontOBJReader( const Self& ); - Self& operator=( const Self & ); + private: + // Purposely not implemented + WaveFrontOBJReader( const Self& ); + Self& operator=( const Self & ); - protected: - std::string m_FileName; - }; + protected: + std::string m_FileName; + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/IO/WaveFrontOBJReader.hxx b/lib/cpExtensions/IO/WaveFrontOBJReader.hxx index 94db473..355f779 100644 --- a/lib/cpExtensions/IO/WaveFrontOBJReader.hxx +++ b/lib/cpExtensions/IO/WaveFrontOBJReader.hxx @@ -79,7 +79,7 @@ GenerateData( ) pnt[ 3 ] = TScalar( std::atof( line[ 4 ].c_str( ) ) ); else pnt[ 4 ] = TScalar( 1 ); - + } // fi out->SetPoint( out->GetNumberOfPoints( ), pnt ); } diff --git a/lib/cpExtensions/Visualization/Image3DMPR.cxx b/lib/cpExtensions/Visualization/Image3DMPR.cxx index 86225b5..7812300 100644 --- a/lib/cpExtensions/Visualization/Image3DMPR.cxx +++ b/lib/cpExtensions/Visualization/Image3DMPR.cxx @@ -20,7 +20,7 @@ public: { if( eventId == vtkCommand::KeyPressEvent ) { - vtkRenderWindowInteractor* iren = + vtkRenderWindowInteractor* iren = static_cast< vtkRenderWindowInteractor* >( caller ); if( caller == NULL ) return; diff --git a/lib/cpExtensions/Visualization/Image3DMPR.h b/lib/cpExtensions/Visualization/Image3DMPR.h index 37240a7..2cbb9b7 100644 --- a/lib/cpExtensions/Visualization/Image3DMPR.h +++ b/lib/cpExtensions/Visualization/Image3DMPR.h @@ -23,70 +23,70 @@ #include namespace cpExtensions +{ + namespace Visualization { - namespace Visualization + /** + */ + class cpExtensions_EXPORT Image3DMPR { - /** - */ - class cpExtensions_EXPORT Image3DMPR - { - public: - Image3DMPR( ); - virtual ~Image3DMPR( ); + public: + Image3DMPR( ); + virtual ~Image3DMPR( ); - void SetImage( vtkImageData* image ); - void SetBackground( double r, double g, double b ); - void SetSize( unsigned int w, unsigned int h ); - void SetWindowLevel( double w, double l ); + void SetImage( vtkImageData* image ); + void SetBackground( double r, double g, double b ); + void SetSize( unsigned int w, unsigned int h ); + void SetWindowLevel( double w, double l ); - void AddPolyData( vtkPolyData* pd, double opacity = double( 1 ) ); - void AddPolyData( - vtkPolyData* pd, - double r, double g, double b, double opacity = double( 1 ) - ); - void AddPolyData( - vtkPolyData* pd, - vtkLookupTable* lut, - double opacity = double( 1 ) - ); + void AddPolyData( vtkPolyData* pd, double opacity = double( 1 ) ); + void AddPolyData( + vtkPolyData* pd, + double r, double g, double b, double opacity = double( 1 ) + ); + void AddPolyData( + vtkPolyData* pd, + vtkLookupTable* lut, + double opacity = double( 1 ) + ); - unsigned int GetNumberOfSeeds( ) const; - void GetSeed( int n, double* s ) const; - unsigned int AddSeed( - const double& x, const double& y, const double& z - ) const; + unsigned int GetNumberOfSeeds( ) const; + void GetSeed( int n, double* s ) const; + unsigned int AddSeed( + const double& x, const double& y, const double& z + ) const; - vtkRenderWindow* GetWindow( ) const; - vtkRenderer* GetRenderer( ) const; + vtkRenderWindow* GetWindow( ) const; + vtkRenderer* GetRenderer( ) const; - void Start( ); - void Render( ); + void Start( ); + void Render( ); - protected: - vtkSmartPointer< vtkImageData > m_Image; - vtkSmartPointer< vtkOutlineSource > m_Outline; - vtkSmartPointer< vtkPolyDataMapper > m_OutlineMapper; - vtkSmartPointer< vtkActor > m_OutlineActor; - vtkSmartPointer< vtkCellPicker > m_Picker; - vtkSmartPointer< vtkImagePlaneWidget > m_WidgetX; - vtkSmartPointer< vtkImagePlaneWidget > m_WidgetY; - vtkSmartPointer< vtkImagePlaneWidget > m_WidgetZ; - vtkSmartPointer< vtkRenderer > m_Renderer; - vtkSmartPointer< vtkRenderWindow > m_Window; - vtkSmartPointer< vtkRenderWindowInteractor > m_Interactor; + protected: + vtkSmartPointer< vtkImageData > m_Image; + vtkSmartPointer< vtkOutlineSource > m_Outline; + vtkSmartPointer< vtkPolyDataMapper > m_OutlineMapper; + vtkSmartPointer< vtkActor > m_OutlineActor; + vtkSmartPointer< vtkCellPicker > m_Picker; + vtkSmartPointer< vtkImagePlaneWidget > m_WidgetX; + vtkSmartPointer< vtkImagePlaneWidget > m_WidgetY; + vtkSmartPointer< vtkImagePlaneWidget > m_WidgetZ; + vtkSmartPointer< vtkRenderer > m_Renderer; + vtkSmartPointer< vtkRenderWindow > m_Window; + vtkSmartPointer< vtkRenderWindowInteractor > m_Interactor; - std::vector< vtkSmartPointer< vtkPolyData > > m_PolyDatas; - std::vector< vtkSmartPointer< vtkPolyDataMapper > > m_Mappers; - std::vector< vtkSmartPointer< vtkActor > > m_Actors; + std::vector< vtkSmartPointer< vtkPolyData > > m_PolyDatas; + std::vector< vtkSmartPointer< vtkPolyDataMapper > > m_Mappers; + std::vector< vtkSmartPointer< vtkActor > > m_Actors; - // Create the widget and its representation - vtkSmartPointer< vtkPointHandleRepresentation3D > - m_SeedHandleRepresentation; - vtkSmartPointer< vtkSeedRepresentation > m_SeedRepresentation; - vtkSmartPointer< vtkSeedWidget > m_SeedWidget; - }; + // Create the widget and its representation + vtkSmartPointer< vtkPointHandleRepresentation3D > + m_SeedHandleRepresentation; + vtkSmartPointer< vtkSeedRepresentation > m_SeedRepresentation; + vtkSmartPointer< vtkSeedWidget > m_SeedWidget; + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Visualization/ImageInteractorStyle.cxx b/lib/cpExtensions/Visualization/ImageInteractorStyle.cxx index 3399925..236fb43 100644 --- a/lib/cpExtensions/Visualization/ImageInteractorStyle.cxx +++ b/lib/cpExtensions/Visualization/ImageInteractorStyle.cxx @@ -123,7 +123,7 @@ OnMouseMove( ) { if( this->m_MPRActors == NULL ) return; - + if( this->CursorMoving ) { bool picked = this->_PickPosition( this->Cursor ); diff --git a/lib/cpExtensions/Visualization/ImageInteractorStyle.h b/lib/cpExtensions/Visualization/ImageInteractorStyle.h index 3a36885..df8422c 100644 --- a/lib/cpExtensions/Visualization/ImageInteractorStyle.h +++ b/lib/cpExtensions/Visualization/ImageInteractorStyle.h @@ -11,144 +11,144 @@ #include // ------------------------------------------------------------------------- -#define cpPlugins_ImageInteractorStyle_ObserverMacro( e ) \ - inline unsigned long Add##e##Observer( vtkCommand* observer ) \ - { return( this->AddObserver( Self::e##Event, observer ) ); } \ - inline void Remove##e##Observer( unsigned long tag ) \ - { this->RemoveObserver( tag ); } \ - inline void Remove##e##Observer( vtkCommand* observer ) \ - { this->RemoveObserver( observer ); } \ - inline void Remove##e##Observers( ) \ +#define cpPlugins_ImageInteractorStyle_ObserverMacro( e ) \ + inline unsigned long Add##e##Observer( vtkCommand* observer ) \ + { return( this->AddObserver( Self::e##Event, observer ) ); } \ + inline void Remove##e##Observer( unsigned long tag ) \ + { this->RemoveObserver( tag ); } \ + inline void Remove##e##Observer( vtkCommand* observer ) \ + { this->RemoveObserver( observer ); } \ + inline void Remove##e##Observers( ) \ { this->RemoveObservers( Self::e##Event ); } namespace cpExtensions +{ + namespace Visualization { - namespace Visualization + class ImageSliceActors; + class MPRActors; + + /** + */ + class cpExtensions_EXPORT ImageInteractorStyle + : public vtkInteractorStyleImage { - class ImageSliceActors; - class MPRActors; + public: + typedef ImageInteractorStyle Self; - /** - */ - class cpExtensions_EXPORT ImageInteractorStyle - : public vtkInteractorStyleImage + enum InteractionMode { - public: - typedef ImageInteractorStyle Self; - - enum InteractionMode - { - NavigationMode = 0, - DeformationMode - }; - - public: - vtkTypeMacro( ImageInteractorStyle, vtkInteractorStyleImage ); - - cpPlugins_ImageInteractorStyle_ObserverMacro( DoubleClick ); - cpPlugins_ImageInteractorStyle_ObserverMacro( Cursor ); - cpPlugins_ImageInteractorStyle_ObserverMacro( Radius ); - - public: - static Self* New( ); - - void Configure( - ImageSliceActors* slice_actors, - MPRActors* mpr_actors = NULL - ); - void AssociateInteractor( vtkRenderWindowInteractor* interactor ); - - void SetModeToNavigation( ); - void SetModeToDeformation( ); - virtual void SetInteractor( - vtkRenderWindowInteractor* interactor, const int& axis - ); - - // Description: - // Event bindings controlling the effects of pressing mouse buttons - // or moving the mouse. - virtual void OnMouseMove( ); - virtual void OnLeftButtonDown( ); - virtual void OnLeftButtonUp( ); - virtual void OnMiddleButtonDown( ); - virtual void OnMiddleButtonUp( ); - virtual void OnRightButtonDown( ); - virtual void OnRightButtonUp( ); - virtual void OnMouseWheelForward( ); - virtual void OnMouseWheelBackward( ); - - // Description: - // Override the "fly-to" (f keypress) for images. - virtual void OnChar( ); - - // These methods for the different interactions in different modes - // are overridden in subclasses to perform the correct motion. Since - // they might be called from OnTimer, they do not have mouse coord - // parameters (use interactor's GetEventPosition and - // GetLastEventPosition) - - virtual void Rotate( ) { } - virtual void Spin( ) { } - virtual void Zoom( ) { } - virtual void Pick( ) { } - virtual void Slice( ) { } - virtual void WindowLevel( ); - - // Interaction mode entry points used internally. - virtual void StartPick( ) { } - virtual void EndPick( ) { } - virtual void StartSlice( ) { } - virtual void EndSlice( ) { } - virtual void StartWindowLevel( ); - virtual void EndWindowLevel( ); - - // New events - virtual void StartCursorMoving( ); - virtual void EndCursorMoving( ); - virtual void StartRadiusMoving( ); - virtual void EndRadiusMoving( ); - - protected: - ImageInteractorStyle( ); - virtual ~ImageInteractorStyle( ); - - void _RenderAssociateInteractors( ); - bool _PickPosition( double pos[ 3 ] ); - void _UpdateCursor( ); - void _UpdateRadius( ); - - private: - // Purposely not implemented - ImageInteractorStyle( const Self& ); - Self& operator=( const Self& ); - - protected: - Self::InteractionMode Mode; - - ImageSliceActors* m_SliceActors; - MPRActors* m_MPRActors; - - vtkSmartPointer< vtkOrientationMarkerWidget > OrientationWidget; - vtkSmartPointer< vtkPropPicker > PropPicker; - - std::vector< vtkRenderWindowInteractor* > AssociatedInteractors; - - bool CursorMoving; - double Cursor[ 3 ]; - - bool RadiusMoving; - double Radius[ 3 ]; - vtkSmartPointer< vtkPolyData > Circle; - vtkSmartPointer< vtkPolyDataMapper > CircleMapper; - vtkSmartPointer< vtkActor > CircleActor; - - public: - static const int CursorEvent; - static const int RadiusEvent; - static const int DoubleClickEvent; + NavigationMode = 0, + DeformationMode }; - } // ecapseman + public: + vtkTypeMacro( ImageInteractorStyle, vtkInteractorStyleImage ); + + cpPlugins_ImageInteractorStyle_ObserverMacro( DoubleClick ); + cpPlugins_ImageInteractorStyle_ObserverMacro( Cursor ); + cpPlugins_ImageInteractorStyle_ObserverMacro( Radius ); + + public: + static Self* New( ); + + void Configure( + ImageSliceActors* slice_actors, + MPRActors* mpr_actors = NULL + ); + void AssociateInteractor( vtkRenderWindowInteractor* interactor ); + + void SetModeToNavigation( ); + void SetModeToDeformation( ); + virtual void SetInteractor( + vtkRenderWindowInteractor* interactor, const int& axis + ); + + // Description: + // Event bindings controlling the effects of pressing mouse buttons + // or moving the mouse. + virtual void OnMouseMove( ); + virtual void OnLeftButtonDown( ); + virtual void OnLeftButtonUp( ); + virtual void OnMiddleButtonDown( ); + virtual void OnMiddleButtonUp( ); + virtual void OnRightButtonDown( ); + virtual void OnRightButtonUp( ); + virtual void OnMouseWheelForward( ); + virtual void OnMouseWheelBackward( ); + + // Description: + // Override the "fly-to" (f keypress) for images. + virtual void OnChar( ); + + // These methods for the different interactions in different modes + // are overridden in subclasses to perform the correct motion. Since + // they might be called from OnTimer, they do not have mouse coord + // parameters (use interactor's GetEventPosition and + // GetLastEventPosition) + + virtual void Rotate( ) { } + virtual void Spin( ) { } + virtual void Zoom( ) { } + virtual void Pick( ) { } + virtual void Slice( ) { } + virtual void WindowLevel( ); + + // Interaction mode entry points used internally. + virtual void StartPick( ) { } + virtual void EndPick( ) { } + virtual void StartSlice( ) { } + virtual void EndSlice( ) { } + virtual void StartWindowLevel( ); + virtual void EndWindowLevel( ); + + // New events + virtual void StartCursorMoving( ); + virtual void EndCursorMoving( ); + virtual void StartRadiusMoving( ); + virtual void EndRadiusMoving( ); + + protected: + ImageInteractorStyle( ); + virtual ~ImageInteractorStyle( ); + + void _RenderAssociateInteractors( ); + bool _PickPosition( double pos[ 3 ] ); + void _UpdateCursor( ); + void _UpdateRadius( ); + + private: + // Purposely not implemented + ImageInteractorStyle( const Self& ); + Self& operator=( const Self& ); + + protected: + Self::InteractionMode Mode; + + ImageSliceActors* m_SliceActors; + MPRActors* m_MPRActors; + + vtkSmartPointer< vtkOrientationMarkerWidget > OrientationWidget; + vtkSmartPointer< vtkPropPicker > PropPicker; + + std::vector< vtkRenderWindowInteractor* > AssociatedInteractors; + + bool CursorMoving; + double Cursor[ 3 ]; + + bool RadiusMoving; + double Radius[ 3 ]; + vtkSmartPointer< vtkPolyData > Circle; + vtkSmartPointer< vtkPolyDataMapper > CircleMapper; + vtkSmartPointer< vtkActor > CircleActor; + + public: + static const int CursorEvent; + static const int RadiusEvent; + static const int DoubleClickEvent; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Visualization/ImageSliceActors.h b/lib/cpExtensions/Visualization/ImageSliceActors.h index 3991ab3..37aeac4 100644 --- a/lib/cpExtensions/Visualization/ImageSliceActors.h +++ b/lib/cpExtensions/Visualization/ImageSliceActors.h @@ -13,15 +13,15 @@ #include // ------------------------------------------------------------------------- -#define cpPlugins_ImageSliceActors( name, type ) \ - inline type* Get##name##Actor( ) const \ - { \ - return( \ - dynamic_cast< type* >( \ - const_cast< Self* >( this )-> \ - GetItemAsObject( this->name##ActorIndex ) \ - ) \ - ); \ +#define cpPlugins_ImageSliceActors( name, type ) \ + inline type* Get##name##Actor( ) const \ + { \ + return( \ + dynamic_cast< type* >( \ + const_cast< Self* >( this )-> \ + GetItemAsObject( this->name##ActorIndex ) \ + ) \ + ); \ } // ------------------------------------------------------------------------- @@ -30,66 +30,66 @@ class vtkImageData; // ------------------------------------------------------------------------- namespace cpExtensions +{ + namespace Visualization { - namespace Visualization + /** + */ + class cpExtensions_EXPORT ImageSliceActors + : public vtkPropCollection { - /** - */ - class cpExtensions_EXPORT ImageSliceActors - : public vtkPropCollection - { - public: - typedef ImageSliceActors Self; - - public: - vtkTypeMacro( ImageSliceActors, vtkPropCollection ); - - cpPlugins_ImageSliceActors( Image, vtkImageActor ); - cpPlugins_ImageSliceActors( Text, vtkTextActor ); - cpPlugins_ImageSliceActors( Plane, vtkActor ); - - public: - // Creation - static ImageSliceActors* New( ); - - void SetInputConnection( vtkAlgorithmOutput* aout, int axis ); - void SetInputData( vtkImageData* data, int axis ); - - double* GetDisplayBounds( ) const; - void GetDisplayBounds( double bounds[ 6 ] ) const; - - int GetAxis( ) const; - int GetSliceNumber( ) const; - int GetSliceNumberMinValue( ) const; - int GetSliceNumberMaxValue( ) const; - void SetSliceNumber( const int& slice ); - void UpdateText( ); - - protected: - ImageSliceActors( ); - virtual ~ImageSliceActors( ); - - private: - // Purposely not implemented - ImageSliceActors( const Self& ); - Self& operator=( const Self& ); - - protected: - vtkSmartPointer< vtkImageSliceMapper > SliceMapper; - vtkSmartPointer< vtkPolyData > PlaneSource; - vtkSmartPointer< vtkPolyDataMapper > PlaneMapper; - char TextBuffer[ 1024 ]; - - vtkSmartPointer< vtkImageActor > ImageActor; - vtkSmartPointer< vtkTextActor > TextActor; - vtkSmartPointer< vtkActor > PlaneActor; - - unsigned int ImageActorIndex; - unsigned int TextActorIndex; - unsigned int PlaneActorIndex; - }; - - } // ecapseman + public: + typedef ImageSliceActors Self; + + public: + vtkTypeMacro( ImageSliceActors, vtkPropCollection ); + + cpPlugins_ImageSliceActors( Image, vtkImageActor ); + cpPlugins_ImageSliceActors( Text, vtkTextActor ); + cpPlugins_ImageSliceActors( Plane, vtkActor ); + + public: + // Creation + static ImageSliceActors* New( ); + + void SetInputConnection( vtkAlgorithmOutput* aout, int axis ); + void SetInputData( vtkImageData* data, int axis ); + + double* GetDisplayBounds( ) const; + void GetDisplayBounds( double bounds[ 6 ] ) const; + + int GetAxis( ) const; + int GetSliceNumber( ) const; + int GetSliceNumberMinValue( ) const; + int GetSliceNumberMaxValue( ) const; + void SetSliceNumber( const int& slice ); + void UpdateText( ); + + protected: + ImageSliceActors( ); + virtual ~ImageSliceActors( ); + + private: + // Purposely not implemented + ImageSliceActors( const Self& ); + Self& operator=( const Self& ); + + protected: + vtkSmartPointer< vtkImageSliceMapper > SliceMapper; + vtkSmartPointer< vtkPolyData > PlaneSource; + vtkSmartPointer< vtkPolyDataMapper > PlaneMapper; + char TextBuffer[ 1024 ]; + + vtkSmartPointer< vtkImageActor > ImageActor; + vtkSmartPointer< vtkTextActor > TextActor; + vtkSmartPointer< vtkActor > PlaneActor; + + unsigned int ImageActorIndex; + unsigned int TextActorIndex; + unsigned int PlaneActorIndex; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Visualization/MPRActors.h b/lib/cpExtensions/Visualization/MPRActors.h index 8cdfe5a..85c7b63 100644 --- a/lib/cpExtensions/Visualization/MPRActors.h +++ b/lib/cpExtensions/Visualization/MPRActors.h @@ -16,97 +16,97 @@ class vtkWindowLevelLookupTable; // ------------------------------------------------------------------------- namespace cpExtensions +{ + namespace Visualization { - namespace Visualization + /** + */ + class cpExtensions_EXPORT MPRActors + : public vtkPropCollection { - /** - */ - class cpExtensions_EXPORT MPRActors - : public vtkPropCollection - { - public: - typedef MPRActors Self; - - public: - vtkTypeMacro( MPRActors, vtkPropCollection ); - - cpPlugins_ImageSliceActors( ImageOutline, vtkImageActor ); - - public: - // Creation - static MPRActors* New( ); - - ImageSliceActors* GetSliceActors( const int& i ) const; - void SetInputConnection( vtkAlgorithmOutput* aout ); - void SetInputData( vtkImageData* image ); - - void PushDataInto( - vtkRenderer* x, - vtkRenderer* y, - vtkRenderer* z, - vtkRenderer* w - ); - void PopDataFrom( - vtkRenderer* x, - vtkRenderer* y, - vtkRenderer* z, - vtkRenderer* w - ); - - // Lookup table methods - vtkScalarsToColors* GetLookupTable( ) const; - void SetLookupTable( vtkScalarsToColors* lut ); - - // Grayscale window/level lookup - vtkWindowLevelLookupTable* GetLookupTableAsWindowLevel( ) const; - void SetLookupTableToWindowLevel( ); - double GetMinWindow( ) const; - double GetMaxWindow( ) const; - double GetMinLevel( ) const; - double GetMaxLevel( ) const; - double GetWindow( ) const; - double GetLevel( ) const; - void SetWindow( const double& w ); - void SetLevel( const double& l ); - void SetWindowLevel( const double& w, const double& l ); - void ResetWindowLevel( ); - - // Slice access - int GetSliceNumberMinValue( const int& axis ) const; - int GetSliceNumberMaxValue( const int& axis ) const; - int GetSlice( const int& axis ) const; - void SetSlice( const int& axis, const int& slice ); - void SetSlice( const int& axis, const double& slice ); - void ResetSlices( ); - - // General accessors - void GetImageBounds( double bounds[ 6 ] ) const; - - protected: - MPRActors( ); - virtual ~MPRActors( ); - - vtkImageData* _InputImage( ) const; - void _UpdateSlices( ); - - private: - // Purposely not implemented - MPRActors( const Self& ); - Self& operator=( const Self& ); - - protected: - vtkSmartPointer< vtkImageMapToColors > ImageMapToColors; - vtkSmartPointer< vtkActor > ImageOutlineActor; - - typedef - cpExtensions::Visualization::ImageSliceActors - _TSlice; - vtkSmartPointer< _TSlice > Slices[ 3 ]; - - unsigned int ImageOutlineActorIndex; - }; - - } // ecapseman + public: + typedef MPRActors Self; + + public: + vtkTypeMacro( MPRActors, vtkPropCollection ); + + cpPlugins_ImageSliceActors( ImageOutline, vtkImageActor ); + + public: + // Creation + static MPRActors* New( ); + + ImageSliceActors* GetSliceActors( const int& i ) const; + void SetInputConnection( vtkAlgorithmOutput* aout ); + void SetInputData( vtkImageData* image ); + + void PushDataInto( + vtkRenderer* x, + vtkRenderer* y, + vtkRenderer* z, + vtkRenderer* w + ); + void PopDataFrom( + vtkRenderer* x, + vtkRenderer* y, + vtkRenderer* z, + vtkRenderer* w + ); + + // Lookup table methods + vtkScalarsToColors* GetLookupTable( ) const; + void SetLookupTable( vtkScalarsToColors* lut ); + + // Grayscale window/level lookup + vtkWindowLevelLookupTable* GetLookupTableAsWindowLevel( ) const; + void SetLookupTableToWindowLevel( ); + double GetMinWindow( ) const; + double GetMaxWindow( ) const; + double GetMinLevel( ) const; + double GetMaxLevel( ) const; + double GetWindow( ) const; + double GetLevel( ) const; + void SetWindow( const double& w ); + void SetLevel( const double& l ); + void SetWindowLevel( const double& w, const double& l ); + void ResetWindowLevel( ); + + // Slice access + int GetSliceNumberMinValue( const int& axis ) const; + int GetSliceNumberMaxValue( const int& axis ) const; + int GetSlice( const int& axis ) const; + void SetSlice( const int& axis, const int& slice ); + void SetSlice( const int& axis, const double& slice ); + void ResetSlices( ); + + // General accessors + void GetImageBounds( double bounds[ 6 ] ) const; + + protected: + MPRActors( ); + virtual ~MPRActors( ); + + vtkImageData* _InputImage( ) const; + void _UpdateSlices( ); + + private: + // Purposely not implemented + MPRActors( const Self& ); + Self& operator=( const Self& ); + + protected: + vtkSmartPointer< vtkImageMapToColors > ImageMapToColors; + vtkSmartPointer< vtkActor > ImageOutlineActor; + + typedef + cpExtensions::Visualization::ImageSliceActors + _TSlice; + vtkSmartPointer< _TSlice > Slices[ 3 ]; + + unsigned int ImageOutlineActorIndex; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Visualization/MPRWithDifferentWindows.cxx b/lib/cpExtensions/Visualization/MPRWithDifferentWindows.cxx index 076b09b..cf0a68c 100644 --- a/lib/cpExtensions/Visualization/MPRWithDifferentWindows.cxx +++ b/lib/cpExtensions/Visualization/MPRWithDifferentWindows.cxx @@ -110,7 +110,7 @@ SetModeToNavigation( ) { if( this->m_Styles[ i ].GetPointer( ) != NULL ) this->m_Styles[ i ]->SetModeToNavigation( ); - + } // rof } @@ -122,7 +122,7 @@ SetModeToDeformation( ) { if( this->m_Styles[ i ].GetPointer( ) != NULL ) this->m_Styles[ i ]->SetModeToDeformation( ); - + } // rof } diff --git a/lib/cpExtensions/Visualization/MPRWithDifferentWindows.h b/lib/cpExtensions/Visualization/MPRWithDifferentWindows.h index d2c10b5..2b5a4e7 100644 --- a/lib/cpExtensions/Visualization/MPRWithDifferentWindows.h +++ b/lib/cpExtensions/Visualization/MPRWithDifferentWindows.h @@ -12,77 +12,77 @@ // ------------------------------------------------------------------------- #define cpPlugins_MPRWithDifferentWindows_ObserverMacro( e ) \ -inline void Add##e##Observer( vtkCommand* observer ) \ -{ \ - for( int i = 0; i < 3; ++i ) \ - if( this->m_Styles[ i ].GetPointer( ) != NULL ) \ - this->m_Styles[ i ]->Add##e##Observer( observer ); \ -} \ -inline void Remove##e##Observer( vtkCommand* observer ) \ -{ \ - for( int i = 0; i < 3; ++i ) \ - if( this->m_Styles[ i ].GetPointer( ) != NULL ) \ - this->m_Styles[ i ]->Remove##e##Observer( observer ); \ -} \ -inline void Remove##e##Observers( ) \ -{ \ - for( int i = 0; i < 3; ++i ) \ - if( this->m_Styles[ i ].GetPointer( ) != NULL ) \ - this->m_Styles[ i ]->Remove##e##Observers( ); \ -} + inline void Add##e##Observer( vtkCommand* observer ) \ + { \ + for( int i = 0; i < 3; ++i ) \ + if( this->m_Styles[ i ].GetPointer( ) != NULL ) \ + this->m_Styles[ i ]->Add##e##Observer( observer ); \ + } \ + inline void Remove##e##Observer( vtkCommand* observer ) \ + { \ + for( int i = 0; i < 3; ++i ) \ + if( this->m_Styles[ i ].GetPointer( ) != NULL ) \ + this->m_Styles[ i ]->Remove##e##Observer( observer ); \ + } \ + inline void Remove##e##Observers( ) \ + { \ + for( int i = 0; i < 3; ++i ) \ + if( this->m_Styles[ i ].GetPointer( ) != NULL ) \ + this->m_Styles[ i ]->Remove##e##Observers( ); \ + } namespace cpExtensions +{ + namespace Visualization { - namespace Visualization + /** + */ + class cpExtensions_EXPORT MPRWithDifferentWindows { - /** - */ - class cpExtensions_EXPORT MPRWithDifferentWindows - { - public: - typedef cpExtensions::Visualization:: + public: + typedef cpExtensions::Visualization:: MPRActors TMPRActors; - typedef cpExtensions::Visualization:: + typedef cpExtensions::Visualization:: ImageInteractorStyle TStyle; - public: - cpPlugins_MPRWithDifferentWindows_ObserverMacro( DoubleClick ); - cpPlugins_MPRWithDifferentWindows_ObserverMacro( Cursor ); - cpPlugins_MPRWithDifferentWindows_ObserverMacro( Radius ); + public: + cpPlugins_MPRWithDifferentWindows_ObserverMacro( DoubleClick ); + cpPlugins_MPRWithDifferentWindows_ObserverMacro( Cursor ); + cpPlugins_MPRWithDifferentWindows_ObserverMacro( Radius ); - public: - MPRWithDifferentWindows( - vtkRenderWindow* xWin = NULL, - vtkRenderWindow* yWin = NULL, - vtkRenderWindow* zWin = NULL, - vtkRenderWindow* auxWin = NULL - ); - virtual ~MPRWithDifferentWindows( ); + public: + MPRWithDifferentWindows( + vtkRenderWindow* xWin = NULL, + vtkRenderWindow* yWin = NULL, + vtkRenderWindow* zWin = NULL, + vtkRenderWindow* auxWin = NULL + ); + virtual ~MPRWithDifferentWindows( ); - void SetImage( vtkImageData* image ); - void SetModeToNavigation( ); - void SetModeToDeformation( ); + void SetImage( vtkImageData* image ); + void SetModeToNavigation( ); + void SetModeToDeformation( ); - void ResetCamera( const int& id ); - void ResetCameras( ); - void Render( const int& id ); - void RenderAll( ); + void ResetCamera( const int& id ); + void ResetCameras( ); + void Render( const int& id ); + void RenderAll( ); - vtkRenderer* GetRenderer( const int& id ) const; + vtkRenderer* GetRenderer( const int& id ) const; - void Add3DActor( vtkProp3D* prop ); + void Add3DActor( vtkProp3D* prop ); - protected: - // Inputs - vtkRenderWindow* m_Windows[ 4 ]; + protected: + // Inputs + vtkRenderWindow* m_Windows[ 4 ]; - // Internal pipelines - vtkSmartPointer< TMPRActors > m_MPRActors; - vtkSmartPointer< vtkRenderer > m_Renderers[ 4 ]; - vtkSmartPointer< TStyle > m_Styles[ 3 ]; - }; + // Internal pipelines + vtkSmartPointer< TMPRActors > m_MPRActors; + vtkSmartPointer< vtkRenderer > m_Renderers[ 4 ]; + vtkSmartPointer< TStyle > m_Styles[ 3 ]; + }; - } // ecapseman + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Visualization/MeshMapper.h b/lib/cpExtensions/Visualization/MeshMapper.h index e72ba03..e833f12 100644 --- a/lib/cpExtensions/Visualization/MeshMapper.h +++ b/lib/cpExtensions/Visualization/MeshMapper.h @@ -9,90 +9,90 @@ class vtkInformation; class vtkRenderer; namespace cpExtensions +{ + namespace Visualization { - namespace Visualization + /** + */ + template< class M > + class MeshMapper + : public vtkMapper { - /** - */ - template< class M > - class MeshMapper - : public vtkMapper - { - public: - typedef MeshMapper Self; - vtkTypeMacro( MeshMapper, vtkMapper ); - - typedef M TMesh; - typedef typename M::PointType TPoint; - typedef typename TPoint::VectorType TVector; - typedef typename TPoint::CoordRepType TScalar; - itkStaticConstMacro( Dimension, unsigned int, M::PointDimension ); - - // Begin concept checking + public: + typedef MeshMapper Self; + vtkTypeMacro( MeshMapper, vtkMapper ); + + typedef M TMesh; + typedef typename M::PointType TPoint; + typedef typename TPoint::VectorType TVector; + typedef typename TPoint::CoordRepType TScalar; + itkStaticConstMacro( Dimension, unsigned int, M::PointDimension ); + + // Begin concept checking #ifdef ITK_USE_CONCEPT_CHECKING - /* TODO - itkConceptMacro( - InputMeshIsTwoOrThreeimensionalCheck, - ( itk::Concept::SameDimensionOrMinusOne< Self::Dimension, 3 > ) - ); - itkConceptMacro( - ScalarTypeHasFloatResolution, - ( itk::Concept::IsFloatingPoint< TScalar > ) - ); - */ + /* TODO + itkConceptMacro( + InputMeshIsTwoOrThreeimensionalCheck, + ( itk::Concept::SameDimensionOrMinusOne< Self::Dimension, 3 > ) + ); + itkConceptMacro( + ScalarTypeHasFloatResolution, + ( itk::Concept::IsFloatingPoint< TScalar > ) + ); + */ #endif - // End concept checking - - public: - // TODO: static Self* New( ); - virtual void ShallowCopy( vtkAbstractMapper* m ); - - virtual void SetInputData( M* in ); - virtual M* GetInput( ); - virtual const M* GetInput( ) const; - - virtual double* GetBounds( ); - virtual void GetBounds( double bounds[ 6 ] ); - - virtual void RenderPiece( vtkRenderer* aren, vtkActor* act ) = 0; - virtual void Render( vtkRenderer* aren, vtkActor* act ); - virtual void Update( ); - virtual void Update( int port ); - - virtual void MapDataArrayToVertexAttribute( - const char* vertexAttributeName, - const char* dataArrayName, - int fieldAssociation, - int componentno = -1 - ); - virtual void MapDataArrayToMultiTextureAttribute( - int unit, - const char* dataArrayName, - int fieldAssociation, - int componentno = -1 - ); - virtual void RemoveVertexAttributeMapping( - const char* vertexAttributeName - ); - virtual void RemoveAllVertexAttributeMappings( ); - - protected: - MeshMapper( ); - virtual ~MeshMapper( ); - - virtual void ComputeBounds( ); - virtual int FillInputPortInformation( int port, vtkInformation* info ); - - private: - // These methods aren't supposed to be implemented - MeshMapper( const Self& other ); - Self& operator=( const Self& other ); - - protected: - typename M::Pointer Mesh; - }; - - } // ecapseman + // End concept checking + + public: + // TODO: static Self* New( ); + virtual void ShallowCopy( vtkAbstractMapper* m ); + + virtual void SetInputData( M* in ); + virtual M* GetInput( ); + virtual const M* GetInput( ) const; + + virtual double* GetBounds( ); + virtual void GetBounds( double bounds[ 6 ] ); + + virtual void RenderPiece( vtkRenderer* aren, vtkActor* act ) = 0; + virtual void Render( vtkRenderer* aren, vtkActor* act ); + virtual void Update( ); + virtual void Update( int port ); + + virtual void MapDataArrayToVertexAttribute( + const char* vertexAttributeName, + const char* dataArrayName, + int fieldAssociation, + int componentno = -1 + ); + virtual void MapDataArrayToMultiTextureAttribute( + int unit, + const char* dataArrayName, + int fieldAssociation, + int componentno = -1 + ); + virtual void RemoveVertexAttributeMapping( + const char* vertexAttributeName + ); + virtual void RemoveAllVertexAttributeMappings( ); + + protected: + MeshMapper( ); + virtual ~MeshMapper( ); + + virtual void ComputeBounds( ); + virtual int FillInputPortInformation( int port, vtkInformation* info ); + + private: + // These methods aren't supposed to be implemented + MeshMapper( const Self& other ); + Self& operator=( const Self& other ); + + protected: + typename M::Pointer Mesh; + }; + + } // ecapseman } // ecapseman diff --git a/lib/cpExtensions/Visualization/OpenGLMeshMapper.h b/lib/cpExtensions/Visualization/OpenGLMeshMapper.h index 6a959e3..02ffeac 100644 --- a/lib/cpExtensions/Visualization/OpenGLMeshMapper.h +++ b/lib/cpExtensions/Visualization/OpenGLMeshMapper.h @@ -6,69 +6,69 @@ #include namespace cpExtensions +{ + namespace Visualization { - namespace Visualization + /** + */ + template< class M > + class OpenGLMeshMapper + : public MeshMapper< M > { - /** - */ - template< class M > - class OpenGLMeshMapper - : public MeshMapper< M > - { - public: - typedef OpenGLMeshMapper Self; - vtkTypeMacro( OpenGLMeshMapper, MeshMapper< M > ); - - typedef typename Superclass::TMesh TMesh; - typedef typename Superclass::TPoint TPoint; - typedef typename Superclass::TVector TVector; - typedef typename Superclass::TScalar TScalar; - - protected: - typedef unsigned int TIndex; - typedef typename M::CellType TCell; - typedef typename M::CellsContainer TCellsContainer; - typedef typename TCellsContainer::ConstIterator TCellIt; - - public: - virtual const char* GetNameOfClass( ) const - { return( "cpExtensions::OpenGLMeshMapper" ); } - static Self* New( ); - - virtual void RenderPiece( vtkRenderer* aren, vtkActor* act ); - virtual void ReleaseGraphicsResources( vtkWindow* win ); - virtual int Draw( vtkRenderer* aren, vtkActor* act ); - - protected: - OpenGLMeshMapper( ); - virtual ~OpenGLMeshMapper( ); - - bool _ConfigureOpenGL( ); - - private: - // Purposely not implemented - OpenGLMeshMapper( const Self& other ); - Self& operator=( const Self& other ); - - protected: - vtkIdType TotalCells; - // TODO: vtkSmartPointer< vtkOpenGLTexture > InternalColorTexture; - - bool FirstRendering; - - bool VBOSupported; - unsigned int VBOID1, VBOID2; - - std::vector< unsigned int > Sizes; - std::vector< TIndex > Indices; - long IndexElementType; - long ElementValueType; - }; - - } // ecapseman + public: + typedef OpenGLMeshMapper Self; + vtkTypeMacro( OpenGLMeshMapper, MeshMapper< M > ); + + typedef typename Superclass::TMesh TMesh; + typedef typename Superclass::TPoint TPoint; + typedef typename Superclass::TVector TVector; + typedef typename Superclass::TScalar TScalar; + + protected: + typedef unsigned int TIndex; + typedef typename M::CellType TCell; + typedef typename M::CellsContainer TCellsContainer; + typedef typename TCellsContainer::ConstIterator TCellIt; + + public: + virtual const char* GetNameOfClass( ) const + { return( "cpExtensions::OpenGLMeshMapper" ); } + static Self* New( ); + + virtual void RenderPiece( vtkRenderer* aren, vtkActor* act ); + virtual void ReleaseGraphicsResources( vtkWindow* win ); + virtual int Draw( vtkRenderer* aren, vtkActor* act ); + + protected: + OpenGLMeshMapper( ); + virtual ~OpenGLMeshMapper( ); + + bool _ConfigureOpenGL( ); + + private: + // Purposely not implemented + OpenGLMeshMapper( const Self& other ); + Self& operator=( const Self& other ); + + protected: + vtkIdType TotalCells; + // TODO: vtkSmartPointer< vtkOpenGLTexture > InternalColorTexture; + + bool FirstRendering; + + bool VBOSupported; + unsigned int VBOID1, VBOID2; + + std::vector< unsigned int > Sizes; + std::vector< TIndex > Indices; + long IndexElementType; + long ElementValueType; + }; } // ecapseman +} // ecapseman + #include #endif // __CPEXTENSIONS__VISUALIZATION__OPENGLMESHMAPPER__H__ diff --git a/lib/cpExtensions/Visualization/OpenGLMeshMapper.hxx b/lib/cpExtensions/Visualization/OpenGLMeshMapper.hxx index 61a9e1a..ab2fc60 100644 --- a/lib/cpExtensions/Visualization/OpenGLMeshMapper.hxx +++ b/lib/cpExtensions/Visualization/OpenGLMeshMapper.hxx @@ -131,14 +131,14 @@ RenderPiece( vtkRenderer* aren, vtkActor* act ) if( this->ColorTextureMap ) { /* TODO - if( !this->InternalColorTexture ) - { - this->InternalColorTexture = - vtkSmartPointer< vtkOpenGLTexture >::New( ); - this->InternalColorTexture->RepeatOff( ); - - } // fi - this->InternalColorTexture->SetInputData( this->ColorTextureMap ); + if( !this->InternalColorTexture ) + { + this->InternalColorTexture = + vtkSmartPointer< vtkOpenGLTexture >::New( ); + this->InternalColorTexture->RepeatOff( ); + + } // fi + this->InternalColorTexture->SetInputData( this->ColorTextureMap ); */ // Keep color from interacting with texture. diff --git a/lib/cpExtensions/Visualization/SeedWidgetCorrector.h b/lib/cpExtensions/Visualization/SeedWidgetCorrector.h index 13bd75c..541d60c 100644 --- a/lib/cpExtensions/Visualization/SeedWidgetCorrector.h +++ b/lib/cpExtensions/Visualization/SeedWidgetCorrector.h @@ -9,34 +9,34 @@ class vtkCellPicker; class vtkSeedWidget; namespace cpExtensions +{ + namespace Visualization { - namespace Visualization + /** + */ + class cpExtensions_EXPORT SeedWidgetCorrector + : public vtkCommand { - /** - */ - class cpExtensions_EXPORT SeedWidgetCorrector - : public vtkCommand - { - public: - static SeedWidgetCorrector* New( ); - - void Configure( vtkCellPicker* picker ); - - virtual void Execute( - vtkObject* caller, - unsigned long eventId, - void* arguments - ); - - protected: - SeedWidgetCorrector( ); - virtual ~SeedWidgetCorrector( ); - - protected: - vtkCellPicker* m_Picker; - }; - - } // ecapseman + public: + static SeedWidgetCorrector* New( ); + + void Configure( vtkCellPicker* picker ); + + virtual void Execute( + vtkObject* caller, + unsigned long eventId, + void* arguments + ); + + protected: + SeedWidgetCorrector( ); + virtual ~SeedWidgetCorrector( ); + + protected: + vtkCellPicker* m_Picker; + }; + + } // ecapseman } // ecapseman -- 2.45.1