35 #ifndef AIMS_DISTANCEMAP_MESHPARCELLATION_D_H 36 #define AIMS_DISTANCEMAP_MESHPARCELLATION_D_H 50 namespace meshdistance
58 const std::set<T> & setBack,
const std::set<T> & setFor,
59 const std::set<std::set<T> > & labelAllowed)
62 const std::vector<Point3df> & vert = mesh.
vertex();
63 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
64 unsigned i, n = vert.size();
66 std::map <unsigned, std::set<T> > labelNeigh;
67 typename std::map <unsigned, std::set<T> >
::iterator il,el;
72 std::map<unsigned, std::set<unsigned> > neighbours;
75 for( i=0; i<poly.size(); ++i )
80 labelNeigh[v1].insert( inittex.
item(v2) );
81 labelNeigh[v2].insert( inittex.
item(v1) );
82 labelNeigh[v1].insert( inittex.
item(v3) );
83 labelNeigh[v3].insert( inittex.
item(v1) );
84 labelNeigh[v3].insert( inittex.
item(v2) );
85 labelNeigh[v2].insert( inittex.
item(v3) );
89 std::set<short> setLabel,setTemp;
124 unsigned interSize,sizeNeigh;
125 typename std::map<unsigned,std::set<T> >::reverse_iterator im,em;
126 std::multimap<unsigned,std::set<T> > matchedLabel;
129 for ( il = labelNeigh.begin(), el = labelNeigh.end(); il!= el; ++il)
132 sizeNeigh = (il->second).size();
161 setLabel = il->second;
162 matchedLabel.clear();
164 typename std::set<T>::iterator i1,i2;
166 for (ia = labelAllowed.begin(),dl = labelAllowed.end(); ia != dl; ++ia)
169 std::insert_iterator<std::set<T> > ii(setTemp, setTemp.begin() );
170 set_intersection(setLabel.begin(),setLabel.end(),ia->begin(),ia->end(),ii );
171 interSize = setTemp.size();
172 if ( interSize >= 2 )
173 matchedLabel.insert(std::pair<
unsigned, std::set<T> >(interSize,*ia) ) ;
176 if (matchedLabel.size() == 1)
178 im = matchedLabel.rbegin();
179 tex.
item(il->first) = im->second;
183 tex.
item(il->first) = setBack;
190 if ( il->second != setFor )
191 tex.
item(il->first) = setBack;
193 tex.
item(il->first) = setFor;
212 const std::vector<Point3df> & vert = mesh.
vertex();
213 unsigned i, n = vert.size();
219 if( skiz.
item( i ) == Back )
227 if( skiz.
item( i ) != Back )
240 const std::set<T> & setBack,
const std::set<T> & setFor )
243 const std::vector<Point3df> & vert = mesh.
vertex();
244 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
245 unsigned i, n = vert.size();
247 std::map <unsigned, std::set<T> > labelNeigh;
248 typename std::map <unsigned, std::set<T> >
::iterator il,el;
253 std::map<unsigned, std::set<unsigned> > neighbours;
256 for( i=0; i<poly.size(); ++i )
261 labelNeigh[v1].insert( inittex.
item(v2) );
262 labelNeigh[v2].insert( inittex.
item(v1) );
263 labelNeigh[v1].insert( inittex.
item(v3) );
264 labelNeigh[v3].insert( inittex.
item(v1) );
265 labelNeigh[v3].insert( inittex.
item(v2) );
266 labelNeigh[v2].insert( inittex.
item(v3) );
271 for ( il = labelNeigh.begin(), el = labelNeigh.end(); il!= el; ++il)
273 sizeNeigh = (il->second).size();
275 tex.
item(il->first) = setBack;
277 tex.
item(il->first) = setFor;
295 const std::set<T> & setBack,
const std::set<T> & setFor)
297 const std::vector<Point3df> & vert = mesh.
vertex();
298 unsigned i, n = vert.size();;
306 labSet.insert( tex.item(i) );
339 if ( tex.item(i).size() > 1 )
340 outtex.
item(i) = newLab[tex.item(i)];
347 template<
class T,
class U>
351 const std::set<T> & setBack,
const std::set<T> & setFor )
356 typename std::set<T>::iterator is,es;
357 const std::vector<Point3df> & vert = mesh.
vertex();
358 unsigned i, n = vert.size();
361 std::map<std::set<U>,
short> lab_set_short;
363 ASSERT( n == vor.nItem() );
368 for (is = vor.item(i).begin(), es = vor.item(i).end();is != es; ++is)
369 setTemp.insert( *is );
371 sTex.
item(i) = setTemp;
372 lab_front_sulci.insert(setTemp);
378 lab_set_short[setBack] = 0;
380 for ( il=lab_front_sulci.begin(), el= lab_front_sulci.end(); il!=el;++il )
381 if (*il != setFor && *il != setBack)
383 lab_set_short[*il] = inc;
396 Tex.
item(i) = lab_set_short[sTex.
item(i)];
409 std::map<T,float> stat;
410 const std::vector<Point3df> & vertex = mesh.
vertex();
411 unsigned i,n = vertex.size();
412 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
414 std::map<T,std::set<unsigned> > labels;
415 typename std::map<T,std::set<unsigned> >
::iterator il,el=labels.end();
418 labels[tex.
item(i)].insert(i);
422 for (il=labels.begin();il != el; ++il)
424 std::set<unsigned> vset = il->second;
426 std::set<unsigned>::iterator evset = vset.end();
428 Point3df zero( 0.0, 0.0, 0.0 ),AB,AC,H,CH;
430 for(
unsigned ii=0, n=poly.size(); ii!=n; ++ii )
431 if( vset.find( poly[ii][0] ) != evset
432 && vset.find( poly[ii][1] ) != evset
433 && vset.find( poly[ii][2] ) != evset )
436 AB = vertex[ pol[ 1 ] ] - vertex[ pol[ 0 ] ];
437 AC = vertex[ pol[ 2 ] ] - vertex[ pol[ 0 ] ];
438 H = vertex[ pol[ 0 ] ] + ( AB.
dot( AC ) /
norm2( AB ) ) * AB;
439 CH = H - vertex[ pol[ 2 ] ];
441 surface +=
norm( CH ) *
norm( AB ) / 2;
459 std::map<T,float> stat;
461 typename std::set<T>::iterator il,el;
466 labels.insert(vol(x,y,z));
468 for ( il = labels.begin(), el = labels.end(); il != el; ++il )
472 stat[vol(x,y,z)] += voxelVol;
Texture< short > Voronoi2toTexture(const Texture< std::set< T > > &vor, const AimsSurface< 3, Void > &mesh, const std::set< T > &setBack, const std::set< T > &setFor)
const short MESHDISTANCE_FORBIDDEN
global variable...
Texture< std::set< T > > MeshBorderVoronoi(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, const std::set< T > &setBack, const std::set< T > &setFor)
Extract the boundarie of a voronoi diagram i.e.
Texture< std::set< T > > gyrusSeedDefinition(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, const std::set< T > &setBack, const std::set< T > &setFor, const std::set< std::set< T > > &labelAllowed)
Define the gyrus seed from the SKIZ.
#define ForEach3d(thing, x, y, z)
const T & item(int n) const
std::map< T, float > VolumeParcel(const AimsData< T > &vol)
Give the surface of labelled parcels defined from volume.
float norm2(const AimsVector< T, D > &v1)
Texture< short > border2Texture(const Texture< std::set< T > > &tex, const AimsSurface< 3, Void > &mesh, const std::set< T > &setBack, const std::set< T > &setFor)
Convert a multidimensional boundary map to a texture of short.
const std::vector< Point3df > & vertex() const
std::map< T, float > SurfaceParcel(const Texture< T > &tex, const AimsSurface< 3, Void > &mesh)
Give the surface of labelled parcels defined from textures.
const std::vector< AimsVector< uint, D > > & polygon() const
T dot(const AimsVector< T, D > &other) const
Texture< T > gyrusSeedDilationInSKIZ(const AimsSurface< 3, Void > &mesh, const Texture< T > &seed, const Texture< T > &skiz, const T &Back, const T &For)
Texture< T > MeshDilation(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, const T &Back, const T &For, const float dist, bool connexity)
AIMSDATA_API float norm(const Tensor &thing)