]> Creatis software - cpPlugins.git/blob - lib/cpPlugins/BoundingBox.hxx
...
[cpPlugins.git] / lib / cpPlugins / BoundingBox.hxx
1 #ifndef __CPPLUGINS__BOUNDINGBOX__HXX__
2 #define __CPPLUGINS__BOUNDINGBOX__HXX__
3
4 #include <cpPlugins/Image.h>
5 #include <cpPlugins/Mesh.h>
6 #include <itkBoundingBox.h>
7 #include <itkPointSet.h>
8
9 // -------------------------------------------------------------------------
10 template< class _TPoint >
11 void cpPlugins::BoundingBox::
12 SetMinimum( const _TPoint& p )
13 {
14   this->_SetPoint( 0, p );
15 }
16
17 // -------------------------------------------------------------------------
18 template< class _TPoint >
19 void cpPlugins::BoundingBox::
20 SetMaximum( const _TPoint& p )
21 {
22   this->_SetPoint( 1, p );
23 }
24
25 // -------------------------------------------------------------------------
26 template< class _TPoint >
27 _TPoint cpPlugins::BoundingBox::
28 GetMinimum( ) const
29 {
30   return( this->_GetPoint< _TPoint >( 0 ) );
31 }
32
33 // -------------------------------------------------------------------------
34 template< class _TPoint >
35 _TPoint cpPlugins::BoundingBox::
36 GetMaximum( ) const
37 {
38   return( this->_GetPoint< _TPoint >( 1 ) );
39 }
40
41 // -------------------------------------------------------------------------
42 template< class _TPoint >
43 void cpPlugins::BoundingBox::
44 _SetPoint( unsigned int m, const _TPoint& p )
45 {
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 ] ) );
49   this->Modified( );
50 }
51
52 // -------------------------------------------------------------------------
53 template< class _TPoint >
54 _TPoint cpPlugins::BoundingBox::
55 _GetPoint( unsigned int m ) const
56 {
57   unsigned int dim = this->m_Points[ m ].size( );
58   dim = ( _TPoint::PointDimension < dim )? _TPoint::PointDimension: dim;
59   _TPoint p;
60   p.Fill( 0 );
61   for( unsigned int d = 0; d < dim; ++d )
62     p[ d ] = this->m_Points[ m ][ d ];
63   return( p );
64 }
65
66 // -------------------------------------------------------------------------
67 template< unsigned int _NDim >
68 bool cpPlugins::BoundingBox::
69 _ITKImage( itk::LightObject* o )
70 {
71   auto image = dynamic_cast< itk::ImageBase< _NDim >* >( o );
72   if( image == NULL )
73     return( false );
74
75   auto region = image->GetLargestPossibleRegion( );
76   auto i0 = region.GetIndex( );
77   auto i1 = i0 + region.GetSize( );
78
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( );
84
85   for( unsigned int d = 0; d < _NDim; ++d )
86   {
87     this->m_Points[ 0 ].push_back( double( p0[ d ] ) );
88     this->m_Points[ 1 ].push_back( double( p1[ d ] ) );
89
90   } // rof
91   this->Modified( );
92   return( true );
93 }
94
95 // -------------------------------------------------------------------------
96 template< class _TScalar, unsigned int _NDim >
97 bool cpPlugins::BoundingBox::
98 _ITKPointSet( itk::LightObject* o )
99 {
100   typedef itk::PointSet< _TScalar, _NDim > _TPointSet;
101   typedef itk::BoundingBox< typename _TPointSet::PointIdentifier, _NDim, _TScalar, typename _TPointSet::PointsContainer > _TBBox;
102
103   auto ps = dynamic_cast< _TPointSet* >( o );
104   if( ps == NULL )
105     return( false );
106
107   this->m_Points[ 0 ].clear( );
108   this->m_Points[ 1 ].clear( );
109
110   typename _TBBox::Pointer bb = _TBBox::New( );
111   bb->SetPoints( ps->GetPoints( ) );
112   if( bb->ComputeBoundingBox( ) )
113   {
114     auto p0 = bb->GetMinimum( );
115     auto p1 = bb->GetMaximum( );
116     for( unsigned int d = 0; d < _NDim; ++d )
117     {
118       this->m_Points[ 0 ].push_back( double( p0[ d ] ) );
119       this->m_Points[ 1 ].push_back( double( p1[ d ] ) );
120
121     } // rof
122     this->Modified( );
123     return( true );
124   }
125   else
126     return( false );
127 }
128
129 #endif // __CPPLUGINS__BOUNDINGBOX__HXX__
130
131 // eof - $RCSfile$