2 #include "FillFilter.h"
5 FillFilter::FillFilter()
9 _limitRecursionFill = 100000;
13 //---------------------------------------------------------------------------
14 FillFilter::~FillFilter()
16 if (_auxImageFill!=NULL)
18 _auxImageFill->Delete();
22 //---------------------------------------------------------------------------
23 void FillFilter::SetImage(vtkImageData *image) // virtual
25 baseFilterManualPaint::SetImage(image);
26 if (_auxImageFill!=NULL)
28 _auxImageFill->Delete();
30 _auxImageFill = vtkImageData::New();
31 _auxImageFill->SetDimensions(_maxX+1,_maxY+1,_maxZ+1);
32 _auxImageFill->SetOrigin(0,0,0);
33 _auxImageFill->SetExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
34 _auxImageFill->SetWholeExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
35 _auxImageFill->SetScalarTypeToUnsignedChar();
36 _auxImageFill->AllocateScalars();
40 //---------------------------------------------------------------------------
41 void FillFilter::Run() // virtual
43 if ((_px>=_minX) && (_px<=_maxX) && (_py>=_minY) && (_py<=_maxY) && (_pz>=_minZ) && (_pz<=_maxZ))
45 _graylevelbasefill = _image->GetScalarComponentAsDouble(_px,_py,_pz, 0);
49 _distbasefill = _distancefill*_distancefill;
50 _countRecursiveFill = 0;
51 _countRecursiveFillProblem = 0;
52 _countProgressingFill = 0;
53 unsigned char *pImage = (unsigned char *)_auxImageFill->GetScalarPointer();
54 _usingAuxImageFill=false;
55 memset ( pImage , 0 , _maxX*_maxY*_maxZ );
57 FillToolRecursive(_px,_py,_pz);
61 while (_countRecursiveFillProblem!=0)
63 _countRecursiveFillProblem = 0;
64 _usingAuxImageFill=true;
65 for(ii=0;ii<=_maxX;ii++)
67 for(jj=0;jj<=_maxY;jj++)
69 for(kk=0;kk<=_maxZ;kk++)
71 pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk);
74 FillToolRecursive(ii,jj,kk);
82 } //if _minX _maxX _minY _maxY _minZ _maxZ
86 //---------------------------------------------------------------------------
87 void FillFilter::FillToolRecursive(int px,int py, int pz)
89 _countRecursiveFill++;
91 _countProgressingFill++;
92 if (_countProgressingFill>200000)
94 printf("R %ld \n", _countRecursiveFill );
95 _countProgressingFill=0;
98 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
100 if (_usingAuxImageFill==true)
102 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
104 _tmpDistfill=(px-_pxfill)*(px-_pxfill) + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
105 _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
107 _auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
108 (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
109 (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
110 (_tmpDistfill<=_distbasefill);
112 if ( _auxGrayLevelValidationFill==true )
114 _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
116 if (_countRecursiveFill< _limitRecursionFill)
121 if (_direction==0) // YZ
123 //FillToolRecursive(px+1,py,pz);
124 //FillToolRecursive(px-1,py,pz);
125 FillToolRecursive(px,py+1,pz);
126 FillToolRecursive(px,py-1,pz);
127 FillToolRecursive(px,py,pz-1);
128 FillToolRecursive(px,py,pz+1);
130 if (_direction==1) // XZ
132 FillToolRecursive(px+1,py,pz);
133 FillToolRecursive(px-1,py,pz);
134 //FillToolRecursive(px,py+1,pz);
135 //FillToolRecursive(px,py-1,pz);
136 FillToolRecursive(px,py,pz-1);
137 FillToolRecursive(px,py,pz+1);
139 if (_direction==2) // XY
141 FillToolRecursive(px+1,py,pz);
142 FillToolRecursive(px,py+1,pz);
143 FillToolRecursive(px-1,py,pz);
144 FillToolRecursive(px,py-1,pz);
145 //FillToolRecursive(px,py,pz-1);
146 //FillToolRecursive(px,py,pz+1);
150 FillToolRecursive(px+1,py,pz);
151 FillToolRecursive(px-1,py,pz);
152 FillToolRecursive(px,py+1,pz);
153 FillToolRecursive(px,py-1,pz);
154 FillToolRecursive(px,py,pz-1);
155 FillToolRecursive(px,py,pz+1);
158 } //_countRecursiveFill
162 if ( (_auxGrayLevelValidationFill==true ) &&
163 (_countRecursiveFill>= _limitRecursionFill)
166 _countRecursiveFillProblem++;
170 if (_direction==0) // YZ
172 //SetAuxImageFill(px+1,py,pz);
173 //SetAuxImageFill(px-1,py,pz);
174 SetAuxImageFill(px,py+1,pz);
175 SetAuxImageFill(px,py-1,pz);
176 SetAuxImageFill(px,py,pz-1);
177 SetAuxImageFill(px,py,pz+1);
179 if (_direction==1) // XZ
181 SetAuxImageFill(px+1,py,pz);
182 SetAuxImageFill(px-1,py,pz);
183 //SetAuxImageFill(px,py+1,pz);
184 //SetAuxImageFill(px,py-1,pz);
185 SetAuxImageFill(px,py,pz-1);
186 SetAuxImageFill(px,py,pz+1);
188 if (_direction==2) // XY
190 SetAuxImageFill(px+1,py,pz);
191 SetAuxImageFill(px-1,py,pz);
192 SetAuxImageFill(px,py+1,pz);
193 SetAuxImageFill(px,py-1,pz);
194 //SetAuxImageFill(px,py,pz-1);
195 //SetAuxImageFill(px,py,pz+1);
199 SetAuxImageFill(px+1,py,pz);
200 SetAuxImageFill(px-1,py,pz);
201 SetAuxImageFill(px,py+1,pz);
202 SetAuxImageFill(px,py-1,pz);
203 SetAuxImageFill(px,py,pz-1);
204 SetAuxImageFill(px,py,pz+1);
207 } // _graylevel //_limitRecursionFill
210 } //if _minX _maxX _minY _maxY _minZ _maxZ
213 _countRecursiveFill--;
217 //---------------------------------------------------------------------------
218 void FillFilter::SetAuxImageFill(int px,int py, int pz)
220 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
222 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
227 //---------------------------------------------------------------------------
228 void FillFilter::SetToleranceFill(double tolerancefill)
230 _tolerancefill = tolerancefill;
233 //---------------------------------------------------------------------------
234 void FillFilter::SetDistanceFill(int distancefill)
236 _distancefill = distancefill;