123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- #include "SpringEmbedder.h"
- #include "MembershipInitializer.h"
- #include <HierarchicalLayoutGenerator/HierarchicalLayouter.h>
- #include <Common/LayoutEnum.h>
- #include<Common/GraphType.h>
- SpringEmbedder::SpringEmbedder()
- {
- }
- void SpringEmbedder :: getRestrictedBounds(SubGraph& gMainGraph, QVector<int>&
- vRestBound, QVector<SubGraph *> vClusters )
- {
- // returns a vector of cluster dimensions and rstricted bounds
- BoostGraphWrapper bGraphWrapper;
- QQueue<SubGraph*> qSubgraphs; // a queue of subgraphs
- qSubgraphs.enqueue(&gMainGraph);
- SubGraph* gSubgraph1 = NULL;
- while(qSubgraphs.isEmpty() == false) // Iterating subgraphs till they exist
- {
- gSubgraph1 = qSubgraphs.dequeue();
- ChildrenIterator iterChild , iterChildEnd;
- for(boost::tie(iterChild , iterChildEnd) = gSubgraph1->children();
- iterChild != iterChildEnd;
- iterChild++)
- {
- SubGraph* gChildGraph = &(*iterChild);
- if(boost::num_vertices(*gChildGraph) !=0)
- {
- vRestBound.append(bGraphWrapper.getGraphCenterCoordX(*gChildGraph));
- vRestBound.append(bGraphWrapper.getGraphCenterCoordY(*gChildGraph));
- vRestBound.append( bGraphWrapper.getGraphHeight(*gChildGraph));
- vRestBound.append(bGraphWrapper.getGraphWidth(*gChildGraph));
- vRestBound.append(bGraphWrapper.getGraphLeftTopCoordX(*gChildGraph));
- vRestBound.append(bGraphWrapper.getGraphLeftTopCoordY(*gChildGraph));
- vClusters.append(gChildGraph);
- }
- }
- }
- }
- void SpringEmbedder :: SpringEmbedderStep(SubGraph& gMainGraph)
- {
- BoostGraphWrapper bgraphWrapper;
- int iNumnodes = bgraphWrapper.numVertices(gMainGraph);
- if(iNumnodes > 49 )
- {
- m_dIterations = 100;
- }
- else
- {
- m_dIterations = 50;
- }
- while(m_dIterations >0)
- {
- // relax edges
- SpringRelaxEdges(gMainGraph);
- // repel vertices
- SpringRepelVertices(gMainGraph);
- // move nodes
- SpringMoveNodes(gMainGraph);
- m_dIterations--;
- }
- }
- void SpringEmbedder :: setDesiredEdgeLength(double dEdgeLength)
- {
- m_dDesiredEdgeLength = dEdgeLength;
- }
- void SpringEmbedder :: setNoOfIterations(double dNumIterations)
- {
- m_dIterations = dNumIterations;
- }
- void SpringEmbedder :: SpringRelaxEdges(SubGraph& gMainGraph)
- {
- BoostGraphWrapper bGraphWrapper;
- EdgeIterator eStart, eEnd;
- for (boost::tie(eStart, eEnd) = edges(gMainGraph); eStart != eEnd; ++eStart)
- {
- VertexDescriptor verV = source(*eStart, gMainGraph);
- VertexDescriptor verU = target(*eStart, gMainGraph);
- double dXCoordV = bGraphWrapper.getVertexCenterCoordX(verV,gMainGraph);
- double dYCoordV = bGraphWrapper.getVertexCenterCoordY(verV,gMainGraph);
- double dXCoordU = bGraphWrapper.getVertexCenterCoordX(verU,gMainGraph);
- double dYCoordU = bGraphWrapper.getVertexCenterCoordY(verU,gMainGraph);
- double dXDisp = bGraphWrapper.getVertXDisp(verV,gMainGraph);
- double dYDisp = bGraphWrapper.getVertYDisp(verV,gMainGraph);
- double dXDisp_U = 0;
- double dYDisp_U = 0;
- dXDisp_U = bGraphWrapper.getVertXDisp(verU,gMainGraph);
- dYDisp_U = bGraphWrapper.getVertYDisp(verU,gMainGraph);
- // Logic for vertex size here
- double dXsizeU = bGraphWrapper.getVertexWidth(verU,gMainGraph);
- double dXsizeV = bGraphWrapper.getVertexWidth(verV,gMainGraph);
- if(dXCoordU > dXCoordV)
- {
- dXCoordV = dXCoordV + dXsizeV/2;
- dXCoordU = dXCoordU - dXsizeU/2;
- }
- else
- {
- dXCoordV = dXCoordV - dXsizeV/2;
- dXCoordU = dXCoordU + dXsizeU/2;
- }
- double d_Vx = dXCoordV - dXCoordU;
- double d_Vy = dYCoordV - dYCoordU;
- cout<<"\n Delta X and Y at attractive force : "<<d_Vy<<" "
- << d_Vx;
- double dDist = fabs(sqrt((d_Vx*d_Vx+d_Vy* d_Vy)));
- cout<<"Distance at attractive force : "<<dDist;
- if(dDist == 0)
- {
- dDist = 0.0001;
- }
- // desired length = 50
- double dForce = 0.3 *(m_dDesiredEdgeLength - dDist)/dDist ; //0.3 force multiplier
- dForce = dForce * std::pow(0.7,in_degree(verV,gMainGraph)+in_degree(verU,gMainGraph)
- + out_degree(verU,gMainGraph)+out_degree(verV,gMainGraph) -2); // not known 0.3
- double dx = dForce * d_Vx;
- double dy = dForce * d_Vy;
- dXDisp += dx;
- dYDisp += dy;
- dXDisp_U -= dx;
- dYDisp_U -= dy;
- cout<<"\n Attractive Forces Displacement " ;
- cout<<"\n at I X Disp : "<<dXDisp;
- cout<<" Y Disp : "<<dYDisp;
- cout<<"\n at J X Disp : "<<dXDisp_U;
- cout<<" Y Disp : "<<dYDisp_U;
- bGraphWrapper.setVertXDisp(dXDisp,verV,gMainGraph);
- bGraphWrapper.setVertYDisp(dYDisp,verV,gMainGraph);
- bGraphWrapper.setVertXDisp(dXDisp_U,verU,gMainGraph);
- bGraphWrapper.setVertYDisp(dYDisp_U,verU,gMainGraph);
- }
- }
- void SpringEmbedder :: SpringRepelVertices(SubGraph& gMainGraph)
- {
- VertexDescriptor verAffected,verVisitor;
- VertexIterPair verIter,verIterEnd;
- BoostGraphWrapper bGraphWrapper;
- for(tie(verIter.first,verIter.second)=vertices(gMainGraph)
- ;verIter.first!=verIter.second;++verIter.first)
- {
- double dx = 0;
- double dy = 0;
- double XDisp =0;
- double YDisp = 0;
- double dXCoordV = bGraphWrapper.getVertexCenterCoordX(verAffected,gMainGraph);
- double dYCoordV = bGraphWrapper.getVertexCenterCoordY(verAffected,gMainGraph);
- verAffected = *verIter.first;
- for(tie(verIterEnd.first,verIterEnd.second)=vertices(gMainGraph);
- verIterEnd.first != verIterEnd.second;++verIterEnd.first)
- {
- verVisitor = *verIterEnd.first;
- double dXCoordU = bGraphWrapper.getVertexCenterCoordX(verVisitor,gMainGraph);
- double dYCoordU = bGraphWrapper.getVertexCenterCoordY(verVisitor,gMainGraph);
- if(verAffected == verVisitor)
- {
- continue;
- }
- // Logic for vertex size here
- double dXsizeU = bGraphWrapper.getVertexWidth(verVisitor,gMainGraph);
- double dXsizeV = bGraphWrapper.getVertexWidth(verAffected,gMainGraph);
- if(dXCoordU > dXCoordV)
- {
- dXCoordV = dXCoordV + dXsizeV/2;
- dXCoordU = dXCoordU - dXsizeU/2;
- }
- else
- {
- dXCoordV = dXCoordV - dXsizeV/2;
- dXCoordU = dXCoordU + dXsizeU/2;
- }
- double dvx = dXCoordV - dXCoordU;
- double dvy = dYCoordV - dYCoordU;
- double dDist = fabs((dvx*dvx + dvy* dvy));
- cout<<"\nDistance at Repulsive force : "<<dDist;
- if(dDist == 0 || dDist < 500 )
- {
- dDist = std::rand()%300+100;
- }
- if(dDist < 100*100*100 )
- {
- dx += 1*dvx/dDist; // factor =1 def works well for 1000
- dy += 1*dvy/dDist;
- }
- else{
- cout<<"\n Skipping due to distance";
- }
- cout<<"\ndx and dy at Repulsive force : "<<dx<<" "<<dy;
- }
- double dLen = dx*dx+ dy*dy;
- dLen = sqrt(fabs(dLen))/2;
- if(dLen > 0)
- {
- XDisp = bGraphWrapper.getVertXDisp(verAffected,gMainGraph);
- YDisp = bGraphWrapper.getVertYDisp(verAffected,gMainGraph);
- XDisp += (dx/dLen);
- YDisp += (dy/dLen);
- bGraphWrapper.setVertXDisp(XDisp,verAffected,gMainGraph);
- bGraphWrapper.setVertYDisp(YDisp,verAffected,gMainGraph);
- cout<<"\nDisplacement at Repulsive force : "<<YDisp<<" "
- << XDisp;
- }
- }
- }
- void SpringEmbedder :: SpringMoveNodes(SubGraph& gMainGraph)
- {
- BoostGraphWrapper bGraphWrapper;
- VertexDescriptor verAffected;
- VertexIterPair verIter;
- for(tie(verIter.first,verIter.second)=vertices(gMainGraph)
- ;verIter.first!=verIter.second;++verIter.first)
- {
- verAffected = *verIter.first;
- double dXCoordV = bGraphWrapper.getVertexCenterCoordX
- (verAffected,gMainGraph);
- double dYCoordV = bGraphWrapper.getVertexCenterCoordY
- (verAffected,gMainGraph);
- double dXDisp = bGraphWrapper.getVertXDisp(verAffected,gMainGraph);
- double dYDisp = bGraphWrapper.getVertYDisp(verAffected,gMainGraph);
- bGraphWrapper.setVertXDisp(dXDisp/4,verAffected,gMainGraph);
- bGraphWrapper.setVertYDisp(dYDisp/4,verAffected,gMainGraph);
- dXDisp = std::min(dXDisp,10.0);
- dYDisp = std::min(dYDisp,10.0);
- bGraphWrapper.setVertexCenterCoordX(verAffected,gMainGraph,
- dXCoordV+dXDisp);
- bGraphWrapper.setVertexCenterCoordY(verAffected,gMainGraph,
- dYCoordV+dYDisp);
- }
- }
|