36 #ifndef AIMS_MESH_CONNECTIVITY_MESHCC_D_H 37 #define AIMS_MESH_CONNECTIVITY_MESHCC_D_H 51 const Texture<T> & inittex, T threshold,
int mode )
54 const std::vector<Point3df> & vert = mesh.
vertex();
55 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
56 unsigned i, n = vert.size();
63 std::map<unsigned, std::set<unsigned> > neighbours;
68 std::cout <<
"Thresholding: " << threshold << std::endl;
95 std::cerr <<
"AimsMeshLabelConnectedComponent : thresholding mode unknown" << std::endl;
98 std::cout << nnode <<
"/" << n << std::endl;
101 for( i=0; i<poly.size(); ++i )
109 neighbours[v1].insert( v2 );
110 neighbours[v2].insert( v1 );
115 neighbours[v1].insert( v3 );
116 neighbours[v3].insert( v1 );
121 neighbours[v2].insert( v3 );
122 neighbours[v3].insert( v2 );
128 std::stack<unsigned> current;
129 std::set<unsigned>::iterator in, fn;
132 printf(
"Computing connected component\n");
141 while(!current.empty())
143 point = current.top();
145 tex.
item(point)=label;
146 for( in=neighbours[point].begin(), fn=neighbours[point].end(); in!=fn; ++in )
148 if(tex.
item(*in)==0) current.push(*in);
153 std::cout <<
"nb cc: " << label << std::endl;
164 const std::vector<Point3df> & vert = mesh.
vertex();
165 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
166 unsigned i, n = vert.size();
173 if (inittex.
item(i) == lab)
179 std::map<unsigned, std::set<unsigned> > neighbours;
181 for( i=0; i<poly.size(); ++i )
188 && inittex.
item(v1) == inittex.
item(v2) )
191 neighbours[v1].insert( v2 );
192 neighbours[v2].insert( v1 );
196 && inittex.
item(v1) == inittex.
item(v3) )
198 neighbours[v1].insert( v3 );
199 neighbours[v3].insert( v1 );
203 && inittex.
item(v2) == inittex.
item(v3) )
205 neighbours[v2].insert( v3 );
206 neighbours[v3].insert( v2 );
213 std::stack<unsigned> current;
214 std::set<unsigned>::iterator in, fn;
224 while(!current.empty())
226 point = current.top();
228 tex.
item(point)=label;
229 for( in=neighbours[point].begin(), fn=neighbours[point].end(); in!=fn; ++in )
231 if(tex.
item(*in)==0) current.push(*in);
249 const std::vector<Point3df> & vert = mesh.
vertex();
250 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
251 unsigned i, n = vert.size();
254 std::map<T,std::set<unsigned> > labels;
255 std::multimap<unsigned, T> nbLabels;
263 std::map<unsigned, std::set<unsigned> > neighbours;
270 if(inittex.
item(i) < threshold)
283 for( i=0; i<poly.size(); ++i )
290 && inittex.
item(v1) == inittex.
item(v2) )
293 neighbours[v1].insert( v2 );
294 neighbours[v2].insert( v1 );
298 && inittex.
item(v1) == inittex.
item(v3) )
300 neighbours[v1].insert( v3 );
301 neighbours[v3].insert( v1 );
305 && inittex.
item(v2) == inittex.
item(v3) )
307 neighbours[v2].insert( v3 );
308 neighbours[v3].insert( v2 );
314 std::stack<unsigned> current;
315 std::set<unsigned>::iterator in, fn;
322 while(!current.empty())
324 point = current.top();
326 tex.
item(point)=label;
327 labels[label].insert(point);
328 for( in=neighbours[point].begin(), fn=neighbours[point].end(); in!=fn; ++in )
330 if(tex.
item(*in)==0) current.push(*in);
333 nbLabels.insert( std::pair<unsigned, T> ( labels[label].size(), label ) );
336 std::cout <<
"Nb of cc : "<< label << std::endl;
338 typename std::multimap<unsigned,T>::reverse_iterator rit;
339 std::map<T, T> nbLabels_ord;
341 for (rit=nbLabels.rbegin(); rit!=nbLabels.rend(); ++rit)
343 nbLabels_ord[rit->second] = ++lab;
344 std::cout <<
"The " << lab <<
"th cc has " << rit->first <<
" points" << std::endl;
347 typename std::map<T, T>::iterator it;
353 for (it=nbLabels_ord.begin(); it!=nbLabels_ord.end(); ++it)
355 if (tex.
item(i) == it->first)
357 tex_ord.
item(i) = it->second;
371 const std::vector<Point3df> & vert = mesh.
vertex();
372 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
373 unsigned i, n = vert.size();
375 std::map<T,std::set<unsigned> > labels;
376 std::map<unsigned,T> nbLabels;
383 std::map<unsigned, std::set<unsigned> > neighbours;
390 if(inittex.
item(i) != threshold)
397 for( i=0; i<poly.size(); ++i )
406 neighbours[v1].insert( v2 );
407 neighbours[v2].insert( v1 );
412 neighbours[v1].insert( v3 );
413 neighbours[v3].insert( v1 );
418 neighbours[v2].insert( v3 );
419 neighbours[v3].insert( v2 );
425 std::stack<unsigned> current;
426 std::set<unsigned>::iterator in, fn;
434 while(!current.empty())
436 point = current.top();
438 tex.
item(point)=label;
439 labels[label].insert(point);
440 for( in=neighbours[point].begin(), fn=neighbours[point].end(); in!=fn; ++in )
446 nbLabels[ labels[label].size() ] = label;
447 std::cout <<
"The " << label <<
" th cc (" << threshold <<
")has " << labels[label].size() <<
" points " << std::endl;
450 std::cout <<
"Nb of cc : "<< label << std::endl;
453 T maxLab = nbLabels.rbegin()->first;
454 std::cout <<
"maxlab= " << maxLab <<
"-> " << nbLabels[maxLab] << std::endl;
462 if (tex.
item(i) == nbLabels[maxLab])
463 tex.
item(i) = threshold;
const int FORBIDDEN
hum, should not be there as a global, non-namespaced variable...
const T & item(int n) const
const std::vector< Point3df > & vertex() const
void reserve(size_t size)
unsigned AimsMeshLabelNbConnectedComponent(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, const T lab)
const std::vector< AimsVector< uint, D > > & polygon() const
Texture< T > AimsMeshFilterConnectedComponent(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, T threshold)
Texture< T > AimsMeshLabelConnectedComponent2Texture(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, T threshold)
Texture< T > AimsMeshLabelConnectedComponent(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, T threshold, int mode)
void push_back(const T &item)