1 #ifndef __CPPLUGINS__BOUNDINGBOX__HXX__
2 #define __CPPLUGINS__BOUNDINGBOX__HXX__
4 #include <cpPlugins/Image.h>
5 #include <cpPlugins/Mesh.h>
6 #include <itkBoundingBox.h>
7 #include <itkPointSet.h>
9 // -------------------------------------------------------------------------
10 template< class _TPoint >
11 void cpPlugins::BoundingBox::
12 SetMinimum( const _TPoint& p )
14 this->_SetPoint( 0, p );
17 // -------------------------------------------------------------------------
18 template< class _TPoint >
19 void cpPlugins::BoundingBox::
20 SetMaximum( const _TPoint& p )
22 this->_SetPoint( 1, p );
25 // -------------------------------------------------------------------------
26 template< class _TPoint >
27 _TPoint cpPlugins::BoundingBox::
30 return( this->_GetPoint< _TPoint >( 0 ) );
33 // -------------------------------------------------------------------------
34 template< class _TPoint >
35 _TPoint cpPlugins::BoundingBox::
38 return( this->_GetPoint< _TPoint >( 1 ) );
41 // -------------------------------------------------------------------------
42 template< class _TPoint >
43 void cpPlugins::BoundingBox::
44 _SetPoint( unsigned int m, const _TPoint& p )
46 this->m_Points[ m ].clear( );
47 for( unsigned int d = 0; d < _TPoint::PointDimension; ++d )
48 this->m_Points[ m ].push_back( double( p[ d ] ) );
52 // -------------------------------------------------------------------------
53 template< class _TPoint >
54 _TPoint cpPlugins::BoundingBox::
55 _GetPoint( unsigned int m ) const
57 unsigned int dim = this->m_Points[ m ].size( );
58 dim = ( _TPoint::PointDimension < dim )? _TPoint::PointDimension: dim;
61 for( unsigned int d = 0; d < dim; ++d )
62 p[ d ] = this->m_Points[ m ][ d ];
66 // -------------------------------------------------------------------------
67 template< unsigned int _NDim >
68 bool cpPlugins::BoundingBox::
69 _ITKImage( itk::LightObject* o )
71 auto image = dynamic_cast< itk::ImageBase< _NDim >* >( o );
75 auto region = image->GetLargestPossibleRegion( );
76 auto i0 = region.GetIndex( );
77 auto i1 = i0 + region.GetSize( );
79 typename itk::ImageBase< _NDim >::PointType p0, p1;
80 image->TransformIndexToPhysicalPoint( i0, p0 );
81 image->TransformIndexToPhysicalPoint( i1, p1 );
82 this->m_Points[ 0 ].clear( );
83 this->m_Points[ 1 ].clear( );
85 for( unsigned int d = 0; d < _NDim; ++d )
87 this->m_Points[ 0 ].push_back( double( p0[ d ] ) );
88 this->m_Points[ 1 ].push_back( double( p1[ d ] ) );
95 // -------------------------------------------------------------------------
96 template< class _TScalar, unsigned int _NDim >
97 bool cpPlugins::BoundingBox::
98 _ITKPointSet( itk::LightObject* o )
100 typedef itk::PointSet< _TScalar, _NDim > _TPointSet;
101 typedef itk::BoundingBox< typename _TPointSet::PointIdentifier, _NDim, _TScalar, typename _TPointSet::PointsContainer > _TBBox;
103 auto ps = dynamic_cast< _TPointSet* >( o );
107 this->m_Points[ 0 ].clear( );
108 this->m_Points[ 1 ].clear( );
110 typename _TBBox::Pointer bb = _TBBox::New( );
111 bb->SetPoints( ps->GetPoints( ) );
112 if( bb->ComputeBoundingBox( ) )
114 auto p0 = bb->GetMinimum( );
115 auto p1 = bb->GetMaximum( );
116 for( unsigned int d = 0; d < _NDim; ++d )
118 this->m_Points[ 0 ].push_back( double( p0[ d ] ) );
119 this->m_Points[ 1 ].push_back( double( p1[ d ] ) );
129 #endif // __CPPLUGINS__BOUNDINGBOX__HXX__