]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp
*** empty log message ***
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualPaint / FillFilter.cpp
1
2 #include "FillFilter.h"
3
4
5 FillFilter::FillFilter()
6 {
7     _tolerancefill      =   50;
8     _distancefill       =   500;
9     _limitRecursionFill =   100000;
10     _auxImageFill       =   NULL;
11 }
12
13 //---------------------------------------------------------------------------
14 FillFilter::~FillFilter()
15 {
16     if (_auxImageFill!=NULL)
17     {
18         _auxImageFill->Delete();
19     }
20 }
21
22 //---------------------------------------------------------------------------
23 void FillFilter::SetImage(vtkImageData *image) // virtual
24 {
25     baseFilterManualPaint::SetImage(image);
26     if (_auxImageFill!=NULL)
27     {
28         _auxImageFill->Delete();
29     }
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();
37 }
38
39
40 //---------------------------------------------------------------------------
41 void FillFilter::Run() // virtual
42 {
43     if ((_px>=_minX) && (_px<=_maxX) && (_py>=_minY) && (_py<=_maxY) && (_pz>=_minZ) && (_pz<=_maxZ))
44     {
45         _graylevelbasefill          = _image->GetScalarComponentAsDouble(_px,_py,_pz, 0);
46         _pxfill                     = _px;
47         _pyfill                     = _py;
48         _pzfill                     = _pz;
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 );
56
57         FillToolRecursive(_px,_py,_pz);
58         printf("--\n");
59
60         int ii,jj,kk;
61         while (_countRecursiveFillProblem!=0)
62         {
63             _countRecursiveFillProblem  = 0;
64             _usingAuxImageFill=true;
65             for(ii=0;ii<=_maxX;ii++)
66             {
67                 for(jj=0;jj<=_maxY;jj++)
68                 {
69                     for(kk=0;kk<=_maxZ;kk++)
70                     {
71                         pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk);
72                         if ( (*pImage)==1 )
73                         {
74                             FillToolRecursive(ii,jj,kk);
75                         }
76                     } // for kk
77                 } // for jj
78             } //for ii
79             printf("-\n");
80         } // while
81
82     } //if _minX _maxX _minY _maxY _minZ _maxZ
83 }
84
85
86 //---------------------------------------------------------------------------
87 void FillFilter::FillToolRecursive(int px,int py, int pz)
88 {
89     _countRecursiveFill++;
90
91     _countProgressingFill++;
92     if (_countProgressingFill>200000)
93     {
94         printf("R %ld \n", _countRecursiveFill );
95         _countProgressingFill=0;
96     }
97
98     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
99     {
100         if (_usingAuxImageFill==true)
101         {
102             _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
103         }
104         _tmpDistfill=(px-_pxfill)*(px-_pxfill)  + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
105         _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
106
107         _auxGrayLevelValidationFill =   (_tmpiglfill!=_graylevel) &&
108                                         (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
109                                         (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
110                                         (_tmpDistfill<=_distbasefill);
111
112         if (  _auxGrayLevelValidationFill==true )
113         {
114             _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
115
116             if (_countRecursiveFill< _limitRecursionFill)
117             {
118
119                 if (_2D3D==0) //2D
120                 {
121                     if (_direction==0)  // YZ
122                     {
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);
129                     }
130                     if (_direction==1) // XZ
131                     {
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);
138                     }
139                     if (_direction==2) // XY
140                     {
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);
147                     }
148                 } else  {   // 3D
149
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);
156                 } // 2D 3D
157
158             } //_countRecursiveFill
159         } // _graylevel
160
161
162         if (  (_auxGrayLevelValidationFill==true ) &&
163               (_countRecursiveFill>= _limitRecursionFill)
164             )
165         {
166             _countRecursiveFillProblem++;
167
168                 if (_2D3D==0) //2D
169                 {
170                     if (_direction==0)  // YZ
171                     {
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);
178                     }
179                     if (_direction==1) // XZ
180                     {
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);
187                     }
188                     if (_direction==2) // XY
189                     {
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);
196                     }
197                 } else  {   // 3D
198
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);
205                 } // 2D 3D
206
207         } // _graylevel   //_limitRecursionFill
208
209
210     } //if _minX _maxX _minY _maxY _minZ _maxZ
211
212
213     _countRecursiveFill--;
214
215 }
216
217 //---------------------------------------------------------------------------
218 void FillFilter::SetAuxImageFill(int px,int py, int pz)
219 {
220     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
221     {
222         _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
223     }
224 }
225
226
227 //---------------------------------------------------------------------------
228 void FillFilter::SetToleranceFill(double tolerancefill)
229 {
230     _tolerancefill = tolerancefill;
231 }
232
233 //---------------------------------------------------------------------------
234 void FillFilter::SetDistanceFill(int distancefill)
235 {
236     _distancefill = distancefill;
237 }
238
239