35 #ifndef AIMS_MESH_MESH_GRAPH_D_H
36 #define AIMS_MESH_MESH_GRAPH_D_H
47 template <
typename TFaceCollection >
49 typename TFaceCollection::value_type::value_type> > >
51 std::size_t nVertices )
53 typedef typename TFaceCollection::value_type::value_type VertexIndex;
54 typedef std::list<VertexIndex> Neighborhood;
58 std::vector<Neighborhood> res(nVertices);
61 std::vector<unsigned char> isFinished(nVertices, 0);
63 bool allFinished =
false;
76 for (
typename TFaceCollection::const_iterator iFic = faces.begin(); iFic != faces.end(); ++iFic)
79 typename TFaceCollection::value_type::const_iterator iFi1 = iFic->begin();
85 for (;iFi1 != iFic->end(); ++iFi1, ++iFi2)
87 std::size_t i = *iFi2;
94 if (res[i].size() == 0)
97 res[i].push_back(*iFi1);
108 VertexIndex lastPoint = res[i].back();
109 if( *iFi1 != lastPoint )
112 typename TFaceCollection::value_type::const_iterator
113 iFaceVertex = iFic->begin();
114 for( ; iFaceVertex != iFic->end(); ++iFaceVertex )
116 if (*iFaceVertex == lastPoint)
120 if (*iFi1 == res[i].front())
124 else if( *iFi1 != lastPoint )
126 res[i].push_back(*iFi1);
144 if (res[i].size() == 0)
147 res[i].insert( res[i].begin(), *iFi2 );
158 VertexIndex firstPoint = res[i].front();
159 if( *iFi2 != firstPoint )
162 typename TFaceCollection::value_type::const_iterator
163 iFaceVertex = iFic->begin();
164 for( ; iFaceVertex != iFic->end(); ++iFaceVertex )
166 if (*iFaceVertex == firstPoint)
170 if (*iFi2 == res[i].back())
174 else if( *iFi2 != firstPoint )
176 res[i].insert( res[i].begin(), *iFi2 );
192 res2(
new std::vector<std::vector<VertexIndex> >( res.size()) );
195 for (std::size_t i = 0; i < res.size(); ++i)
197 std::vector<VertexIndex> & r2 = (*res2)[i];
198 r2.resize( res[i].size() );
200 typename std::list<VertexIndex>::iterator il, el = res[i].end();
201 for( il=res[i].begin(); il!=el; ++il, ++j )
211 template <
typename TVertexNode,
typename TFaceNode,
typename TVertexCollection,
typename TFaceCollection,
typename TNeighborCollection >
215 TVertexCollection
const & vertices,
216 TFaceCollection
const & faceIndices,
217 std::vector<std::list<std::size_t> >
const & invertedFaceIndices,
218 TNeighborCollection
const & neighbors,
219 std::list<TVertexNode> & graph_vertices,
220 std::list<TFaceNode> & graph_faces
223 if( vertices.size() != invertedFaceIndices.size() )
224 throw std::runtime_error(
225 "vertices and invertedFaceIndices sizes differ" );
226 if( vertices.size() != neighbors.size() )
227 throw std::runtime_error(
"vertices and neighbors sizes differ" );
229 _index_vertex.resize(vertices.size());
230 _index_face.resize(faceIndices.size());
233 for (std::size_t i = 0; i < vertices.size(); ++i)
237 m.pos() = vertices[i];
239 _index_vertex[i] = graph_vertices.insert(graph_vertices.end(), m);
243 for (std::size_t i = 0; i < faceIndices.size(); ++i)
247 for (
int j = 0; j < 3; ++j)
249 if( vertices.size() <= faceIndices[i][j] )
250 throw std::runtime_error(
251 "vertices size smaller than used faceIndices" );
252 f.face[j] = _index_vertex[faceIndices[i][j]];
255 _index_face[i] = graph_faces.insert(graph_faces.end(), f);
260 for (std::size_t i = 0; i < vertices.size(); ++i)
262 for (std::list<std::size_t>::const_iterator j = invertedFaceIndices[i].begin(); j != invertedFaceIndices[i].end(); ++j)
264 if( faceIndices.size() <= *j )
265 throw std::runtime_error(
266 "faceIndices size smaller than used invertedFaceIndices" );
267 _index_vertex[i]->faces().push_back(_index_face[*j]);
269 for (
typename TNeighborCollection::value_type::const_iterator iN = neighbors[i].begin();
270 iN != neighbors[i].end(); ++iN)
272 if( vertices.size() <= *iN )
273 throw std::runtime_error(
274 "vertices size smaller than used neighbors indices" );
275 _index_vertex[i]->neighbors().push_back(_index_vertex[*iN]);
Converts a AimsSurface mesh into a (vertexList, faceList) mesh graph.
carto::rc_ptr< std::vector< std::vector< typename TFaceCollection::value_type::value_type > > > circular_neighborhoods(TFaceCollection const &faces, std::size_t nVertices)