#include <CutModelPolygon.h>
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) |
manualBaseModel * | InitializeContourModel (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 |
Definition at line 13 of file CutModelPolygon.h.
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 }
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 }
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 }
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 }
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 }
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 }
void CutModelPolygon::setDirection | ( | double * | pDirection | ) |
Definition at line 357 of file CutModelPolygon.cxx.
References _direction.
Referenced by CutModelManager::ExecuteCutPolygon().
00358 { 00359 _direction=pDirection; 00360 }
void CutModelPolygon::setInImage | ( | vtkImageData * | pImage | ) |
Definition at line 342 of file CutModelPolygon.cxx.
References _inImage.
Referenced by CutModelManager::ExecuteCutPolygon().
00343 { 00344 _inImage=pImage; 00345 }
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 }
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 }
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 }
int CutModelPolygon::_cutInsideOutside [private] |
Definition at line 91 of file CutModelPolygon.h.
Referenced by cutInputImage(), CutModelPolygon(), and processOutImage().
double* CutModelPolygon::_direction [private] |
Definition at line 85 of file CutModelPolygon.h.
Referenced by calculateOrthogonalVectors(), getDirection(), processOutImage(), and setDirection().
vtkImageData* CutModelPolygon::_inImage [private] |
Definition at line 76 of file CutModelPolygon.h.
Referenced by cutInputImage(), CutModelPolygon(), getInImage(), getOutImage(), setInImage(), setOutImage(), and transformContourPoints().
vtkPoints* CutModelPolygon::_points [private] |
Definition at line 82 of file CutModelPolygon.h.
Referenced by calculateOrthogonalVectors(), getPoints(), processOutImage(), setPoints(), transformContourPoints(), updateTransform(), and ~CutModelPolygon().
vtkTransform* CutModelPolygon::_transform [private] |
Definition at line 88 of file CutModelPolygon.h.
Referenced by cutInputImage(), CutModelPolygon(), transformContourPoints(), updateTransform(), and ~CutModelPolygon().