20 #ifndef __itkBoundingBox_txx
21 #define __itkBoundingBox_txx
23 #include "itkNumericTraits.h"
32 template <
typename TPointIdentifier,
int VPointDimension,
33 typename TCoordRep,
typename TPointsContainer>
38 Superclass::PrintSelf(os, indent);
40 os << indent <<
"Bounding Box: ( ";
41 for (
unsigned int i=0; i<PointDimension; i++)
43 os << m_Bounds[2*i] <<
"," << m_Bounds[2*i+1] <<
" ";
45 os <<
" )" << std::endl;
51 template <
typename TPointIdentifier,
int VPointDimension,
52 typename TCoordRep,
typename TPointsContainer>
57 itkDebugMacro(
"setting Points container to " << points);
58 if(m_PointsContainer.GetPointer() != points)
60 m_PointsContainer = points;
66 template <
typename TPointIdentifier,
int VPointDimension,
67 typename TCoordRep,
typename TPointsContainer>
68 const typename BoundingBox<TPointIdentifier , VPointDimension, TCoordRep,
69 TPointsContainer >::PointsContainer *
73 itkDebugMacro(
"returning Points container of " << m_PointsContainer );
75 return m_PointsContainer.GetPointer();
79 template <
typename TPointIdentifier,
int VPointDimension,
80 typename TCoordRep,
typename TPointsContainer>
81 const typename BoundingBox<TPointIdentifier , VPointDimension, TCoordRep,
82 TPointsContainer >::PointsContainer *
86 m_CornersContainer->clear();
91 for (
unsigned int i=0; i<VPointDimension; i++)
93 radius[i] = m_Bounds[2*i+1]-center[i];
96 for(
unsigned int j=0;j<vcl_pow(2.0,(
double)VPointDimension);j++)
99 for(
unsigned int i=0; i<VPointDimension;i++)
101 pnt[i]=center[i]+vcl_pow(-1.0,((
double)(j/(
int(vcl_pow(2.0,(
double)i))))))
106 m_CornersContainer->InsertElement(m_CornersContainer->Size(),pnt);
110 return m_CornersContainer.GetPointer();
114 template <
typename TPointIdentifier,
int VPointDimension,
115 typename TCoordRep,
typename TPointsContainer>
119 m_Bounds.Fill( NumericTraits< CoordRepType >::Zero );
120 m_CornersContainer = PointsContainer::New();
123 template <
typename TPointIdentifier,
int VPointDimension,
124 typename TCoordRep,
typename TPointsContainer>
130 template <
typename TPointIdentifier,
int VPointDimension,
131 typename TCoordRep,
typename TPointsContainer>
136 if ( !m_PointsContainer )
138 if ( this->GetMTime() > m_BoundsMTime )
140 m_Bounds.Fill( NumericTraits< CoordRepType >::Zero );
141 m_BoundsMTime.Modified();
146 if ( this->GetMTime() > m_BoundsMTime )
150 if(m_PointsContainer->Size() < 1)
152 m_Bounds.Fill( NumericTraits< CoordRepType >::Zero );
153 m_BoundsMTime.Modified();
159 for (
unsigned int i=0; i < PointDimension; i++)
161 m_Bounds[2*i ] = point[i];
162 m_Bounds[2*i+1] = point[i];
168 while( ci != m_PointsContainer->End() )
171 for (
unsigned int i=0; i<PointDimension; i++)
173 if ( point[i] < m_Bounds[2*i] )
175 m_Bounds[2*i] = point[i];
177 if ( point[i] > m_Bounds[2*i+1] )
179 m_Bounds[2*i+1] = point[i];
185 m_BoundsMTime.Modified();
192 template <
typename TPointIdentifier,
int VPointDimension,
193 typename TCoordRep,
typename TPointsContainer>
194 typename BoundingBox<TPointIdentifier,VPointDimension,TCoordRep,
195 TPointsContainer>::PointType
199 this->ComputeBoundingBox();
202 for (
unsigned int i=0; i<PointDimension; i++)
204 center[i] = (m_Bounds[2*i] + m_Bounds[2*i+1]) / 2.0;
210 template <
typename TPointIdentifier,
int VPointDimension,
211 typename TCoordRep,
typename TPointsContainer>
212 typename BoundingBox<TPointIdentifier,VPointDimension,TCoordRep,
213 TPointsContainer>::PointType
217 this->ComputeBoundingBox();
220 for (
unsigned int i=0; i<PointDimension; i++)
222 minimum[i] = m_Bounds[2*i];
228 template <
typename TPointIdentifier,
int VPointDimension,
229 typename TCoordRep,
typename TPointsContainer>
234 for (
unsigned int i=0; i<PointDimension; i++)
236 m_Bounds[2*i] = point[i];
239 m_BoundsMTime.Modified();
242 template <
typename TPointIdentifier,
int VPointDimension,
243 typename TCoordRep,
typename TPointsContainer>
244 typename BoundingBox<TPointIdentifier,VPointDimension,TCoordRep,
245 TPointsContainer>::PointType
249 this->ComputeBoundingBox();
252 for (
unsigned int i=0; i<PointDimension; i++)
254 maximum[i] = m_Bounds[2*i+1];
260 template <
typename TPointIdentifier,
int VPointDimension,
261 typename TCoordRep,
typename TPointsContainer>
266 for (
unsigned int i=0; i<PointDimension; i++)
268 m_Bounds[2*i+1] = point[i];
271 m_BoundsMTime.Modified();
274 template <
typename TPointIdentifier,
int VPointDimension,
275 typename TCoordRep,
typename TPointsContainer>
280 bool changed =
false;
281 for (
unsigned int i=0; i<PointDimension; i++)
283 if ( point[i] < m_Bounds[2*i] )
285 m_Bounds[2*i] = point[i];
288 if ( point[i] > m_Bounds[2*i+1] )
290 m_Bounds[2*i+1] = point[i];
297 m_BoundsMTime.Modified();
301 template <
typename TPointIdentifier,
int VPointDimension,
302 typename TCoordRep,
typename TPointsContainer>
303 typename BoundingBox<TPointIdentifier,VPointDimension,TCoordRep,
304 TPointsContainer>::AccumulateType
308 typename NumericTraits<CoordRepType>::AccumulateType
309 dist2 = NumericTraits<CoordRepType>::Zero;
311 if ( this->ComputeBoundingBox() )
313 for (
unsigned int i=0; i<PointDimension; i++)
315 dist2 += (m_Bounds[2*i]-m_Bounds[2*i+1]) *
316 (m_Bounds[2*i]-m_Bounds[2*i+1]);
324 template <
typename TPointIdentifier,
int VPointDimension,
325 typename TCoordRep,
typename TPointsContainer>
332 while( i<PointDimension )
334 if( point[i] < m_Bounds[j++] )
338 if( point[i] > m_Bounds[j++] )
347 template <
typename TPointIdentifier,
int VPointDimension,
348 typename TCoordRep,
typename TPointsContainer>
354 if( m_PointsContainer )
356 if( latestTime < m_PointsContainer->GetMTime() )
358 latestTime = m_PointsContainer->GetMTime();
364 template <
typename TPointIdentifier,
int VPointDimension,
365 typename TCoordRep,
typename TPointsContainer>
366 typename BoundingBox<TPointIdentifier,VPointDimension,TCoordRep,
367 TPointsContainer>::Pointer
374 clone->SetPoints( this->m_PointsContainer );
377 clone->m_CornersContainer->clear();
382 clone->m_CornersContainer->Reserve( this->m_CornersContainer->Size() );
387 dest.Value() = itr.Value();
392 for(
unsigned int i=0; i < 2*PointDimension; i++ )
394 clone->m_Bounds[i] = this->m_Bounds[i];