18 #ifndef __itkSpatialObject_txx
19 #define __itkSpatialObject_txx
22 #include "itkNumericTraits.h"
30 template<
unsigned int TDimension >
34 m_TypeName =
"SpatialObject";
35 m_Dimension = TDimension;
36 m_Bounds = BoundingBoxType::New();
38 m_Property = PropertyType::New();
41 m_ObjectToWorldTransform = TransformType::New();
42 m_ObjectToWorldTransform->SetIdentity();
43 m_ObjectToParentTransform = TransformType::New();
44 m_ObjectToParentTransform->SetIdentity();
45 m_IndexToWorldTransform = TransformType::New();
46 m_IndexToWorldTransform->SetIdentity();
48 m_BoundingBoxChildrenDepth=MaximumDepth;
51 m_AffineGeometryFrame = AffineGeometryFrameType::New();
52 m_AffineGeometryFrame->SetIndexToWorldTransform(m_IndexToWorldTransform);
54 m_TreeNode->Set(
this);
55 m_InternalInverseTransform = TransformType::New();
56 m_DefaultInsideValue = 1.0;
57 m_DefaultOutsideValue = 0.0;
61 template<
unsigned int TDimension >
70 template<
unsigned int TDimension >
75 typename ChildrenListType::iterator pos = m_InternalChildrenList.begin();
76 typename ChildrenListType::iterator it = m_InternalChildrenList.begin();
77 while( it != m_InternalChildrenList.end() )
81 m_InternalChildrenList.erase(pos);
83 m_InternalChildrenList.clear();
87 template<
unsigned int TDimension >
93 if( !IsEvaluableAt(point, depth, name) )
96 e.
SetLocation(
"SpatialObject< TDimension >::DerivateAt(\
97 const PointType, unsigned short, OutputVectorType & )");
98 e.
SetDescription(
"This spatial object is not evaluable at the point");
106 ValueAt(point, r, depth, name);
117 for(
unsigned short i=0; i<TDimension; i++, it++, it_v1++, it_v2++ )
123 const double * spacing = this->GetIndexToObjectTransform()->GetScale();
129 DerivativeAt(p1,order-1,v1, depth, name);
130 DerivativeAt(p2,order-1,v2, depth, name);
137 (*it) = ((*it_v2)-(*it_v1))/2;
143 template<
unsigned int TDimension >
151 TreeChildrenListType* children = m_TreeNode->GetChildren();
152 typename TreeChildrenListType::const_iterator it = children->begin();
153 typename TreeChildrenListType::const_iterator itEnd = children->end();
157 if( (*it)->Get()->IsInside(point, depth-1, name) )
171 template<
unsigned int TDimension >
180 TreeChildrenListType* children = m_TreeNode->GetChildren();
181 typename TreeChildrenListType::const_iterator it = children->begin();
182 typename TreeChildrenListType::const_iterator itEnd = children->end();
186 if( (*it)->Get()->IsEvaluableAt(point, depth-1, name) )
200 template<
unsigned int TDimension >
206 bool evaluable =
false;
210 TreeChildrenListType* children = m_TreeNode->GetChildren();
211 typename TreeChildrenListType::const_iterator it = children->begin();
212 typename TreeChildrenListType::const_iterator itEnd = children->end();
216 if( (*it)->Get()->IsEvaluableAt(point, depth-1, name) )
218 (*it)->Get()->ValueAt(point,value, depth-1, name);
235 template<
unsigned int TDimension >
240 Superclass::PrintSelf(os, indent);
241 os <<
"Bounding Box:" << std::endl;
242 os << indent << m_Bounds << std::endl;
243 os <<
"Geometric properties:" << std::endl;
244 os << indent <<
"Object to World Transform: " << m_ObjectToWorldTransform
246 os << indent <<
"Index to World Transform: " << m_IndexToWorldTransform
248 os << std::endl << std::endl;
249 os << indent <<
"Bounding Box Children Depth: " << m_BoundingBoxChildrenDepth
251 os << indent <<
"Bounding Box Children Name: " << m_BoundingBoxChildrenName
253 os <<
"Object properties: " << std::endl;
254 os << m_Property << std::endl;
258 template<
unsigned int TDimension >
263 return m_Bounds.GetPointer();
267 template<
unsigned int TDimension >
272 m_TreeNode->AddChild(pointer->GetTreeNode());
273 m_InternalChildrenList.push_back(pointer);
278 template<
unsigned int TDimension >
283 if(m_TreeNode->Remove(pointer->GetTreeNode()))
285 typename ChildrenListType::iterator pos;
286 pos = std::find(m_InternalChildrenList.begin(),
287 m_InternalChildrenList.end(), pointer );
288 if ( pos != m_InternalChildrenList.end() )
290 m_InternalChildrenList.erase(pos);
296 std::cerr <<
"Cannot RemoveSpatialObject" << std::endl;
302 template<
unsigned int TDimension >
308 m_TreeNode.GetPointer())->SetNodeToParentNodeTransform(transform);
309 ComputeObjectToWorldTransform();
313 template<
unsigned int TDimension >
320 m_ObjectToParentTransform->SetIdentity();
321 m_ObjectToParentTransform->SetCenter(
322 m_AffineGeometryFrame->GetObjectToNodeTransform()->GetCenter());
323 m_ObjectToParentTransform->Compose(
324 m_AffineGeometryFrame->GetObjectToNodeTransform(),
false);
325 m_ObjectToParentTransform->Compose(
326 static_cast<TreeNodeType*>(
327 m_TreeNode.GetPointer())->GetNodeToParentNodeTransform(),
false);
329 m_ObjectToWorldTransform->SetCenter(
330 m_AffineGeometryFrame->GetObjectToNodeTransform()->GetCenter());
331 m_ObjectToWorldTransform->SetMatrix(
332 m_AffineGeometryFrame->GetObjectToNodeTransform()->GetMatrix());
333 m_ObjectToWorldTransform->SetOffset(
334 m_AffineGeometryFrame->GetObjectToNodeTransform()->GetOffset());
336 m_IndexToWorldTransform->SetCenter(
337 m_AffineGeometryFrame->GetIndexToObjectTransform()->GetCenter());
338 m_IndexToWorldTransform->SetMatrix(
339 m_AffineGeometryFrame->GetIndexToObjectTransform()->GetMatrix());
340 m_IndexToWorldTransform->SetOffset(
341 m_AffineGeometryFrame->GetIndexToObjectTransform()->GetOffset());
344 ->ComputeNodeToWorldTransform();
345 m_ObjectToWorldTransform->Compose(
346 static_cast<TreeNodeType*>(
347 m_TreeNode.GetPointer())->GetNodeToWorldTransform(),
false);
349 m_IndexToWorldTransform->Compose(this->GetObjectToWorldTransform(),
false);
353 TreeChildrenListType* children = m_TreeNode->
GetChildren();
354 typename TreeChildrenListType::const_iterator it = children->begin();
355 typename TreeChildrenListType::const_iterator itEnd = children->end();
359 (*it)->Get()->ComputeObjectToWorldTransform();
366 template<
unsigned int TDimension >
371 return m_AffineGeometryFrame->GetObjectToNodeTransform();
375 template<
unsigned int TDimension >
380 return m_AffineGeometryFrame->GetObjectToNodeTransform();
384 template<
unsigned int TDimension >
390 m_TreeNode.GetPointer())->GetNodeToParentNodeTransform();
395 template<
unsigned int TDimension >
401 m_TreeNode.GetPointer())->GetNodeToParentNodeTransform();
405 template<
unsigned int TDimension >
410 return m_AffineGeometryFrame->GetIndexToObjectTransform();
414 template<
unsigned int TDimension >
419 return m_AffineGeometryFrame->GetIndexToObjectTransform();
423 template<
unsigned int TDimension >
428 m_ObjectToWorldTransform = transform;
429 ComputeObjectToParentTransform();
434 template<
unsigned int TDimension >
440 m_ObjectToParentTransform->SetScale(m_ObjectToWorldTransform->GetScale());
441 m_ObjectToParentTransform->SetCenter(m_ObjectToWorldTransform->GetCenter());
442 m_ObjectToParentTransform->SetMatrix(m_ObjectToWorldTransform->GetMatrix());
443 m_ObjectToParentTransform->SetOffset(m_ObjectToWorldTransform->GetOffset());
445 if(m_TreeNode->HasParent())
448 if(static_cast<TreeNodeType*>(m_TreeNode->GetParent())
449 ->GetNodeToParentNodeTransform()->GetInverse(inverse))
451 m_ObjectToParentTransform->Compose(inverse,
true);
455 m_AffineGeometryFrame->GetObjectToNodeTransform()->SetIdentity();
457 ->GetNodeToParentNodeTransform()
458 ->SetCenter(m_ObjectToParentTransform->GetCenter());
460 ->GetNodeToParentNodeTransform()
461 ->SetMatrix(m_ObjectToParentTransform->GetMatrix());
463 ->GetNodeToParentNodeTransform()
464 ->SetOffset(m_ObjectToParentTransform->GetOffset());
466 m_IndexToWorldTransform->SetCenter(m_AffineGeometryFrame
467 ->GetIndexToObjectTransform()
469 m_IndexToWorldTransform->SetMatrix(m_AffineGeometryFrame
470 ->GetIndexToObjectTransform()
472 m_IndexToWorldTransform->SetOffset(m_AffineGeometryFrame
473 ->GetIndexToObjectTransform()
475 m_IndexToWorldTransform->Compose(m_ObjectToWorldTransform,
false);
479 template<
unsigned int TDimension >
486 if( latestTime < m_BoundsMTime )
488 latestTime = m_BoundsMTime;
497 TreeChildrenListType* children = m_TreeNode->GetChildren();
498 typename TreeChildrenListType::const_iterator it = children->begin();
499 typename TreeChildrenListType::const_iterator itEnd = children->end();
500 unsigned long localTime;
504 localTime = (*it)->Get()->GetMTime();
506 if( localTime > latestTime )
508 latestTime = localTime;
537 template<
unsigned int TDimension >
542 itkDebugMacro(
"Computing Bounding Box" );
543 this->ComputeLocalBoundingBox();
545 if( m_BoundingBoxChildrenDepth > 0 && m_TreeNode)
548 TreeChildrenListType* children = m_TreeNode->GetChildren(0);
549 typename TreeChildrenListType::const_iterator it = children->begin();
550 typename TreeChildrenListType::const_iterator itEnd = children->end();
554 (*it)->Get()->SetBoundingBoxChildrenDepth(m_BoundingBoxChildrenDepth-1);
555 (*it)->Get()->SetBoundingBoxChildrenName(m_BoundingBoxChildrenName);
556 (*it)->Get()->ComputeBoundingBox();
559 bool bbDefined =
false;
560 for(
unsigned int i=0;i<m_Dimension;i++)
562 if(m_Bounds->GetBounds()[2*i] != 0
563 || m_Bounds->GetBounds()[2*i+1] != 0)
572 m_Bounds->SetMinimum((*it)->Get()->GetBoundingBox()->GetMinimum());
573 m_Bounds->SetMaximum((*it)->Get()->GetBoundingBox()->GetMaximum());
577 m_Bounds->ConsiderPoint((*it)->Get()->GetBoundingBox()->GetMinimum());
578 m_Bounds->ConsiderPoint((*it)->Get()->GetBoundingBox()->GetMaximum());
588 BoundingBoxType::PointType::ValueType>::Zero );
589 m_Bounds->SetMinimum(pnt);
590 m_Bounds->SetMaximum(pnt);
591 m_BoundsMTime = this->GetMTime();
598 template<
unsigned int TDimension >
609 m_TreeNode->GetChildren(depth,name);
610 typename TreeNodeType::ChildrenListType::const_iterator it =
615 while(it != children->end())
617 childrenSO->push_back((*it)->Get());
626 template<
unsigned int TDimension >
632 typename ChildrenListType::iterator it = children.begin();
633 typename ChildrenListType::iterator itEnd = children.end();
638 m_TreeNode.GetPointer())->AddChild((*it)->GetTreeNode());
645 template<
unsigned int TDimension >
650 return m_TreeNode->GetNumberOfChildren(depth,name);
654 template<
unsigned int TDimension >
659 return m_ObjectToParentTransform->GetMTime();
663 template<
unsigned int TDimension >
668 return m_IndexToWorldTransform->GetMTime();
673 template<
unsigned int TDimension >
678 if(m_TreeNode->HasParent())
680 return m_TreeNode->GetParent()->Get();
686 template<
unsigned int TDimension >
691 if(m_TreeNode->HasParent())
693 return m_TreeNode->GetParent()->Get();
699 template<
unsigned int TDimension >
706 m_TreeNode->SetParent(
NULL);
710 m_TreeNode->SetParent(parent->GetTreeNode());
715 template<
unsigned int TDimension >
720 return m_TreeNode->HasParent();
724 template<
unsigned int TDimension >
729 if (m_LargestPossibleRegion != region)
731 m_LargestPossibleRegion = region;
737 template<
unsigned int TDimension >
741 if (this->GetSource())
743 this->GetSource()->UpdateOutputInformation();
749 m_LargestPossibleRegion = m_BufferedRegion;
756 if ( m_RequestedRegion.GetNumberOfPixels() == 0)
758 this->SetRequestedRegionToLargestPossibleRegion();
762 template<
unsigned int TDimension >
767 m_RequestedRegion = m_LargestPossibleRegion;
771 template<
unsigned int TDimension >
783 for (i=0; i< m_Dimension; i++)
785 if ( (requestedRegionIndex[i] < bufferedRegionIndex[i]) ||
786 ((requestedRegionIndex[i] + static_cast<long>(requestedRegionSize[i]))
787 > (bufferedRegionIndex[i]
788 + static_cast<long>(bufferedRegionSize[i]))) )
797 template<
unsigned int TDimension >
802 if (m_BufferedRegion != region)
804 m_BufferedRegion = region;
805 this->ComputeOffsetTable();
811 template<
unsigned int TDimension >
823 const IndexType &largestPossibleRegionIndex
824 = m_LargestPossibleRegion.
GetIndex();
827 const SizeType& largestPossibleRegionSize = m_LargestPossibleRegion.
GetSize();
829 for (i=0; i< m_Dimension; i++)
831 if ( (requestedRegionIndex[i] < largestPossibleRegionIndex[i]) ||
832 ((requestedRegionIndex[i] + static_cast<long>(requestedRegionSize[i]))
833 > (largestPossibleRegionIndex[i]
834 + static_cast<long>(largestPossibleRegionSize[i]))))
843 template<
unsigned int TDimension >
848 if (m_RequestedRegion != region)
850 m_RequestedRegion = region;
856 template<
unsigned int TDimension >
873 <<
"itk::ImageBase::SetRequestedRegion(DataObject*) cannot cast "
874 <<
typeid(data).name() <<
" to " <<
typeid(
SpatialObject*).name() );
879 template<
unsigned int TDimension >
887 m_OffsetTable[0] =
static_cast<long int>( num );
888 for (
unsigned int i=0; i < m_Dimension; i++)
890 num *= bufferSize[i];
891 m_OffsetTable[i+1] =
static_cast<long int>( num );
896 template<
unsigned int TDimension >
905 template<
unsigned int TDimension >
910 m_Property = property;
913 template<
unsigned int TDimension >
918 Superclass::Update();
924 template<
unsigned int TDimension >
929 if(!this->GetIndexToWorldTransform()->GetInverse(
930 const_cast<TransformType *>(this->GetInternalInverseTransform())))
937 template<
unsigned int TDimension >
945 m_TreeNode.GetPointer())->SetNodeToParentNodeTransform(transform);
949 template<
unsigned int TDimension >
957 m_TreeNode.GetPointer())->GetNodeToParentNodeTransform();
962 template<
unsigned int TDimension >
970 m_TreeNode.GetPointer())->GetNodeToParentNodeTransform();
977 template<
unsigned int TDimension >
982 n << GetNameOfClass();
990 template<
unsigned int TDimension >
995 Superclass::CopyInformation(data);
1010 itkExceptionMacro( <<
"itk::SpatialObject::CopyInformation() cannot cast "
1011 <<
typeid(data).name() <<
" to "
1016 const Self* source =
dynamic_cast<const Self*
>(data);
1019 std::cout <<
"CopyInformation: objects are not of the same type"
1025 this->GetProperty()->SetRed(source->GetProperty()->GetRed());
1026 this->GetProperty()->SetGreen(source->GetProperty()->GetGreen());
1027 this->GetProperty()->SetBlue(source->GetProperty()->GetBlue());
1028 this->GetProperty()->SetAlpha(source->GetProperty()->GetAlpha());
1029 this->GetProperty()->SetName(source->GetProperty()->GetName().c_str());
1032 this->SetId(source->GetId());
1033 this->SetParentId(source->GetParentId());
1038 #endif // __SpatialObject_txx