35 #ifndef AIMS_DISTANCEMAP_MESHVORONOI_D_H
36 #define AIMS_DISTANCEMAP_MESHVORONOI_D_H
50 namespace meshdistance
61 const T & Back,
const T & For,
62 float dist,
bool connexity,
bool object)
66 const std::vector<Point3df> & vert = mesh.
vertex();
67 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
68 unsigned i, n = vert.size();
76 std::map<unsigned, std::set<unsigned> > neighbours;
79 for( i=0; i<poly.size(); ++i )
84 if(inittex.
item(v1)!=For
85 && inittex.
item(v2)!=For)
87 neighbours[v1].insert( v2 );
88 neighbours[v2].insert( v1 );
90 if(inittex.
item(v1)!=For
91 && inittex.
item(v3)!=For)
93 neighbours[v1].insert( v3 );
94 neighbours[v3].insert( v1 );
96 if(inittex.
item(v2)!=For
97 && inittex.
item(v3)!=For)
99 neighbours[v2].insert( v3 );
100 neighbours[v3].insert( v2 );
110 if( inittex.
item(i) == Back )
113 if( inittex.
item(i) == For )
123 if( inittex.
item(i) == Back )
126 if( inittex.
item(i) == For )
133 std::multimap<float,unsigned> front1, front2;
134 std::multimap<float,unsigned> *cfront = &front1;
135 std::multimap<float,unsigned>::iterator iv;
136 std::set<unsigned> neigh;
137 std::set<unsigned>::iterator in, fn,iu,eu = neigh.end();
143 if( tex.
item(i) == 0 )
144 front1.insert( std::pair<float,unsigned>( 0 , i ) );
149 while( cfront->size() > 0 && d < dist )
156 for( in=neighbours[i].begin(), fn=neighbours[i].end(); in!=fn; ++in )
158 d2 = tex.
item( *in );
159 pos = vert[i] - vert[*in];
161 l = sqrt( pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2] );
165 if( d2 > d + l && vor.
item( *in ) != For)
167 iu = neigh.find(*in);
170 std::pair<std::multimap<float,unsigned>::iterator,
171 std::multimap<float,unsigned>::iterator>
172 im = cfront->equal_range(tex.
item( *in ) );
173 std::multimap<float,unsigned>::iterator em;
175 for (em = im.first; em != im.second && em->second != *in ;
180 tex.
item( *in ) = d + l;
182 cfront->insert(std::pair<float,unsigned>( tex.
item( *in ), *in ) );
const std::vector< Point3df > & vertex() const
const std::vector< AimsVector< uint, D > > & polygon() const
void reserve(size_t size)
const T & item(int n) const
void push_back(const T &item)
Texture< T > MeshVoronoiT(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, const T &Back, const T &For, float dist, bool connexity, bool object)
Compute a geodesic voronoi diagram (dist = MAX_FLOAT,object=true ) of objects defined in inittex.
const short MESHDISTANCE_FORBIDDEN
global variable...