Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mitkBoundingObjectGroup.h"
00020 #include "mitkBaseProcess.h"
00021 #include <vtkLinearTransform.h>
00022 #include <itkSmartPointerForwardReference.txx>
00023
00024
00025 mitk::BoundingObjectGroup::BoundingObjectGroup()
00026 :m_BoundingObjects(0),
00027 m_Counter(0),
00028 m_CSGMode(Union)
00029 {
00030 GetTimeSlicedGeometry()->Initialize(1);
00031 GetGeometry(0)->SetIndexToWorldTransform(GetTimeSlicedGeometry()->GetIndexToWorldTransform());
00032 SetVtkPolyData(NULL);
00033 }
00034
00035 mitk::BoundingObjectGroup::~BoundingObjectGroup()
00036 {
00037 }
00038
00039 void mitk::BoundingObjectGroup::UpdateOutputInformation()
00040 {
00041 if ( this->GetSource() )
00042 {
00043 this->GetSource()->UpdateOutputInformation();
00044 }
00045
00046
00047 if(m_BoundingObjects.size() < 1 )
00048 {
00049 mitk::BoundingBox::BoundsArrayType boundsArray;
00050 boundsArray.Fill(0);
00051 GetTimeSlicedGeometry()->Initialize(1);
00052 GetGeometry()->SetBounds(boundsArray);
00053 GetTimeSlicedGeometry()->UpdateInformation();
00054 return;
00055 }
00056
00057
00058 mitk::BoundingBox::PointsContainer::Pointer pointscontainer=mitk::BoundingBox::PointsContainer::New();
00059
00060 mitk::BoundingBox::PointIdentifier pointid=0;
00061 mitk::Point3D point;
00062
00063 mitk::AffineTransform3D* transform = GetTimeSlicedGeometry()->GetIndexToWorldTransform();
00064 mitk::AffineTransform3D::Pointer inverse = mitk::AffineTransform3D::New();
00065 transform->GetInverse(inverse);
00066
00067
00068
00069
00070 for(unsigned int j = 0; j<m_BoundingObjects.size();j++)
00071 {
00072 const Geometry3D* geometry = m_BoundingObjects.at(j)->GetUpdatedTimeSlicedGeometry();
00073 unsigned char i;
00074 for(i=0; i<8; ++i)
00075 {
00076 point = inverse->TransformPoint(geometry->GetCornerPoint(i));
00077 if(point[0]*point[0]+point[1]*point[1]+point[2]*point[2] < mitk::large)
00078 pointscontainer->InsertElement( pointid++, point);
00079 else
00080 {
00081 itkGenericOutputMacro( << "Unrealistically distant corner point encountered. Ignored. BoundingObject: " << m_BoundingObjects.at(j) );
00082 }
00083 }
00084 }
00085
00086 mitk::BoundingBox::Pointer boundingBox = mitk::BoundingBox::New();
00087 boundingBox->SetPoints(pointscontainer);
00088 boundingBox->ComputeBoundingBox();
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 Geometry3D* geometry3d = GetGeometry(0);
00102 geometry3d->SetIndexToWorldTransform(transform);
00103 geometry3d->SetBounds(boundingBox->GetBounds());
00104
00105
00106
00107 GetTimeSlicedGeometry()->InitializeEvenlyTimed(geometry3d, GetTimeSlicedGeometry()->GetTimeSteps());
00108 }
00109
00110 void mitk::BoundingObjectGroup::AddBoundingObject(mitk::BoundingObject::Pointer boundingObject)
00111 {
00112 if (boundingObject->GetPositive())
00113 m_BoundingObjects.push_front(boundingObject);
00114 else
00115 m_BoundingObjects.push_back(boundingObject);
00116 ++m_Counter;
00117 UpdateOutputInformation();
00118 }
00119
00120 void mitk::BoundingObjectGroup::RemoveBoundingObject(mitk::BoundingObject::Pointer boundingObject)
00121 {
00122 std::deque<mitk::BoundingObject::Pointer>::iterator it = m_BoundingObjects.begin();
00123 for (unsigned int i=0 ; i<m_BoundingObjects.size();i++)
00124 {
00125 if (m_BoundingObjects.at(i) == boundingObject)
00126 m_BoundingObjects.erase(it);
00127 ++it;
00128 }
00129 --m_Counter;
00130 UpdateOutputInformation();
00131 }
00132
00133 bool mitk::BoundingObjectGroup::IsInside(const mitk::Point3D& p) const
00134 {
00135 bool inside = false;
00136 bool posInside = false;
00137 bool negInside = false;
00138
00139 for (unsigned int i = 0; i<m_BoundingObjects.size();i++)
00140 {
00141 switch(m_CSGMode)
00142 {
00143 case Intersection:
00144 inside = true;
00145
00146 inside = m_BoundingObjects.at(i)->IsInside(p) && inside;
00147 if (!inside)
00148 i=m_BoundingObjects.size();
00149 break;
00150
00151 case Union:
00152 case Difference:
00153 posInside = false;
00154 negInside = false;
00155
00156 if (m_BoundingObjects.at(i)->GetPositive())
00157 posInside = m_BoundingObjects.at(i)->IsInside(p) || posInside;
00158 else
00159 negInside = m_BoundingObjects.at(i)->IsInside(p) || negInside;
00160
00161 if (posInside && !negInside)
00162 inside = true;
00163 else
00164 inside = false;
00165 break;
00166
00167 default:
00168 inside = false;
00169
00170 inside = m_BoundingObjects.at(i)->IsInside(p) || inside;
00171 if (inside)
00172 i=m_BoundingObjects.size();
00173 break;
00174 }
00175 }
00176 return inside;
00177 }
00178
00179 unsigned int mitk::BoundingObjectGroup::GetCount() const
00180 {
00181 return m_Counter;
00182 }
00183
00184 bool mitk::BoundingObjectGroup::VerifyRequestedRegion()
00185 {
00186 return m_Counter > 0;
00187 }
00188
00189 mitk::Geometry3D * mitk::BoundingObjectGroup::GetGeometry (int t) const
00190 {
00191
00192 return Superclass::GetGeometry(t);
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 }
00206
00207 void mitk::BoundingObjectGroup::SetBoundingObjects(const std::deque<mitk::BoundingObject::Pointer> boundingObjects)
00208 {
00209 m_BoundingObjects = boundingObjects;
00210 }
00211
00212 std::deque<mitk::BoundingObject::Pointer> mitk::BoundingObjectGroup::GetBoundingObjects()
00213 {
00214 return m_BoundingObjects;
00215 }