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
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
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);
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
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);
00265 addEdge(i1,i2,label);
00266 }
00267
00268 void DisplayGraph::addEdge ( int i1, int i2, const QString & label)
00269 {
00270
00271 if(edgeInfo.contains(n[i1],n[i2]))
00272 return;
00273
00274
00275 DisplayEdge * e = new DisplayEdge(n[i1],n[i2]);
00276 e->setEdgeLabel(label);
00277 e->setPaintMode(DisplayEdge::STRAIGHT);
00278 DisplayGraphNode::addEdge(e);
00279
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
00329
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
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
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
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
00400
00401
00402
00403
00404
00405
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
00417
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
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))
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]);
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
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
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
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
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
00710 for(int i=0; i < 6; i++)
00711 {
00712 DisplayGraphNode * n = new DisplayGraphNode( QString("%1").arg(i),sc );
00713
00714 g->addNode(n);
00715 }
00716
00717
00718
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
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
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
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