DisplayGraphNode.cpp

Go to the documentation of this file.
00001 #include "rose.h"
00002 #include "DisplayGraphNode.h"
00003 #include "DisplayEdge.h"
00004 
00005 #include "AstDisplayInfo.h"
00006 
00007 
00008 #include <QGraphicsScene>
00009 #include <QSet>
00010 
00011 #include <QDebug>
00012 
00013 
00014 #include <cmath>
00015 
00016 using namespace std;
00017 
00018 typedef rose_graph_integer_node_hash_map      NodeMap;
00019 typedef rose_graph_integer_edge_hash_multimap EdgeMap;
00020 
00021 
00022 
00023 // ---------------------- DisplayGraphNode -------------------------------
00024 
00025 DisplayGraphNode::DisplayGraphNode(QGraphicsScene * sc)
00026     : DisplayNode(sc),id(-1)
00027 {
00028 }
00029 
00030 DisplayGraphNode::DisplayGraphNode(const QString & caption,QGraphicsScene * sc)
00031     : DisplayNode(caption,sc),id(-1)
00032 {
00033 }
00034 
00035 
00036 
00037 DisplayGraphNode::~DisplayGraphNode()
00038 {
00039     // every node deletes its outgoing edges
00040     qDeleteAll(outEdges);
00041 }
00042 
00043 void DisplayGraphNode::deleteAllEdges()
00044 {
00045     foreach(DisplayEdge *e, outEdges)
00046     {
00047         DisplayGraphNode * src = dynamic_cast<DisplayGraphNode*>(e->destNode() );
00048         src->removeInEdge(e);
00049         delete e;
00050     }
00051 
00052     foreach(DisplayEdge *e, inEdges)
00053     {
00054         DisplayGraphNode * src = dynamic_cast<DisplayGraphNode*>(e->sourceNode());
00055         src->deleteOutEdge(e);
00056     }
00057 
00058     outEdges.clear();
00059     inEdges.clear();
00060 }
00061 
00062 void DisplayGraphNode::deleteOutEdge(DisplayEdge * e)
00063 {
00064     int i = outEdges.indexOf(e);
00065     if(i>=0)
00066     {
00067         delete outEdges[i];
00068         outEdges.removeAt(i);
00069     }
00070 }
00071 
00072 void DisplayGraphNode::removeInEdge(DisplayEdge * e)
00073 {
00074     int i = inEdges.indexOf(e);
00075     if(i>=0)
00076         inEdges.removeAt(i);
00077 }
00078 
00079 
00080 
00081 void DisplayGraphNode::addOutEdge(DisplayNode * to)
00082 {
00083     outEdges.push_back(new DisplayEdge(this,to));
00084 
00085     if(scene)
00086         scene->addItem(outEdges.back());
00087 }
00088 
00089 void DisplayGraphNode::addInEdge(DisplayNode * from)
00090 {
00091     inEdges.push_back(new DisplayEdge(from,this));
00092 
00093     if(scene)
00094         scene->addItem(outEdges.back());
00095 }
00096 
00097 void DisplayGraphNode::addEdge(DisplayEdge * edge)
00098 {
00099     DisplayGraphNode * from = dynamic_cast<DisplayGraphNode*> (edge->sourceNode());
00100     DisplayGraphNode * to   = dynamic_cast<DisplayGraphNode*> (edge->destNode());
00101 
00102     Q_ASSERT(from && to); // there should only be GraphNodes in this Graph
00103 
00104     from->outEdges.push_back(edge);
00105     to  ->inEdges.push_back(edge);
00106 
00107     Q_ASSERT(from->scene == to->scene);
00108 
00109     if(from->scene)
00110         from->scene->addItem(edge);
00111 }
00112 
00113 
00114 QVariant DisplayGraphNode::itemChange(GraphicsItemChange change, const QVariant &value)
00115 {
00116     if(change == ItemPositionHasChanged)
00117     {
00118         foreach(DisplayEdge * edge, inEdges)
00119             edge->adjust();
00120 
00121         foreach(DisplayEdge * edge,outEdges)
00122             edge->adjust();
00123     }
00124     return DisplayNode::itemChange(change, value);
00125 }
00126 
00127 void DisplayGraphNode::setScene(QGraphicsScene * sc)
00128 {
00129     if(!sc && scene)
00130     {
00131         foreach(QGraphicsItem * i, inEdges)
00132             scene->removeItem(i);
00133 
00134         foreach(QGraphicsItem * i, outEdges)
00135             scene->removeItem(i);
00136     }
00137 
00138     if(sc)
00139     {
00140         foreach(QGraphicsItem * i, inEdges)
00141             sc->addItem(i);
00142 
00143         foreach(QGraphicsItem * i, outEdges)
00144             sc->addItem(i) ;
00145     }
00146 
00147     DisplayNode::setScene(sc);
00148 }
00149 
00150 bool DisplayGraphNode::isAdjacentTo(DisplayGraphNode * o) const
00151 {
00152     foreach(DisplayEdge * e, inEdges)
00153         if(e->sourceNode() == o)
00154             return true;
00155 
00156     foreach(DisplayEdge * e, outEdges)
00157         if(e->destNode() == o)
00158             return true;
00159 
00160     return false;
00161 }
00162 
00163 
00164 
00165 
00166 // ---------------------- DisplayGraph -------------------------------
00167 
00168 #include "ui_LayoutControl.h"
00169 #include <QTimer>
00170 
00171 DisplayGraph::DisplayGraph(QGraphicsScene * sc, QObject * par)
00172     : QObject(par),
00173       scene(sc),
00174       curIteration(0),
00175       uiWidget(new QWidget()),
00176       ui(new Ui::LayoutControl()),
00177       timer(new QTimer(this))
00178 {
00179     ui->setupUi(uiWidget);
00180 
00181     curDelta = ui->spnDelta->value() * 10e-4;
00182     optimalDistance = ui->spnOptimalDistance->value();
00183     updateWidget();
00184 
00185     connect(ui->cmdStartTimer,SIGNAL(clicked()), SLOT(on_cmdStartTimer_clicked()));
00186     connect(ui->cmdStopTimer,SIGNAL(clicked()), SLOT(on_cmdStopTimer_clicked()));
00187 
00188     connect(ui->cmdReset,SIGNAL(clicked()), SLOT(on_cmdReset_clicked()));
00189 
00190     connect(timer,SIGNAL(timeout()),SLOT(on_timerEvent()));
00191 }
00192 
00193 
00194 DisplayGraph::~DisplayGraph()
00195 {
00196     delete ui;
00197 
00198     qDeleteAll(n);
00199 }
00200 
00201 void DisplayGraph::updateWidget()
00202 {
00203 }
00204 
00205 
00206 void DisplayGraph::on_cmdStartTimer_clicked()
00207 {
00208     curIteration=0;
00209     curDelta = ui->spnDelta->value() *1e-4;
00210     ui->cmdStartTimer->setChecked(true);
00211     ui->cmdStopTimer->setChecked(false);
00212     timer->start(ui->spnTimerInterval->value());
00213 }
00214 
00215 void DisplayGraph::on_cmdStopTimer_clicked()
00216 {
00217     ui->cmdStartTimer->setChecked(false);
00218     ui->cmdStopTimer->setChecked(true);
00219     timer->stop();
00220 }
00221 
00222 
00223 void DisplayGraph::on_cmdReset_clicked()
00224 {
00225     curIteration=0;
00226     curDelta = ui->spnDelta->value() *1e-4;
00227     circleLayout();
00228     updateWidget();
00229 }
00230 
00231 
00232 void DisplayGraph::deleteNode(DisplayNode * dn)
00233 {
00234     DisplayGraphNode * node = dynamic_cast<DisplayGraphNode*>(dn);
00235 
00236     int i = n.indexOf(node);
00237     if(i<0)
00238     {
00239         qDebug() << "DisplayGraph::deleteNode: tried to remove not registered node";
00240         return;
00241     }
00242 
00243     node->deleteAllEdges();
00244     delete node;
00245     n.removeAt(i);
00246 
00247     for(int k=i; k<n.size(); k++)
00248         n[k]->setId(n[k]->getId()-1);
00249 
00250 
00251     QList<DisplayGraphNode*> neighbors = edgeInfo.values(node);
00252     foreach(DisplayGraphNode * otherNode, neighbors)
00253     {
00254         edgeInfo.remove(node,otherNode);
00255         edgeInfo.remove(otherNode,node);
00256     }
00257 }
00258 
00259 
00260 void DisplayGraph::addEdge(DisplayGraphNode * n1, DisplayGraphNode * n2, const QString & label)
00261 {
00262     int i1 = n.indexOf(n1);
00263     int i2 = n.indexOf(n2);
00264     Q_ASSERT(i1 >=0 && i2 >=0); // nodes have to be added before edges are added
00265     addEdge(i1,i2,label);
00266 }
00267 
00268 void DisplayGraph::addEdge ( int i1, int i2, const QString & label)
00269 {
00270     //edge already exists
00271     if(edgeInfo.contains(n[i1],n[i2]))
00272         return;
00273 
00274     // create visible part
00275     DisplayEdge * e = new DisplayEdge(n[i1],n[i2]);
00276     e->setEdgeLabel(label);
00277     e->setPaintMode(DisplayEdge::STRAIGHT);
00278     DisplayGraphNode::addEdge(e);
00279     // ..and invisible part
00280     addInvisibleEdge(i1,i2);
00281 }
00282 
00283 void DisplayGraph::addInvisibleEdge(int i1, int i2)
00284 {
00285     if(!edgeInfo.contains(n[i1],n[i2]))
00286         edgeInfo.insert(n[i1],n[i2]);
00287     if(!edgeInfo.contains(n[i2],n[i1]))
00288         edgeInfo.insert(n[i2],n[i1]);
00289 }
00290 
00291 void DisplayGraph::addNode(DisplayGraphNode * node)
00292 {
00293     node->setScene(scene);
00294     node->setPos(qrand()/(double)RAND_MAX , qrand()/(double)RAND_MAX);
00295     n.push_back(node);
00296     node->setId(n.size()-1);
00297 }
00298 
00299 int DisplayGraph::addGravityNode()
00300 {
00301     DisplayGraphNode * node = new DisplayGraphNode("x",scene);
00302     node->setBgColor(QColor(Qt::red).lighter(150));
00303     n.push_back(node);
00304     node->setId(n.size()-1);
00305     return n.size()-1;
00306 }
00307 
00308 void DisplayGraph::on_timerEvent()
00309 {
00310     if( curDelta <= 0)
00311     {
00312         timer->stop();
00313         return;
00314     }
00315 
00316     optimalDistance= ui->spnOptimalDistance->value();
00317 
00318     springBasedLayoutIteration(curDelta);
00319 
00320     curIteration++;
00321     updateWidget();
00322 }
00323 
00324 
00325 
00326 bool DisplayGraph::isAdjacentTo(DisplayGraphNode * n1, DisplayGraphNode * n2) const
00327 {
00328     //if(n1 >= n2)
00329     //    qSwap(n1,n2);
00330 
00331     return edgeInfo.contains(n1,n2);
00332 }
00333 
00334 qreal DisplayGraph::springBasedLayoutIteration(qreal delta)
00335 {
00336     static QVector<QPointF> & forces    = forcesList;
00337     static QVector<QPointF> & oldForces = oldForcesList;
00338 
00339     qSwap(forces,oldForces);
00340 
00341     forces.fill(QPointF(0,0),n.size());
00342 
00343     if(oldForces.size() != n.size())
00344         oldForces.fill(QPointF(0,0),n.size());
00345 
00346 
00347     // Calculate attractive forces between adjacent nodes
00348     foreach(DisplayGraphNode * n1, n)
00349     {
00350         QMultiMap<DisplayGraphNode*, DisplayGraphNode*>::iterator i = edgeInfo.find(n1);
00351         while (i != edgeInfo.end() && i.key() == n1)
00352         {
00353             DisplayGraphNode * n2 = *i;
00354 
00355             qreal dist= optimalDistance + n1->boundingRect().width()/2 +
00356                                           n2->boundingRect().width()/2;
00357 
00358             QPointF force (attractiveForce(n1->pos(),n2->pos(),dist) );
00359             forces[n1->getId()] += force;
00360             forces[n2->getId()] -= force;
00361 
00362             ++i;
00363         }
00364     }
00365 
00366 
00367     // Calculate repulsive forces for near nodes
00368     foreach(DisplayGraphNode * n1, n)
00369     {
00370         QRectF rect(0,0,10*optimalDistance,10*optimalDistance);
00371         rect.moveCenter(n1->pos());
00372         QList<QGraphicsItem*> nearItems = scene->items(rect,Qt::IntersectsItemBoundingRect);
00373 
00374         foreach(QGraphicsItem * n2,nearItems)
00375         {
00376             DisplayGraphNode * dispN1 = n1;
00377             DisplayGraphNode * dispN2 = dynamic_cast<DisplayGraphNode*>(n2);
00378 
00379             // edges are also found by scene->item()
00380             if( !dispN2)
00381                 continue;
00382 
00383             qreal dist= optimalDistance + n1->boundingRect().width()/2 +
00384                                           n2->boundingRect().width()/2;
00385 
00386             QPointF repForce(repulsiveForce(n1->pos(),n2->pos(),dist));
00387 
00388             forces[dispN1->getId()] += repForce;
00389             forces[dispN2->getId()] -= repForce;
00390         }
00391     }
00392 
00393     qreal max=0;
00394     for(int i=0; i<n.size(); i++)
00395     {
00396         if(n[i]->isMouseHold())
00397             continue;
00398 
00399         // speed up, if cos(angle between forces) is positive (then cosAngle+1) >1
00400         // slow down if forces change direction rapidly i.e. cos(angle between forces) near -1
00401         //qreal cosAngle = getCosBetween(forces[i],oldForces[i])/2 + 1;
00402         //rotation detection
00403         //qreal sinAngle = qAbs(getSinBetween(forces[i],oldForces[i]));
00404 
00405         //qDebug() << n[i]->getDisplayName() << "Cos" << cosAngle << "Sin" << sinAngle;
00406 
00407         qreal dx = forces[i].x() * delta;
00408         qreal dy = forces[i].y() * delta;
00409 
00410         max=qMax(max,dx);
00411         max=qMax(max,dy);
00412 
00413         dx = qBound(-optimalDistance,dx,optimalDistance);
00414         dy = qBound(-optimalDistance,dy,optimalDistance);
00415 
00416         //if(qAbs(dx) < 0.2)  dx=0;
00417         //if(qAbs(dy) < 0.2)  dx=0;
00418 
00419         dx += ((rand()/(double)RAND_MAX) - 0.5 )* ui->spnRandomFactor->value();
00420         dy += ((rand()/(double)RAND_MAX) - 0.5 )* ui->spnRandomFactor->value();
00421 
00422         n[i]->moveBy(dx,dy);
00423     }
00424 
00425     return max;
00426 }
00427 
00428 
00429 qreal DisplayGraph::getCosBetween(QPointF & a, QPointF & b)
00430 {
00431     qreal normalize = ( a.x() * a.x()  + a.y() * a.y() ) *
00432                       ( b.x() * b.x()  + b.y() * b.y() );
00433 
00434     if (qAbs(normalize) < 1e-8)
00435         return 0;
00436 
00437     normalize = sqrt(normalize);
00438 
00439     return ( a.x() * b.x() + a.y() * b.y() ) / normalize;
00440 }
00441 
00442 
00443 qreal DisplayGraph::getSinBetween(QPointF & a, QPointF & b)
00444 {
00445     qreal normalize = ( a.x() * a.x()  + a.y() * a.y() ) *
00446                       ( b.x() * b.x()  + b.y() * b.y() );
00447 
00448     if (qAbs(normalize) < 1e-8)
00449         return 1;
00450 
00451     normalize = sqrt(normalize);
00452 
00453     return ( a.x() * b.y() - a.y() * b.x() ) / normalize;
00454 }
00455 
00456 QPointF DisplayGraph::repulsiveForce (const QPointF & n1, const QPointF & n2, qreal optDist)
00457 {
00458     if(n1 == n2)
00459         return QPointF(0,0);
00460 
00461 
00462 
00463     QPointF v (n1-n2);
00464     QLineF l (n1,n2);
00465 
00466     QPointF res =( optDist *optDist / l.length() ) * v;
00467     return  res;
00468 }
00469 
00470 QPointF DisplayGraph::attractiveForce(const QPointF & n1, const QPointF & n2, qreal optDist)
00471 {
00472     if(n1 == n2)
00473     {
00474         qDebug() << "GraphLayout AttrForce Warning";
00475         return QPointF(0,0);
00476     }
00477 
00478     QPointF v( n2-n1);
00479     qreal normSq = v.x()*v.x() + v.y() * v.y() ;
00480     QPointF res =( normSq  / optDist) * v;
00481     return res;
00482 }
00483 
00484 
00485 void DisplayGraph::circleLayout()
00486 {
00487     int nodeCount = n.size();
00488     qreal radius = optimalDistance/10 * nodeCount /2;
00489 
00490     for(int i=0; i<nodeCount ; i++)
00491     {
00492         qreal angle = ( static_cast<qreal>(i)/nodeCount ) * (2* M_PI);
00493         QPointF newPos ( cos(angle),sin(angle) );
00494         newPos *= radius;
00495         n[i]->setPos(newPos);
00496     }
00497 }
00498 
00499 // --------------------- DisplayCallGraph ---------------------------------
00500 
00501 
00502 DisplayCallGraph::DisplayCallGraph(QGraphicsScene * sc,
00503                                    QObject * par) :
00504       DisplayGraph(sc,par)
00505 {
00506     colorNode       = QColor(Qt::blue).lighter(150);;
00507     colorBorderNode = QColor(Qt::gray).lighter(150);;
00508 }
00509 
00510 
00511 void DisplayCallGraph::addCgNode(int callGraphNodeId, SgGraphNode * n)
00512 {
00513     if(!cg)
00514         return;
00515 
00516     rose_graph_integer_node_hash_map & nodeMap = cg->get_node_index_to_node_map();
00517 
00518     if(callToDisplayNodeMap.contains(callGraphNodeId)) //already added
00519     {
00520         qDebug() << "Node already added" << callGraphNodeId;
00521         return;
00522     }
00523 
00524     Q_ASSERT(nodeMap.find(callGraphNodeId) != nodeMap.end());
00525     SgGraphNode  * gn = nodeMap[callGraphNodeId];
00526 
00527 
00528     DisplayGraphNode * displayGraphNode =new DisplayGraphNode(gn->get_name().c_str());
00529     displayGraphNode->setSgNode(n);
00530     addNode(displayGraphNode);
00531 
00532     qDebug() << "Added Node" << gn->get_name().c_str() << "with id" << callGraphNodeId;
00533 
00534     callToDisplayNodeMap.insert(callGraphNodeId,displayGraphNode);
00535 }
00536 
00537 void DisplayCallGraph::addCgEdge(int from, int to)
00538 {
00539     Q_ASSERT(callToDisplayNodeMap.contains(from));
00540     Q_ASSERT(callToDisplayNodeMap.contains(to));
00541 
00542     addEdge(callToDisplayNodeMap[from],
00543             callToDisplayNodeMap[to]); //here edge label could be added
00544 
00545 }
00546 
00547 
00548 void DisplayCallGraph::addFunction(SgNode * node, int depth)
00549 {
00550     typedef rose_graph_integer_node_hash_map        NodeMap;
00551     typedef rose_graph_integer_edge_hash_multimap   EdgeMap;
00552     typedef rose_graph_string_integer_hash_multimap StringNodeMap;
00553 
00554 
00555     if(AstDisplayInfo::getType(node) != AstDisplayInfo::FUNCTION)
00556         return;
00557 
00558     // Find node via function-name string (TODO not unique!!)
00559     QString funcName = AstDisplayInfo::getShortNodeNameDesc(node);
00560     StringNodeMap & stringNodeMap = cg->get_string_to_node_index_multimap();
00561     StringNodeMap::iterator it = stringNodeMap.find(funcName.toStdString());
00562 
00563     if(it == stringNodeMap.end())
00564         return;
00565 
00566     int nodeIndex= it->second;
00567 
00568     // filter callgraph
00569     NodeMap filteredNodes;
00570     EdgeMap filteredEdges;
00571     QSet<int> visitedNodes;
00572     generateCgSubGraph(cg,nodeIndex,filteredNodes,filteredEdges,
00573                        visitedNodes,depth);
00574 
00575 
00576     addElements(filteredNodes,filteredEdges);
00577 }
00578 
00579 void DisplayCallGraph::clear()
00580 {
00581     qDeleteAll(n);
00582     callToDisplayNodeMap.clear();
00583     cg=NULL;
00584     edgeInfo.clear();
00585 }
00586 
00587 void DisplayCallGraph::setCg(SgIncidenceDirectedGraph * cg_)
00588 {
00589     // when the callgraph is switched the current display is not valid any more
00590     if(cg_ != cg && cg !=NULL)
00591         clear();
00592 
00593     cg=cg_;
00594 
00595     if(cg==NULL)
00596         return;
00597 
00598     typedef rose_graph_integer_edge_hash_multimap EdgeMap;
00599 
00600     EdgeMap & allEdges = cg->get_node_index_to_edge_multimap();
00601     EdgeMap & outEdges = cg->get_node_index_to_edge_multimap_edgesOut();
00602     EdgeMap & inEdges  = cg->get_node_index_to_edge_multimap_edgesIn();
00603 
00604 
00605     if(allEdges.size()==0)
00606     {
00607         allEdges.insert(outEdges.begin(),outEdges.end());
00608         allEdges.insert(inEdges.begin(),inEdges.end());
00609     }
00610 
00611 }
00612 
00613 void DisplayCallGraph::addElements( rose_graph_integer_node_hash_map & nodes,
00614                                     rose_graph_integer_edge_hash_multimap & edges)
00615 {
00616     if(!cg)
00617         return;
00618 
00619     qDebug() << "Current Nodes";
00620 
00621 
00622 
00623     for( NodeMap::iterator it = nodes.begin();  it != nodes.end(); ++it )
00624     {
00625         addCgNode(it->first,it->second);
00626     }
00627 
00628 
00629     for( EdgeMap::iterator it= edges.begin(); it != edges.end(); ++it )
00630     {
00631         SgDirectedGraphEdge * edge = isSgDirectedGraphEdge(it->second);
00632         Q_ASSERT(edge);
00633         addCgEdge(edge->get_from()->get_index(),edge->get_to()->get_index());
00634     }
00635 }
00636 
00637 
00638 void DisplayCallGraph::deleteNode(DisplayNode * n)
00639 {
00640     DisplayGraphNode * node = dynamic_cast<DisplayGraphNode*>(n);
00641     Q_ASSERT(node);
00642 
00643     SgGraphNode* sgGraphNode = isSgGraphNode(node->getSgNode());
00644     Q_ASSERT(sgGraphNode);
00645 
00646     Q_ASSERT( callToDisplayNodeMap[sgGraphNode->get_index()] == node);
00647     callToDisplayNodeMap.remove(sgGraphNode->get_index());
00648 
00649     DisplayGraph::deleteNode(n);
00650 }
00651 
00652 
00653 void DisplayCallGraph::generateCgSubGraph(SgIncidenceDirectedGraph * cg,
00654                                           int nodeId,
00655                                           rose_graph_integer_node_hash_map & nodeMapOut,
00656                                           rose_graph_integer_edge_hash_multimap & edgeMapOut,
00657                                           QSet<int> & visitedNodes,
00658                                           int curDepth)
00659 {
00660     Q_ASSERT(curDepth >= 0);
00661 
00662     if(visitedNodes.contains(nodeId))
00663         return;
00664 
00665     NodeMap & nodes = cg->get_node_index_to_node_map ();
00666     Q_ASSERT( nodes.find(nodeId) != nodes.end());
00667 
00668     nodeMapOut.insert(make_pair<int,SgGraphNode*>(nodeId,nodes[nodeId] ));
00669     visitedNodes.insert(nodeId);
00670 
00671 
00672     EdgeMap & edges = cg->get_node_index_to_edge_multimap();
00673 
00674     EdgeMap::iterator edgeIt = edges.find(nodeId);
00675     for(; edgeIt != edges.end() && edgeIt->first == nodeId; ++edgeIt )
00676     {
00677         SgDirectedGraphEdge * edge = isSgDirectedGraphEdge(edgeIt->second);
00678         Q_ASSERT(edge);
00679 
00680         // Add edge
00681         int newNodeIndex = edge->get_to()->get_index();
00682         if(newNodeIndex == nodeId)
00683             newNodeIndex = edge->get_from()->get_index();
00684 
00685         if(curDepth > 0)
00686         {
00687             edgeMapOut.insert(*edgeIt);
00688             generateCgSubGraph(cg,newNodeIndex,nodeMapOut,edgeMapOut,
00689                                visitedNodes,curDepth-1);
00690         }
00691         else
00692         {
00693             if(visitedNodes.contains(newNodeIndex))
00694                 edgeMapOut.insert(*edgeIt);
00695         }
00696     }
00697 }
00698 
00699 
00700 
00701 
00702 
00703 
00704 #if 0
00705 DisplayGraph * DisplayGraph::generateTestGraph(QGraphicsScene * sc,QObject * par)
00706 {
00707     DisplayGraph * g = new DisplayGraph(sc,par);
00708 
00709     // add some nodes
00710     for(int i=0; i < 6; i++)
00711     {
00712         DisplayGraphNode * n = new DisplayGraphNode( QString("%1").arg(i),sc );
00713         //n->setPos(i,0);
00714         g->addNode(n);
00715     }
00716 
00717 
00718     // ..and edges
00719     g->addEdge(0,1);
00720     g->addEdge(1,0);
00721     g->addEdge(0,2);
00722 
00723     g->addEdge(1,3);
00724 
00725     g->addEdge(3,4);
00726     g->addEdge(4,5);
00727     g->addEdge(3,5);
00728     g->addEdge(2,4);
00729 
00730 
00731     int n1=g->addNode( new DisplayGraphNode("Node1",sc) ) ;
00732     int n2=g->addNode( new DisplayGraphNode("LongNode2",sc));
00733     int n3=g->addNode( new DisplayGraphNode("LongLongNode3",sc));
00734 
00735     int gn=g->addGravityNode();
00736 
00737     g->addEdge(n1,n2);
00738     g->addEdge(0,n1);
00739     g->addEdge(2,n2);
00740     g->addInvisibleEdge(gn,n1);
00741     g->addInvisibleEdge(gn,n2);
00742     g->addInvisibleEdge(gn,n3);
00743 
00744 
00745     g->circleLayout();
00746     return g;
00747 }
00748 
00749 
00750 
00751 
00752 DisplayGraph * DisplayGraph::generateLargeTestGraph(QGraphicsScene * sc,QObject * par)
00753 {
00754     DisplayGraph * g = new DisplayGraph(sc,par);
00755 
00756     qDebug() << "Generating Graph";
00757 
00758     const int NODE_COUNT = 200;
00759     const int EDGE_COUNT = 50;
00760 
00761 
00762     // add some nodes
00763     for(int i=0; i < NODE_COUNT; i++)
00764     {
00765         DisplayGraphNode * n = new DisplayGraphNode( QString("%1").arg(i),sc );
00766         n->setPos(i,0);
00767         g->addNode(n);
00768         if(i>0)
00769             g->addEdge(i,i-1);
00770     }
00771 
00772     /*
00773     const int CLUSTER_SIZE = 50;
00774     int lastClusterNode=-1;
00775     for(int i = 0; i < NODE_COUNT / CLUSTER_SIZE; i++)
00776     {
00777         int clusterNode = g->addGravityNode();
00778         for(int j= i*CLUSTER_SIZE; j < (i+1)*CLUSTER_SIZE ;j++)
00779             g->addInvisibleEdge(clusterNode,j);
00780 
00781 
00782         if(i>0)
00783             g->addInvisibleEdge(clusterNode,lastClusterNode);
00784 
00785         lastClusterNode=clusterNode;
00786     }
00787     */
00788 
00789 
00790     int edgeCounter=0;
00791     while(edgeCounter < EDGE_COUNT)
00792     {
00793         int i1 = (double) rand()/RAND_MAX * NODE_COUNT;
00794         int i2 = (double) rand()/RAND_MAX * NODE_COUNT;
00795 
00796         if(! g->isAdjacentTo(i1,i2))
00797         {
00798             g->addEdge(i1,i2);
00799             edgeCounter++;
00800         }
00801     }
00802 
00803 
00804     qDebug() << "Done";
00805     g->circleLayout();
00806 
00807     return g;
00808 }
00809 #endif
00810 
00811 
00812 
00813 
00814 
00815 

Generated on Tue Sep 15 14:48:47 2009 for RoseQtWidgets by  doxygen 1.4.7