CutModelPolygon Class Reference

#include <CutModelPolygon.h>

List of all members.

Public Member Functions

 CutModelPolygon ()
 ~CutModelPolygon ()
void processOutImage (int cutInsideOutside)
void initializeOutputImage ()
void calculateOrthogonalVectors (double *v1, double *v2)
void updateTransform (double *v1, double *v2, double *v3)
void transformContourPoints (std::vector< double > *vectorOutX, std::vector< double > *vectorOutY, std::vector< double > *vectorOutZ)
void cutInputImage (std::vector< double > vectorOutX, std::vector< double > vectorOutY, std::vector< double > vectorOutZ)
manualBaseModelInitializeContourModel (std::vector< double > pointsX, std::vector< double > pointsY, std::vector< double > pointsZ)
vtkImageData * getInImage ()
vtkImageData * getOutImage ()
vtkPoints * getPoints ()
double * getDirection ()
void setInImage (vtkImageData *pImage)
void setOutImage (vtkImageData *pImage)
void setPoints (vtkPoints *pPoints)
void setDirection (double *pDirection)

Private Attributes

vtkImageData * _inImage
vtkPoints * _points
double * _direction
vtkTransform * _transform
int _cutInsideOutside

Detailed Description

Definition at line 13 of file CutModelPolygon.h.


Constructor & Destructor Documentation

CutModelPolygon::CutModelPolygon (  ) 

Definition at line 6 of file CutModelPolygon.cxx.

References _cutInsideOutside, _inImage, and _transform.

00007 {
00008         _cutInsideOutside=0;
00009         _inImage=NULL;
00010         _transform = vtkTransform::New();
00011 }

CutModelPolygon::~CutModelPolygon (  ) 

Definition at line 13 of file CutModelPolygon.cxx.

References _points, and _transform.

00014 {
00015         if(_transform!=NULL)
00016         {
00017                 _transform->Delete();
00018         }
00019         if(_points!=NULL)
00020         {
00021                 _points->Delete();
00022         }
00023 }


Member Function Documentation

void CutModelPolygon::calculateOrthogonalVectors ( double *  v1,
double *  v2 
)

Definition at line 253 of file CutModelPolygon.cxx.

References _direction, and _points.

Referenced by processOutImage().

00254 {
00255         double p1[3],p2[3];
00256         _points->GetPoint(0,p1);
00257         _points->GetPoint(1,p2);
00258 
00259 
00260         v1[0]=p1[0]-p2[0];
00261         v1[1]=p1[1]-p2[1];
00262         v1[2]=p1[2]-p2[2];
00263 
00264 
00265         double magV1 = sqrt( v1[0]*v1[0] + v1[1]*v1[1] + v1[2]*v1[2]);
00266         v1[0]=v1[0]/magV1;
00267         v1[1]=v1[1]/magV1;
00268         v1[2]=v1[2]/magV1;
00269 
00270         v2[0] = v1[1]*_direction[2] - v1[2]*_direction[1];
00271         v2[1] = -(v1[0]*_direction[2] - v1[2]*_direction[0]);
00272         v2[2] = v1[0]*_direction[1] - v1[1]*_direction[0];
00273 
00274         double magV2 = sqrt( v2[0]*v2[0] + v2[1]*v2[1] + v2[2]*v2[2]);
00275         v2[0]=v2[0]/magV2;
00276         v2[1]=v2[1]/magV2;
00277         v2[2]=v2[2]/magV2;
00278 
00279         double magDir = sqrt( _direction[0]*_direction[0] + _direction[1]*_direction[1] + _direction[2]*_direction[2]);
00280         _direction[0]=_direction[0]/magDir;
00281         _direction[1]=_direction[1]/magDir;
00282         _direction[2]=_direction[2]/magDir;
00283 }

Here is the caller graph for this function:

void CutModelPolygon::cutInputImage ( std::vector< double >  vectorOutX,
std::vector< double >  vectorOutY,
std::vector< double >  vectorOutZ 
)

FIX ME !!!

Definition at line 66 of file CutModelPolygon.cxx.

References _cutInsideOutside, _inImage, _transform, InitializeContourModel(), initializeOutputImage(), ContourExtractData::InitLstContoursLinesYPoints(), ContourExtractData::isInside(), ContourExtractData::SetLstManualContourModel(), and ContourExtractData::SetSizeImageY().

Referenced by processOutImage().

00067 {
00068 
00069         // Find the minimum value in Y axis
00070         int i;
00071         double minY=vectorOutY[0];
00072         for(i=1;i<vectorOutY.size();i++)
00073         {
00074                 if(vectorOutY[i]<minY)
00075                 {
00076                         minY=vectorOutY[i];
00077                 }
00078         }
00079 
00080         // All the contour points minus the minimum to translate to the positive octant
00082         for(i=0;i<vectorOutY.size();i++)
00083         {
00084 
00085                 vectorOutY[i]=vectorOutY[i]-minY;
00086         }
00087 
00088 
00089         // Creates a poligonal contour model with the points
00090         manualBaseModel *model = InitializeContourModel(vectorOutX,vectorOutY,vectorOutZ);
00091 
00092         initializeOutputImage();
00093 
00094         int ext[6];
00095         _inImage->GetWholeExtent(ext);
00096         int dimX=ext[1]-ext[0]+1;
00097         int dimY=ext[3]-ext[2]+1;
00098         int dimZ=ext[5]-ext[4]+1;
00099 
00100 
00101         //CreaMaracasVisu Class which evaluates whether a point is inside the contour or not
00102         ContourExtractData *extract = new ContourExtractData(false);
00103 
00104         //Contour list just with the contour created with the points 
00105         std::vector<manualBaseModel*> list;
00106         list.push_back(model);
00107 
00108         //Y-value asigned arbitrary
00109         extract->SetSizeImageY(500);
00110 
00111         //Initialization
00112         extract->SetLstManualContourModel(list);
00113         extract->InitLstContoursLinesYPoints();
00114 
00115         cout<<"Processing..."<<endl;
00116 
00117         for (int i=0; i<dimX; i++)
00118         {
00119                 if(i%10==0)
00120                         cout<<"Print "<<i<<" of "<<dimX<<endl;
00121 
00122                 for (int j=0; j<dimY; j++)
00123                 {
00124                         for (int k=0; k<dimZ; k++)
00125                         {
00126                                 unsigned short *pImage=(unsigned short*)_inImage->GetScalarPointer(i,j,k);
00127                                 //unsigned short *pResult=(unsigned short*)_outImage->GetScalarPointer(i,j,k);
00128                                 double in[4],out[4];
00129                                 in[0]=i;
00130                                 in[1]=j;
00131                                 in[2]=k;
00132                                 in[3]=1;
00133 
00134                                 //Transform every point in the imageData to the space resultant of the mathematical transform
00135                                 _transform->MultiplyPoint(in,out);
00136 
00137                                 //All the imageData minus the minimum to translate to the positive octant
00138                                 out[1]=out[1]- minY;
00139 
00140                                 //Verify if the point is inside the contour or not
00141                                 if ((out[1]>=0 && out[1]<500) && (extract->isInside(out[0],out[1],0)==true))
00142                                 {
00143 
00144                                         if(_cutInsideOutside==0)//CutInside
00145                                         {
00146                                                 *pImage=0;
00147                                         }
00148 
00149                                 } 
00150                                 else
00151                                 {
00152                                         if(_cutInsideOutside==1)//CutOutside
00153                                         {
00154                                                 *pImage=0;
00155                                         }
00156                                 }
00157 
00158                         } // for k
00159                 } // for j
00160         }// for i
00161 
00162         _inImage->Modified();
00163         _inImage->Update();
00164 
00165 }

Here is the call graph for this function:

Here is the caller graph for this function:

double * CutModelPolygon::getDirection (  ) 

Definition at line 337 of file CutModelPolygon.cxx.

References _direction.

00338 {
00339         return _direction;
00340 }

vtkImageData * CutModelPolygon::getInImage (  ) 

Definition at line 322 of file CutModelPolygon.cxx.

References _inImage.

00323 {
00324         return _inImage;
00325 }

vtkImageData * CutModelPolygon::getOutImage (  ) 

Definition at line 327 of file CutModelPolygon.cxx.

References _inImage.

00328 {
00329         return _inImage;
00330 }

vtkPoints * CutModelPolygon::getPoints (  ) 

Definition at line 332 of file CutModelPolygon.cxx.

References _points.

00333 {
00334         return _points;
00335 }

manualBaseModel * CutModelPolygon::InitializeContourModel ( std::vector< double >  pointsX,
std::vector< double >  pointsY,
std::vector< double >  pointsZ 
)

Definition at line 303 of file CutModelPolygon.cxx.

References manualBaseModel::AddPoint().

Referenced by cutInputImage().

00304 { 
00305         manualBaseModel *model = new manualContourModelPolygon();
00306 
00307         int numPoints = pointsX.size();
00308         for(int i = 0; i<numPoints;i++)
00309         {
00310                 model->AddPoint(pointsX[i],pointsY[i],pointsZ[i]);
00311         }
00312 
00313         return model;
00314 }

Here is the call graph for this function:

Here is the caller graph for this function:

void CutModelPolygon::initializeOutputImage (  ) 

Definition at line 286 of file CutModelPolygon.cxx.

Referenced by cutInputImage().

00287 {
00288         //int ext[6];
00289         //_inImage->GetWholeExtent(ext);
00290         //int dimX=ext[1]-ext[0]+1;
00291         //int dimY=ext[3]-ext[2]+1;
00292         //int dimZ=ext[5]-ext[4]+1;
00293 
00294         //if (_outImage != NULL ) { _outImage->Delete(); }
00295         //_outImage=vtkImageData::New();
00296         //_outImage->SetDimensions(dimX,dimY,dimZ);
00297         //_outImage->SetScalarTypeToUnsignedShort();
00298         //_outImage->AllocateScalars();
00299 }

Here is the caller graph for this function:

void CutModelPolygon::processOutImage ( int  cutInsideOutside  ) 

Printing Points

Definition at line 25 of file CutModelPolygon.cxx.

References _cutInsideOutside, _direction, _points, calculateOrthogonalVectors(), cutInputImage(), transformContourPoints(), and updateTransform().

Referenced by CutModelManager::ExecuteCutPolygon().

00026 {
00027         _cutInsideOutside=cutInsideOutside;
00028 
00029         int numPoints = _points->GetNumberOfPoints();
00030 
00031         double v1[3],v2[3];
00032 
00033         // Calculate Orthogonal Vectors using two vectors in the plane and its cross product
00034         calculateOrthogonalVectors(v1,v2);
00035 
00036         cout<<"PolyCutter::processOutImage"<<endl;
00037         cout<<"V1:"<<" X:"<<v1[0]<<" Y:"<<v1[1]<<" Z:"<<v1[2]<<endl;
00038         cout<<"V2:"<<" X:"<<v2[0]<<" Y:"<<v2[1]<<" Z:"<<v2[2]<<endl;
00039         cout<<"Direction:"<<" X:"<<_direction[0]<<" Y:"<<_direction[1]<<" Z:"<<_direction[2]<<endl;
00040         cout<<endl;
00041 
00042         // Update the inverse transform which it's applied to all the points of the contour
00043         // and the points of the input image.
00044         updateTransform(v1,v2,_direction);
00045 
00046         //Transform Points coordinates
00047         std::vector<double> vectorOutX;
00048         std::vector<double> vectorOutY;
00049         std::vector<double> vectorOutZ;
00050 
00051         transformContourPoints(&vectorOutX,&vectorOutY,&vectorOutZ);
00052 
00053 
00055         int num = vectorOutX.size();
00056         for(int t=0;t<num;t++)
00057         {                                       
00058                 cout<<"Final Point"<<t<<"-X:"<<vectorOutX[t]<<" Y:"<<vectorOutY[t]<<" Z:"<<vectorOutZ[t]<<endl;
00059         }
00060 
00061         cutInputImage(vectorOutX,vectorOutY,vectorOutZ);
00062 
00063 }

Here is the call graph for this function:

Here is the caller graph for this function:

void CutModelPolygon::setDirection ( double *  pDirection  ) 

Definition at line 357 of file CutModelPolygon.cxx.

References _direction.

Referenced by CutModelManager::ExecuteCutPolygon().

00358 {
00359         _direction=pDirection;
00360 }

Here is the caller graph for this function:

void CutModelPolygon::setInImage ( vtkImageData *  pImage  ) 

Definition at line 342 of file CutModelPolygon.cxx.

References _inImage.

Referenced by CutModelManager::ExecuteCutPolygon().

00343 {
00344         _inImage=pImage;
00345 }

Here is the caller graph for this function:

void CutModelPolygon::setOutImage ( vtkImageData *  pImage  ) 

Definition at line 347 of file CutModelPolygon.cxx.

References _inImage.

00348 {
00349         _inImage=pImage;
00350 }

void CutModelPolygon::setPoints ( vtkPoints *  pPoints  ) 

Definition at line 352 of file CutModelPolygon.cxx.

References _points.

Referenced by CutModelManager::ExecuteCutPolygon().

00353 {
00354         _points=pPoints;
00355 }

Here is the caller graph for this function:

void CutModelPolygon::transformContourPoints ( std::vector< double > *  vectorOutX,
std::vector< double > *  vectorOutY,
std::vector< double > *  vectorOutZ 
)

Definition at line 168 of file CutModelPolygon.cxx.

References _inImage, _points, and _transform.

Referenced by processOutImage().

00169 {
00170         int numPoints = _points->GetNumberOfPoints();
00171 
00172         for(int t=0;t<numPoints;t++)
00173         {
00174                 double point[3],in[4],out[4];
00175                 _points->GetPoint(t,point);
00176                 in[0]=point[0];
00177                 in[1]=point[1];
00178                 in[2]=point[2];
00179                 in[3]=1;
00180 
00181                 //CHG_LYON_JAN29 Multiply Contour Points by the inverse of the spacing. It's necessary to faire 
00182                 //the hole in the correct position and not in other with a displacement
00183 
00184                 double _spc[3];
00185                 _inImage->GetSpacing(_spc);
00186                 in[0]=in[0]*(1/_spc[0]);
00187                 in[1]=in[1]*(1/_spc[1]);
00188                 in[2]=in[2]*(1/_spc[2]);
00189 
00190                 _transform->MultiplyPoint(in,out);
00191                 vectorOutX->push_back(out[0]);
00192                 vectorOutY->push_back(out[1]);
00193                 vectorOutZ->push_back(out[2]);
00194         }
00195 
00196 }

Here is the caller graph for this function:

void CutModelPolygon::updateTransform ( double *  v1,
double *  v2,
double *  v3 
)

Definition at line 198 of file CutModelPolygon.cxx.

References _points, and _transform.

Referenced by processOutImage().

00199 {
00200 
00201         // ImageData Centroid
00202         int i, numPoints=_points->GetNumberOfPoints();
00203         double centerX=0,centerY=0,centerZ=0;
00204         for(i =0; i<numPoints;i++)
00205         {
00206                 double point[3];
00207                 _points->GetPoint(i,point);
00208                 centerX+=point[0];
00209                 centerY+=point[1];
00210                 centerZ+=point[2];
00211         }
00212 
00213         centerX=centerX/numPoints;
00214         centerY=centerY/numPoints;
00215         centerZ=centerZ/numPoints;
00216 
00217 
00218         vtkMatrix4x4 *matrix = vtkMatrix4x4::New();
00219 
00220         //First Vector...
00221         matrix->SetElement(0,0,v1[0]);
00222         matrix->SetElement(1,0,v1[1]);
00223         matrix->SetElement(2,0,v1[2]);
00224         matrix->SetElement(3,0,0);
00225 
00226 
00227         //Second Vector...
00228         matrix->SetElement(0,1,v2[0]);
00229         matrix->SetElement(1,1,v2[1]);
00230         matrix->SetElement(2,1,v2[2]);
00231         matrix->SetElement(3,1,0);
00232 
00233         //Third Vector...
00234         matrix->SetElement(0,2,v3[0]);
00235         matrix->SetElement(1,2,v3[1]);
00236         matrix->SetElement(2,2,v3[2]);
00237         matrix->SetElement(3,2,0);
00238 
00239         //Fourth Vector...
00240         matrix->SetElement(0,3,centerX);
00241         matrix->SetElement(1,3,centerY);
00242         matrix->SetElement(2,3,centerZ);
00243         matrix->SetElement(3,3,1);
00244 
00245         _transform->SetMatrix(matrix);
00246         _transform->Update();
00247 
00248         _transform->Inverse();
00249         _transform->Update();
00250         matrix->Delete();
00251 }

Here is the caller graph for this function:


Member Data Documentation

Definition at line 91 of file CutModelPolygon.h.

Referenced by cutInputImage(), CutModelPolygon(), and processOutImage().

double* CutModelPolygon::_direction [private]
vtkImageData* CutModelPolygon::_inImage [private]
vtkPoints* CutModelPolygon::_points [private]
vtkTransform* CutModelPolygon::_transform [private]

The documentation for this class was generated from the following files:

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1