bool Graph::visit(int v, std::list<int> & sortedList) { VertexIterator iter = vertices.find(v); if (iter != vertices.end()) { if (iter->second.visited == false) { iter->second.visited = true; std::list<Edge>::const_iterator liter = iter->second.adjList.begin(); for (; liter != iter->second.adjList.end(); ++liter) { if (!visit(liter->dest, sortedList)) { return false; } } sortedList.push_front(iter->first); } else { return false; } } return true; }
void Graph::TopologicalSort() { VertexConstIterator iter = vertices.begin(); std::list<int> sortedList; bool cycle = false; for (; iter != vertices.end(); ++iter) { if (iter->second.indegree == 0) { if (!visit(iter->first, sortedList)) { cycle = true; break; } } } if (cycle || sortedList.size() != vertices.size()) { cout << "CYCLE"; return; } std::list<int>::const_iterator liter = sortedList.begin(); for (; liter != sortedList.end(); ++liter) { cout << *liter << " "; } }
void Graph::BreadthFirstTour(int v) { cout << "BFS BEGIN\n"; std::queue<int> q; VertexConstIterator iter = vertices.find(v); if (iter != vertices.end()) { q.push(iter->first); } else { cout << "BFS END\n"; return; } VertexIterator iter1; while (!q.empty()) { int vtx = q.front(); q.pop(); Vertex & v = vertices[vtx]; if (v.visited == false ) { v.visited = true; cout << v.orig << " "; std::list<Edge>::const_iterator iter = v.adjList.begin(); while (iter != v.adjList.end()) { //cout << "dest " << iter->dest << endl; VertexConstIterator citer = vertices.find(iter->dest); if (citer != vertices.end()) { q.push(citer->first); //cout << "pushing " << citer->orig << endl; } ++iter; } } } cout << "\nBFS END" << endl; resetStates(); }
void Graph::print() { VertexConstIterator iter = vertices.begin(); for (; iter != vertices.end(); ++iter) { cout << iter->second << "\n"; } }
void Graph::resetStates() { VertexIterator iter = vertices.begin(); for (; iter != vertices.end(); ++iter) { iter->second.visited = false; } }
void Graph::addEdge(int v1, int v2) { VertexIterator iter = vertices.find(v1); if (iter != vertices.end()) { Edge edge(v2); iter->second.adjList.push_back(edge); } iter = vertices.find(v2); iter->second.indegree++; }
std::vector<Vertex> ConstructPath( VertexMap& aFrom, const Vertex& aCurrentNode) { VertexMap::iterator i = aFrom.find(aCurrentNode); if( i != aFrom.end() ) { std::vector<Vertex> path = ConstructPath(aFrom,(*i).second); path.push_back(aCurrentNode); return path; }else { std::vector<Vertex> path; path.push_back(aCurrentNode); return path; } }
void Graph::DepthFirstTour(int v) { VertexIterator iter = vertices.find(v); if (iter != vertices.end()) { if (iter->second.visited == false) { iter->second.visited = true; std::list<Edge>::iterator liter = iter->second.adjList.begin(); for (; liter != iter->second.adjList.end(); ++liter) { DepthFirstTour(liter->dest); } cout << iter->second.orig << " "; } } }
void RigidBody::DrawMesh() { /* //Cube! glBegin(GL_QUADS); glColor3f(0.0f,1.0f,0.0f); glVertex3f( 1.0f, 1.0f,-1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glColor3f(1.0f,0.5f,0.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f( 1.0f,-1.0f,-1.0f); glColor3f(1.0f,0.0f,0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glColor3f(1.0f,1.0f,0.0f); glVertex3f( 1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f( 1.0f, 1.0f,-1.0f); glColor3f(0.0f,0.0f,1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glColor3f(1.0f,0.0f,1.0f); glVertex3f( 1.0f, 1.0f,-1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f,-1.0f); glEnd(); */ typedef map<VertexId, Vertex> VertexMap; VertexMap vertices = m_Geom.GetVertices(); VertexMap::const_iterator end = vertices.end(); /* glColor3f(1.0,0.0,0.0); glBegin(GL_POINTS); for (VertexMap::const_iterator it = vertices.begin(); it != end; ++it) { glPushMatrix(); glVertex3f((*it).second.GetPos().GetX(), (*it).second.GetPos().GetY(), (*it).second.GetPos().GetZ()); glPopMatrix(); } glEnd(); */ glCallList(m_RigidBodyList); /* glColor3f(1.0,1.0,0.0); typedef map<FaceId, Face> FaceMap; FaceMap faces = m_Geom.GetFaces(); FaceMap::const_iterator itFaceEnd = faces.end(); for (FaceMap::const_iterator itFace = faces.begin(); itFace != itFaceEnd; ++itFace) { glBegin(GL_POLYGON); vector<VertexId> vertexIds = (*itFace).second.GetVertexIds(); vector<VertexId>::iterator vItEnd = vertexIds.end(); for(vector<VertexId>::iterator vIt = vertexIds.begin() ; vIt != vItEnd ; vIt++) { Vertex vertex = m_Geom.GetVertex((*vIt)); glPushMatrix(); glVertex3f(vertex.GetPos().GetX(), vertex.GetPos().GetY(), vertex.GetPos().GetZ()); glPopMatrix(); } glEnd(); } */ }