#include "FillFilter.h" FillFilter::FillFilter() { _graylevel = 0.0; _2D3D = 1; // 0 2D , 1 true 3D _direction = 0; // 1 XZ , 0 YZ , 2 XY _tolerancefill = 50; _distancefill = 500; _limitRecursionFill = 100000; _minX = 0; _minY = 0; _minZ = 0; _maxX = 0; _maxY = 0; _maxZ = 0; _auxImageFill = NULL; } //--------------------------------------------------------------------------- FillFilter::~FillFilter() { if (_auxImageFill!=NULL) { _auxImageFill->Delete(); } } //--------------------------------------------------------------------------- void FillFilter::SetImage(vtkImageData *image) { _image=image; int ext[6]; _image->GetWholeExtent(ext); _minX=0; _minY=0; _minZ=0; _maxX=ext[1]-ext[0]; _maxY=ext[3]-ext[2]; _maxZ=ext[5]-ext[4]; if (_auxImageFill!=NULL) { _auxImageFill->Delete(); } _auxImageFill = vtkImageData::New(); _auxImageFill->SetDimensions(_maxX+1,_maxY+1,_maxZ+1); _auxImageFill->SetOrigin(0,0,0); _auxImageFill->SetExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ ); _auxImageFill->SetWholeExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ ); _auxImageFill->SetScalarTypeToUnsignedChar(); _auxImageFill->AllocateScalars(); } //--------------------------------------------------------------------------- void FillFilter::FillTool(int px,int py, int pz) { if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ)) { _graylevelbasefill = _image->GetScalarComponentAsDouble(px,py,pz, 0); _pxfill = px; _pyfill = py; _pzfill = pz; _distbasefill = _distancefill*_distancefill; _countRecursiveFill = 0; _countRecursiveFillProblem = 0; _countProgressingFill = 0; unsigned char *pImage = (unsigned char *)_auxImageFill->GetScalarPointer(); _usingAuxImageFill=false; memset ( pImage , 0 , _maxX*_maxY*_maxZ ); FillToolRecursive(px,py,pz); printf("--\n"); int ii,jj,kk; while (_countRecursiveFillProblem!=0) { _countRecursiveFillProblem = 0; _usingAuxImageFill=true; for(ii=0;ii<=_maxX;ii++) { for(jj=0;jj<=_maxY;jj++) { for(kk=0;kk<=_maxZ;kk++) { pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk); if ( (*pImage)==1 ) { FillToolRecursive(ii,jj,kk); } } // for kk } // for jj } //for ii printf("-\n"); } // while } //if _minX _maxX _minY _maxY _minZ _maxZ } //--------------------------------------------------------------------------- void FillFilter::FillToolRecursive(int px,int py, int pz) { _countRecursiveFill++; _countProgressingFill++; if (_countProgressingFill>200000) { printf("R %ld \n", _countRecursiveFill ); _countProgressingFill=0; } if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ)) { if (_usingAuxImageFill==true) { _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0); } _tmpDistfill=(px-_pxfill)*(px-_pxfill) + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill); _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0); _auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) && (_tmpiglfill>=_graylevelbasefill-_tolerancefill) && (_tmpiglfill<=_graylevelbasefill+_tolerancefill) && (_tmpDistfill<=_distbasefill); if ( _auxGrayLevelValidationFill==true ) { _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel ); if (_countRecursiveFill< _limitRecursionFill) { if (_2D3D==0) //2D { if (_direction==0) // YZ { //FillToolRecursive(px+1,py,pz); //FillToolRecursive(px-1,py,pz); FillToolRecursive(px,py+1,pz); FillToolRecursive(px,py-1,pz); FillToolRecursive(px,py,pz-1); FillToolRecursive(px,py,pz+1); } if (_direction==1) // XZ { FillToolRecursive(px+1,py,pz); FillToolRecursive(px-1,py,pz); //FillToolRecursive(px,py+1,pz); //FillToolRecursive(px,py-1,pz); FillToolRecursive(px,py,pz-1); FillToolRecursive(px,py,pz+1); } if (_direction==2) // XY { FillToolRecursive(px+1,py,pz); FillToolRecursive(px,py+1,pz); FillToolRecursive(px-1,py,pz); FillToolRecursive(px,py-1,pz); //FillToolRecursive(px,py,pz-1); //FillToolRecursive(px,py,pz+1); } } else { // 3D FillToolRecursive(px+1,py,pz); FillToolRecursive(px-1,py,pz); FillToolRecursive(px,py+1,pz); FillToolRecursive(px,py-1,pz); FillToolRecursive(px,py,pz-1); FillToolRecursive(px,py,pz+1); } // 2D 3D } //_countRecursiveFill } // _graylevel if ( (_auxGrayLevelValidationFill==true ) && (_countRecursiveFill>= _limitRecursionFill) ) { _countRecursiveFillProblem++; if (_2D3D==0) //2D { if (_direction==0) // YZ { //SetAuxImageFill(px+1,py,pz); //SetAuxImageFill(px-1,py,pz); SetAuxImageFill(px,py+1,pz); SetAuxImageFill(px,py-1,pz); SetAuxImageFill(px,py,pz-1); SetAuxImageFill(px,py,pz+1); } if (_direction==1) // XZ { SetAuxImageFill(px+1,py,pz); SetAuxImageFill(px-1,py,pz); //SetAuxImageFill(px,py+1,pz); //SetAuxImageFill(px,py-1,pz); SetAuxImageFill(px,py,pz-1); SetAuxImageFill(px,py,pz+1); } if (_direction==2) // XY { SetAuxImageFill(px+1,py,pz); SetAuxImageFill(px-1,py,pz); SetAuxImageFill(px,py+1,pz); SetAuxImageFill(px,py-1,pz); //SetAuxImageFill(px,py,pz-1); //SetAuxImageFill(px,py,pz+1); } } else { // 3D SetAuxImageFill(px+1,py,pz); SetAuxImageFill(px-1,py,pz); SetAuxImageFill(px,py+1,pz); SetAuxImageFill(px,py-1,pz); SetAuxImageFill(px,py,pz-1); SetAuxImageFill(px,py,pz+1); } // 2D 3D } // _graylevel //_limitRecursionFill } //if _minX _maxX _minY _maxY _minZ _maxZ _countRecursiveFill--; } //--------------------------------------------------------------------------- void FillFilter::SetAuxImageFill(int px,int py, int pz) { if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ)) { _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1); } } //--------------------------------------------------------------------------- void FillFilter::BrushTool(int px,int py, int pz) { if (_image!=NULL) { float value=(float)_graylevel; int i,j,k; int size = _brushsize-1; int minX = px-size; int maxX = px+size; int minY = py-size; int maxY = py+size; int minZ = pz-size; int maxZ = pz+size; if (_2D3D==0) //2D { if (_direction==0) // YZ { minX=px; maxX=px; } if (_direction==1) // XZ { minY=py; maxY=py; } if (_direction==2) // XY { minZ=pz; maxZ=pz; } } if (_2D3D==1) // 3D { } double xx,yy,zz,rr=size*size; for (i=minX; i<=maxX; i++) { xx=px-i; xx=xx*xx; for (j=minY; j<=maxY; j++) { yy=py-j; yy=yy*yy; for (k=minZ; k<=maxZ; k++) { if ((i>=_minX) && (i<=_maxX) && (j>=_minY) && (j<=_maxY) && (k>=_minZ) && (k<=_maxZ)) { zz=pz-k; zz=zz*zz; if (_brushform==0) { _image->SetScalarComponentFromFloat (i,j,k, 0, value ); } else if (_brushform==1) { if ((xx+yy+zz)<=rr) { _image->SetScalarComponentFromFloat (i,j,k, 0, value ); } } // _brushform } //if _minX _maxX _minY _maxY _minZ _maxZ }//k }//j }//i _image->Modified(); } else { printf("ERROR : bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage : Image not set. \n"); } // _image } //--------------------------------------------------------------------------- void FillFilter::SetGrayLevel( double graylevel ) { _graylevel = graylevel; } //--------------------------------------------------------------------------- void FillFilter::Set2D3D( int dim2D3D ) { _2D3D = dim2D3D; } //--------------------------------------------------------------------------- void FillFilter::SetToleranceFill(double tolerancefill) { _tolerancefill = tolerancefill; } //--------------------------------------------------------------------------- void FillFilter::SetDistanceFill(int distancefill) { _distancefill = distancefill; } //--------------------------------------------------------------------------- void FillFilter::SetDirection(int direction) { _direction = direction; }