123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287 |
- #include "RelaxInterEdges.h"
- RelaxInterEdges::RelaxInterEdges()
- {
- }
- void RelaxInterEdges :: interEdgesCaseOne(SubGraph& gMaingraph,
- VertexDescriptor& vSource,
- VertexDescriptor& vTarget,
- int* iOuterIntersect)
- {
- cout<<"\n CASE 1 : ";
- // calculate attractive force here ******
- int iUCoordX , iUCoordY , iVCoordX , iVCoordY;
- iUCoordX = m_bGraphWrapper.getVertexCenterCoordX(vSource,gMaingraph);
- iUCoordY = m_bGraphWrapper.getVertexCenterCoordY(vSource,gMaingraph);
- iVCoordX = m_bGraphWrapper.getVertexCenterCoordX(vTarget,gMaingraph);
- iVCoordY = m_bGraphWrapper.getVertexCenterCoordY(vTarget,gMaingraph);
- cout<<"\n Initial X and Y Cordinates "<<iUCoordX<<" "<<iUCoordY;
- cout<<"\n Initial X and Y Cordinates "<<iVCoordX<<" "<<iVCoordY;
- double dVx = iVCoordX - iOuterIntersect[0];
- double dVy = iVCoordY - iOuterIntersect[1];
- double dUx = iUCoordX - iOuterIntersect[0] ;
- double dUy = iUCoordY - iOuterIntersect[1] ;
- cout<<"\n Delta X and Y at attractive force : "<<dVy<<" "
- << dVx;
- cout<<"\n Delta X and Y at attractive force : "<<dUy<<" "
- << dUx;
- double dDist1 = fabs(sqrt((dVx*dVx+dVy* dVy)));
- double dDist2 = fabs(sqrt((dUx*dUx+dUy* dUy)));
- cout<<"\n Distance at attractive force in Inter edges : "<<dDist1<<" "<< dDist2;
- // avoid nan
- if(dDist1 == 0)
- {
- dDist1 = 0.0001;
- }
- if(dDist2 == 0)
- {
- dDist2 = 0.0001;
- }
- // desired length = 50
- double dForce1 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist1)/dDist1 ; //0.3 force multiplier
- double dForce2 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist2)/dDist2 ; //0.3 force multiplier
- cout<<"\n Force between interedges "<<dForce1<<" " <<dForce2;
- // maintain minimum distance
- if(dDist1 < MINIMUM_INTEREDGE_DISTANCE ) // 60 earlier
- {
- dDist1 = 0.0001;
- dForce1 = 0;
- }
- if(dDist2 < MINIMUM_INTEREDGE_DISTANCE)
- {
- dDist2 = 0.0001;
- dForce2 = 0;
- }
- double dx1 = dForce1 * dVx;
- double dy1 = dForce1 * dVy;
- double dx2 = dForce2 * dUx;
- double dy2 = dForce2 * dUy;
- double dXDispV = m_bGraphWrapper.getVertXDisp(vTarget,gMaingraph);
- double dYDispV = m_bGraphWrapper.getVertYDisp(vTarget,gMaingraph);
- double dXDispU = 0;
- double dYDispU = 0;
- dXDispU = m_bGraphWrapper.getVertXDisp(vSource,gMaingraph);
- dYDispU = m_bGraphWrapper.getVertYDisp(vSource,gMaingraph);
- dXDispV += dx1;
- dYDispV += dy1;
- dXDispU += dx2;
- dYDispU += dy2;
- cout<<"\n Disp between interedges "<<dx1<<" " <<dy1;
- cout<<"\n Disp between interedges "<<dx2<<" " <<dy2;
- m_bGraphWrapper.setVertXDisp(dXDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertXDisp(dXDispU,vSource,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispU,vSource,gMaingraph);
- cout<<"\n Final X and Y Cordinates "<<iUCoordX<<" "<<iUCoordY;
- cout<<"\n Final X and Y Cordinates "<<iVCoordX<<" "<<iVCoordY;
- }
- void RelaxInterEdges :: interEdgesCaseTwoSourceOuter(SubGraph& gMaingraph,
- VertexDescriptor& vSource,
- VertexDescriptor& vTarget,
- int* iOuterIntersect,
- SubGraph* gTarget)
- {
- LAYOUT_ASSERT( gTarget != NULL,
- LayoutException(__FUNCTION__
- ,LayoutExceptionEnum::INCONSISTENT_DATASTRUCTURE
- ,"Input and Output graphml path"
- ,"springRepelInterEdges"));
- cout<<"\n Source is Outer";
- int iSourceX = m_bGraphWrapper.getVertexCenterCoordX(vSource,gMaingraph);
- int iSourceY = m_bGraphWrapper.getVertexCenterCoordY(vSource,gMaingraph);
- int iTargetX = m_bGraphWrapper.getVertexCenterCoordX(vTarget,gMaingraph);
- int iTargetY = m_bGraphWrapper.getVertexCenterCoordY(vTarget,gMaingraph);
- int iInnerIntersect[2] = {0,0}; // x and y
- int iHeight,iLeftTopX,iLeftTopY,iWidth;
- // outer compartment of inner vertex
- iHeight = m_bGraphWrapper.getGraphHeight(*gTarget);
- iWidth = m_bGraphWrapper.getGraphWidth(*gTarget);
- iLeftTopX = m_bGraphWrapper.getGraphLeftTopCoordX(*gTarget);
- iLeftTopY = m_bGraphWrapper.getGraphLeftTopCoordY(*gTarget);
- cout<<"\n Inner cluster Compartments";
- cout<<"\n Top Left X " << iLeftTopX;
- cout<<"\n Top Left Y " << iLeftTopY;
- cout<<"\n Height " <<iHeight;
- cout<<"\n Width "<<iWidth;
- // Form 4 piars of P Q R S with Edge e ===> PQ , QR , RS , SP
- typedef boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian> Points;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pP;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pQ;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pR;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pS;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pX;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pY;
- typedef boost::geometry::model::segment<Points> Segment;
- std::vector<Points> pInnerIntersect;
- bool bIsNoInnerIntersection = false;
- pP.set<0>(iLeftTopX);
- pP.set<1>(iLeftTopY);
- pQ.set<0>(iLeftTopX);
- pQ.set<1>(iLeftTopY + iHeight);
- pR.set<0>(iLeftTopX + iWidth);
- pR.set<1>(iLeftTopY + iHeight);
- pS.set<0>(iLeftTopX+ iWidth);
- pS.set<1>(iLeftTopY);
- pX.set<0>(iSourceX);
- pX.set<1>(iSourceY);
- pY.set<0>(iTargetX);
- pY.set<1>(iTargetY);
- Segment PQ( pP,pQ );
- Segment QR( pQ,pR );
- Segment RS( pR,pS );
- Segment SP( pS,pP );
- Segment Edge (pX,pY);
- // get different intersection points
- if(boost::geometry::intersects(Edge,PQ))
- {
- boost::geometry::intersection(Edge,PQ,pInnerIntersect);
- cout<<" \n Inner Clip Found with Edge PQ";
- }
- else if( boost::geometry::intersects(Edge,QR))
- {
- boost::geometry::intersection(Edge,QR,pInnerIntersect);
- cout<<" \n Inner Clip Found with Edge QR";
- }
- else
- {
- if(boost::geometry::intersects(Edge,RS))
- {
- boost::geometry::intersection(Edge,RS,pInnerIntersect);
- cout<<" \n Inner Clip Found with Edge RS";
- }
- else if(boost::geometry::intersects(Edge,SP))
- {
- boost::geometry::intersection(Edge,SP,pInnerIntersect);
- cout<<" \n Inner Clip Found with Edge SP";
- }
- else
- {
- // no intersection , not possible but handle
- cout<<"\n *** No Intersection in Inner *** Check Cluster cordinates" ;
- bIsNoInnerIntersection = true;
- }
- }
- if(!bIsNoInnerIntersection)
- {
- Points pIntersection = pInnerIntersect[0];
- iInnerIntersect[0] = pIntersection.get<0>();
- iInnerIntersect[1] = pIntersection.get<1>();
- }
- cout<<"\n Inner Intersection Points "<< " "<<iInnerIntersect[0]<< " "
- <<iInnerIntersect[1];
- int iUCoordX , iUCoordY , iVCoordX , iVCoordY;
- iUCoordX = m_bGraphWrapper.getVertexCenterCoordX(vSource,gMaingraph);
- iUCoordY = m_bGraphWrapper.getVertexCenterCoordY(vSource,gMaingraph);
- iVCoordX = m_bGraphWrapper.getVertexCenterCoordX(vTarget,gMaingraph);
- iVCoordY = m_bGraphWrapper.getVertexCenterCoordY(vTarget,gMaingraph);
- double dVx = iVCoordX - iInnerIntersect[0];
- double dVy = iVCoordY - iInnerIntersect[1];
- double dUx = iUCoordX - iOuterIntersect[0];
- double dUy = iUCoordY - iOuterIntersect[1];
- cout<<"\n Delta X and Y at attractive force case 2 : "<<dVy<<" "
- << dVx;
- double dDist1 = fabs(sqrt((dVx*dVx+dVy* dVy)));
- double dDist2 = fabs(sqrt((dUx*dUx+dUy* dUy)));
- cout<<"\n Distance at attractive force in Inter edges case 2: "<<dDist1;
- if(dDist1 == 0)
- {
- dDist1 = 0.0001;
- }
- if(dDist2 == 0)
- {
- dDist2 = 0.0001;
- }
- // desired length = 100 , adjust force
- double dForce1 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist1)/dDist1 ; //0.3 force multiplier
- double dForce2 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist2)/dDist2 ; //0.3 force multiplier
- cout<<"\n Force between Case 2 interedges "<<dForce1<<" " <<dForce2;
- if(dDist1 < MINIMUM_INTEREDGE_DISTANCE )
- {
- dDist1 = 0.0001;
- dForce1 = 0;
- }
- if(dDist2 < MINIMUM_INTEREDGE_DISTANCE)
- {
- dDist2 = 0.0001;
- dForce2 = 0;
- }
- double dx1 = dForce1 * dVx;
- double dy1 = dForce1 * dVy;
- double dx2 = dForce2 * dUx;
- double dy2 = dForce2 * dUy;
- double dXDispV = m_bGraphWrapper.getVertXDisp(vTarget,gMaingraph);
- double dYDispV = m_bGraphWrapper.getVertYDisp(vTarget,gMaingraph);
- double dXDispU = 0;
- double dYDispU = 0;
- dXDispU = m_bGraphWrapper.getVertXDisp(vSource,gMaingraph);
- dYDispU = m_bGraphWrapper.getVertYDisp(vSource,gMaingraph);
- dXDispV += dx1;
- dYDispV += dy1;
- dXDispU += dx2;
- dYDispU += dy2;
- cout<<"\n Disp between interedges case 2 "<<dx1<<" " <<dy1;
- cout<<"\n Disp between interedges case 2 "<<dx2<<" " <<dy2;
- m_bGraphWrapper.setVertXDisp(dXDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertXDisp(dXDispU,vSource,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispU,vSource,gMaingraph);
- }
- void RelaxInterEdges :: interEdgesCaseTwoSourceInner(SubGraph& gMaingraph,
- VertexDescriptor& vSource,
- VertexDescriptor& vTarget,
- int* iOuterIntersect,
- SubGraph* gSource)
- {
- LAYOUT_ASSERT( gSource != NULL,
- LayoutException(__FUNCTION__
- ,LayoutExceptionEnum::INCONSISTENT_DATASTRUCTURE
- ,"Input and Output graphml path"
- ,"springRepelInterEdges"));
- // source is inner
- cout<<"\n Source is Inner";
- // inner clipping for source graph
- int iSourceX = m_bGraphWrapper.getVertexCenterCoordX(vSource,gMaingraph);
- int iSourceY = m_bGraphWrapper.getVertexCenterCoordY(vSource,gMaingraph);
- int iTargetX = m_bGraphWrapper.getVertexCenterCoordX(vTarget,gMaingraph);
- int iTargetY = m_bGraphWrapper.getVertexCenterCoordY(vTarget,gMaingraph);
- int iInnerIntersect[2]; // x and y
- int iHeight,iLeftTopX,iLeftTopY,iWidth; // outer compartment of inner vertex
- iHeight = m_bGraphWrapper.getGraphHeight(*gSource);
- iWidth = m_bGraphWrapper.getGraphWidth(*gSource);
- iLeftTopX = m_bGraphWrapper.getGraphLeftTopCoordX(*gSource);
- iLeftTopY = m_bGraphWrapper.getGraphLeftTopCoordY(*gSource);
- // Form 4 piars of P Q R S with Edge e ===> PQ , QR , RS , SP
- typedef boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian> Points;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pP;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pQ;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pR;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pS;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pX;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pY;
- typedef boost::geometry::model::segment<Points> Segment;
- std::vector<Points> pInnerIntersect;
- bool bIsNoInnerIntersection = false;
- pP.set<0>(iLeftTopX);
- pP.set<1>(iLeftTopY);
- pQ.set<0>(iLeftTopX);
- pQ.set<1>(iLeftTopY + iHeight);
- pR.set<0>(iLeftTopX + iWidth);
- pR.set<1>(iLeftTopY + iHeight);
- pS.set<0>(iLeftTopX+ iWidth);
- pS.set<1>(iLeftTopY);
- pX.set<0>(iSourceX);
- pX.set<1>(iSourceY);
- pY.set<0>(iTargetX);
- pY.set<1>(iTargetY);
- Segment PQ( pP,pQ );
- Segment QR( pQ,pR );
- Segment RS( pR,pS );
- Segment SP( pS,pP );
- Segment Edge (pX,pY);
- // get inner clip
- if(boost::geometry::intersects(Edge,PQ))
- {
- boost::geometry::intersection(Edge,PQ,pInnerIntersect);
- cout<<" \n Inner Clip Found with Edge PQ";
- }
- else if( boost::geometry::intersects(Edge,QR))
- {
- boost::geometry::intersection(Edge,QR,pInnerIntersect);
- cout<<" \n Inner Clip Found with Edge QR";
- }
- else
- {
- if(boost::geometry::intersects(Edge,RS))
- {
- boost::geometry::intersection(Edge,RS,pInnerIntersect);
- cout<<" \n Inner Clip Found with Edge RS";
- }
- else if(boost::geometry::intersects(Edge,SP))
- {
- boost::geometry::intersection(Edge,SP,pInnerIntersect);
- cout<<" \n Inner Clip Found with Edge SP";
- }
- else
- {
- // no intersection , not possible but handle
- cout<<"\n *** No Intersection in Inner *** Check Cluster cordinates" ;
- bIsNoInnerIntersection = true;
- }
- }
- if(!bIsNoInnerIntersection)
- {
- Points pIntersection = pInnerIntersect[0];
- iInnerIntersect[0] = pIntersection.get<0>();
- iInnerIntersect[1] = pIntersection.get<1>();
- } else {
- // XXX preset needed
- iInnerIntersect[0] =0;
- iInnerIntersect[1] =0;
- }
- int iUCoordX , iUCoordY , iVCoordX , iVCoordY;
- iUCoordX = m_bGraphWrapper.getVertexCenterCoordX(vSource,gMaingraph);
- iUCoordY = m_bGraphWrapper.getVertexCenterCoordY(vSource,gMaingraph);
- iVCoordX = m_bGraphWrapper.getVertexCenterCoordX(vTarget,gMaingraph);
- iVCoordY = m_bGraphWrapper.getVertexCenterCoordY(vTarget,gMaingraph);
- double dVx = iVCoordX - iOuterIntersect[0];
- double dVy = iVCoordY - iOuterIntersect[1];
- double dUx = iUCoordX - iInnerIntersect[0];
- double dUy = iUCoordY - iInnerIntersect[1];
- cout<<"\n Delta X and Y at attractive force case 2 : "<<dVy<<" "
- << dVx;
- double dDist1 = fabs(sqrt((dVx*dVx+dVy* dVy)));
- double dDist2 = fabs(sqrt((dUx*dUx+dUy* dUy)));
- cout<<"\n Distance at attractive force in Inter edges case 2: "<<dDist1;
- if(dDist1 == 0)
- {
- dDist1 = 0.0001;
- }
- if(dDist2 == 0)
- {
- dDist2 = 0.0001;
- }
- // desired length = 50
- double dForce1 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist1)/dDist1 ; //0.3 force multiplier
- double dForce2 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist2)/dDist2 ; //0.3 force multiplier
- cout<<"\n Force between Case 2 interedges "<<dForce1<<" " <<dForce2;
- if(dDist1 < MINIMUM_INTEREDGE_DISTANCE )
- {
- dDist1 = 0.0001;
- dForce1 = 0;
- }
- if(dDist2 < MINIMUM_INTEREDGE_DISTANCE)
- {
- dDist1 = 0.0001;
- dForce2 = 0;
- }
- double dx1 = dForce1 * dVx;
- double dy1 = dForce1 * dVy;
- double dx2 = dForce2 * dUx;
- double dy2 = dForce2 * dUy;
- double dXDispV = m_bGraphWrapper.getVertXDisp(vTarget,gMaingraph);
- double dYDispV = m_bGraphWrapper.getVertYDisp(vTarget,gMaingraph);
- double dXDispU = 0;
- double dYDispU = 0;
- dXDispU = m_bGraphWrapper.getVertXDisp(vSource,gMaingraph);
- dYDispU = m_bGraphWrapper.getVertYDisp(vSource,gMaingraph);
- dXDispV += dx1;
- dYDispV += dy1;
- dXDispU += dx2;
- dYDispU += dy2;
- cout<<"\n Disp between interedges case 2 "<<dx1<<" " <<dy1;
- cout<<"\n Disp between interedges case 2 "<<dx2<<" " <<dy2;
- m_bGraphWrapper.setVertXDisp(dXDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertXDisp(dXDispU,vSource,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispU,vSource,gMaingraph);
- }
- void RelaxInterEdges :: OverLapCaseSourceOuter(SubGraph& gMaingraph,
- VertexDescriptor& vSource,
- VertexDescriptor& vTarget,
- SubGraph* gTarget,
- int iSourceGraphId)
- {
- LAYOUT_ASSERT( gTarget != NULL,
- LayoutException(__FUNCTION__
- ,LayoutExceptionEnum::INCONSISTENT_DATASTRUCTURE
- ,"Input and Output graphml path"
- ,"springRepelInterEdges"));
- bool bIsSourceOuter = true;
- bool bIsNull = false;
- bool bParentFound = false;// source is outer
- SubGraph* gTempGraph = (gTarget);
- // XXX unused
- Q_UNUSED(bIsSourceOuter);
- while( !bParentFound )
- {
- // SubGraph& gOuterParentGraph = (*gTempGraph).parent();
- SubGraph* gOuterParentGraph = &((*gTempGraph).parent());
- if(!gOuterParentGraph)
- {
- // null graph received
- bIsNull = true;
- break;
- }
- int iParentGraphId = m_bGraphWrapper.getGraphClusterID(*gOuterParentGraph);
- if(iParentGraphId == iSourceGraphId)
- {
- bParentFound = true;
- }
- else
- {
- //gTempGraph = & gOuterParentGraph;
- gTempGraph = & (*gOuterParentGraph);
- }
- }
- if(!bIsNull)
- {
- int iTargetGraphHeight = m_bGraphWrapper.getGraphHeight(*gTarget);
- int iTargetTopXLeft = m_bGraphWrapper.getGraphLeftTopCoordX(*gTarget);
- int iTargetGraphWidth = m_bGraphWrapper.getGraphWidth(*gTarget);
- int iTargetTopYLeft = m_bGraphWrapper.getGraphLeftTopCoordY(*gTarget);
- int iUCoordX , iUCoordY , iVCoordX , iVCoordY;
- iUCoordX = m_bGraphWrapper.getVertexCenterCoordX(vSource,gMaingraph);
- iUCoordY = m_bGraphWrapper.getVertexCenterCoordY(vSource,gMaingraph);
- iVCoordX = m_bGraphWrapper.getVertexCenterCoordX(vTarget,gMaingraph);
- iVCoordY = m_bGraphWrapper.getVertexCenterCoordY(vTarget,gMaingraph);
- int iHeight,iLeftTopX,iLeftTopY,iWidth; // outer compartment of inner vertex
- iHeight = m_bGraphWrapper.getGraphHeight(*gTempGraph);
- iWidth = m_bGraphWrapper.getGraphWidth(*gTempGraph);
- iLeftTopX = m_bGraphWrapper.getGraphLeftTopCoordX(*gTempGraph);
- iLeftTopY = m_bGraphWrapper.getGraphLeftTopCoordY(*gTempGraph);
- int iOuterMostGraphID = m_bGraphWrapper.getGraphClusterID(*gTempGraph);
- cout<< "\n Outer Cordinates of Clusters Overlapping Case " ;
- cout<<"\n Outer Graph ID "<<iOuterMostGraphID;
- cout<< " Height "<<iHeight;
- cout<< " Width "<<iWidth;
- cout<< " Lefttop X "<<iLeftTopX;
- cout<< " Lefttop Y "<<iLeftTopY;
- // For inner clipping points
- // Form 4 piars of P Q R S with Edge e ===> PQ , QR , RS , SP and AB , BC ,CD , DA
- typedef boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian> Points;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pP;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pQ;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pR;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pS;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pA;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pB;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pC;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pD;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pX;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pY;
- typedef boost::geometry::model::segment<Points> Segment;
- std::vector<Points> pOverlapOuterIntersect , pOverlapInnerIntersect;
- bool bIsNoInnerIntersection = false , bIsNoOuterIntersection = false;
- pP.set<0>(iLeftTopX);
- pP.set<1>(iLeftTopY);
- pQ.set<0>(iLeftTopX);
- pQ.set<1>(iLeftTopY + iHeight);
- pR.set<0>(iLeftTopX + iWidth);
- pR.set<1>(iLeftTopY + iHeight);
- pS.set<0>(iLeftTopX+ iWidth);
- pS.set<1>(iLeftTopY);
- pA.set<0>(iTargetTopXLeft); // For inner Clips
- pA.set<1>(iTargetTopYLeft);
- pB.set<0>(iTargetTopXLeft);
- pB.set<1>(iTargetTopYLeft + iTargetGraphHeight);
- pC.set<0>(iTargetTopXLeft + iTargetGraphWidth);
- pC.set<1>(iTargetTopYLeft + iTargetGraphHeight);
- pD.set<0>(iTargetTopXLeft+ iTargetGraphWidth);
- pD.set<1>(iTargetTopYLeft);
- pX.set<0>(iUCoordX); // Source X and Y
- pX.set<1>(iUCoordY);
- pY.set<0>( iVCoordX); // Target X and Y
- pY.set<1>(iVCoordY);
- Segment PQ( pP,pQ );
- Segment QR( pQ,pR );
- Segment RS( pR,pS );
- Segment SP( pS,pP );
- Segment Edge (pX,pY);
- Segment AB(pA,pB);
- Segment BC(pB,pC);
- Segment CD(pC,pD);
- Segment DA(pD,pA);
- // check outer intersection
- if(boost::geometry::intersects(Edge,PQ))
- {
- boost::geometry::intersection(Edge,PQ,pOverlapOuterIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge PQ";
- }
- else if( boost::geometry::intersects(Edge,QR))
- {
- boost::geometry::intersection(Edge,QR,pOverlapOuterIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge QR";
- }
- else
- {
- if(boost::geometry::intersects(Edge,RS))
- {
- boost::geometry::intersection(Edge,RS,pOverlapOuterIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge RS";
- }
- else if(boost::geometry::intersects(Edge,SP))
- {
- boost::geometry::intersection(Edge,SP,pOverlapOuterIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge SP";
- }
- else
- {
- // no intersection , not possible but handle
- cout<<"\n *** No Intersection in Overlap *** Check Cluster cordinates" ;
- bIsNoOuterIntersection = true;
- }
- }
- // check inner intersection
- { // For separating two if else loops
- if(boost::geometry::intersects(Edge,AB))
- {
- boost::geometry::intersection(Edge,AB,pOverlapInnerIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge AB";
- }
- else if( boost::geometry::intersects(Edge,BC))
- {
- boost::geometry::intersection(Edge,BC,pOverlapInnerIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge BC";
- }
- else
- {
- if(boost::geometry::intersects(Edge,CD))
- {
- boost::geometry::intersection(Edge,CD,pOverlapInnerIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge CD";
- }
- else if(boost::geometry::intersects(Edge,DA))
- {
- boost::geometry::intersection(Edge,DA,pOverlapInnerIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge DA";
- }
- else
- {
- // no intersection , not possible but handle
- cout<<"\n *** No Inner Intersection in Overlap *** Check Cluster cordinates" ;
- bIsNoInnerIntersection = true;
- }
- }
- }
- int iOuterIntersectX,iOuterIntersectY,iInnerIntersectX,iInnerIntersectY;
- if(!bIsNoOuterIntersection)
- {
- Points pIntersection = pOverlapOuterIntersect[0];
- iOuterIntersectX = pIntersection.get<0>();
- iOuterIntersectY = pIntersection.get<1>();
- }
- if(!bIsNoInnerIntersection)
- {
- Points pIntersection = pOverlapInnerIntersect[0];
- iInnerIntersectX = pIntersection.get<0>();
- iInnerIntersectY = pIntersection.get<1>();
- }
- // attract source with outer and target with inner
- if(!bIsNoOuterIntersection && !bIsNoInnerIntersection )
- {
- // attract only if both intersections are found
- double dVx = iVCoordX - iInnerIntersectX;
- double dVy = iVCoordY - iInnerIntersectY;
- double dUx = iUCoordX - iOuterIntersectX;
- double dUy = iUCoordY - iOuterIntersectY;
- cout<<"\n Delta X and Y at attractive force case 2 : "<<dVy<<" "
- << dVx;
- double dDist1 = fabs(sqrt((dVx*dVx+dVy* dVy)));
- double dDist2 = fabs(sqrt((dUx*dUx+dUy* dUy)));
- cout<<"\n Distance at attractive force in Inter edges case 2: "<<dDist1;
- if(dDist1 == 0)
- {
- dDist1 = 0.0001;
- }
- if(dDist2 == 0)
- {
- dDist2 = 0.0001;
- }
- // desired length = 50
- double dForce1 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist1)/dDist1 ; //0.3 force multiplier
- double dForce2 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist2)/dDist2 ; //0.3 force multiplier
- cout<<"\n Force between Case 2 interedges "<<dForce1<<" " <<dForce2;
- if(dDist1 < MINIMUM_INTEREDGE_DISTANCE )
- {
- dDist1 = 0.0001;
- dForce1 = 0;
- }
- if(dDist2 < MINIMUM_INTEREDGE_DISTANCE)
- {
- dDist2 = 0.0001;
- dForce2 = 0;
- }
- // get displacement
- double dx1 = dForce1 * dVx;
- double dy1 = dForce1 * dVy;
- double dx2 = dForce2 * dUx;
- double dy2 = dForce2 * dUy;
- double dXDispV = m_bGraphWrapper.getVertXDisp(vTarget,gMaingraph);
- double dYDispV = m_bGraphWrapper.getVertYDisp(vTarget,gMaingraph);
- double dXDispU = 0;
- double dYDispU = 0;
- dXDispU = m_bGraphWrapper.getVertXDisp(vSource,gMaingraph);
- dYDispU = m_bGraphWrapper.getVertYDisp(vSource,gMaingraph);
- dXDispV += dx1;
- dYDispV += dy1;
- dXDispU += dx2;
- dYDispU += dy2;
- cout<<"\n Disp between interedges case 2 "<<dx1<<" " <<dy1;
- cout<<"\n Disp between interedges case 2 "<<dx2<<" " <<dy2;
- m_bGraphWrapper.setVertXDisp(dXDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertXDisp(dXDispU,vSource,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispU,vSource,gMaingraph);
- }
- }
- }
- void RelaxInterEdges :: OverLapCaseSourceInner(SubGraph& gMaingraph,
- VertexDescriptor& vSource,
- VertexDescriptor& vTarget,
- SubGraph* gSource,
- int iTargetGraphId)
- {
- LAYOUT_ASSERT( gSource != NULL,
- LayoutException(__FUNCTION__
- ,LayoutExceptionEnum::INCONSISTENT_DATASTRUCTURE
- ,"Input and Output graphml path"
- ,"springRepelInterEdges"));
- cout<<"\n Target is outer ";
- // Source is inner and target is outer
- bool bIsSourceOuter = false;
- bool bParentFound = false; // source is inner
- SubGraph* gTempGraph = (gSource);
- // XXX unused
- Q_UNUSED(bIsSourceOuter)
- bool bIsNull = false;
- while( bParentFound == false)
- {
- SubGraph* gOuterParentGraph = &((*gTempGraph).parent());
- if(!gOuterParentGraph)
- {
- // null graph received
- bIsNull = true;
- break;
- }
- int iParentGraphId = m_bGraphWrapper.getGraphClusterID(*gOuterParentGraph);
- if(iParentGraphId == iTargetGraphId)
- {
- bParentFound = true;
- }
- else
- {
- gTempGraph = & (*gOuterParentGraph); // changed goutergraph to pointer
- }
- }
- if(!bIsNull)
- {
- int iSourceGraphHeight = m_bGraphWrapper.getGraphHeight(*gSource);
- int iSourceTopXLeft = m_bGraphWrapper.getGraphLeftTopCoordX(*gSource);
- int iSourceGraphWidth = m_bGraphWrapper.getGraphWidth(*gSource);
- int iSourceTopYLeft = m_bGraphWrapper.getGraphLeftTopCoordY(*gSource);
- int iUCoordX = m_bGraphWrapper.getVertexCenterCoordX(vSource,gMaingraph);
- int iUCoordY = m_bGraphWrapper.getVertexCenterCoordY(vSource,gMaingraph);
- int iVCoordX = m_bGraphWrapper.getVertexCenterCoordX(vTarget,gMaingraph);
- int iVCoordY = m_bGraphWrapper.getVertexCenterCoordY(vTarget,gMaingraph);
- int iHeight,iLeftTopX,iLeftTopY,iWidth;
- // outer compartment of inner vertex
- iHeight = m_bGraphWrapper.getGraphHeight(*gTempGraph);
- iWidth = m_bGraphWrapper.getGraphWidth(*gTempGraph);
- iLeftTopX = m_bGraphWrapper.getGraphLeftTopCoordX(*gTempGraph);
- iLeftTopY = m_bGraphWrapper.getGraphLeftTopCoordY(*gTempGraph);
- int iOuterMostGraphID = m_bGraphWrapper.getGraphClusterID(*gTempGraph);
- cout<< "\n Outer Cordinates of Clusters Overlapping Case " ;
- cout<<"\n Outer Graph ID "<<iOuterMostGraphID;
- cout<< " Height "<<iHeight;
- cout<< " Width "<<iWidth;
- cout<< " Lefttop X "<<iLeftTopX;
- cout<< " Lefttop Y "<<iLeftTopY;
- // For inner clipping points
- // Form 4 piars of P Q R S with Edge e ===> PQ , QR , RS , SP and AB , BC ,CD , DA
- typedef boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian> Points;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pP;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pQ;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pR;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pS;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pA;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pB;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pC;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pD;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pX;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pY;
- typedef boost::geometry::model::segment<Points> Segment;
- std::vector<Points> pOverlapOuterIntersect , pOverlapInnerIntersect;
- bool bIsNoInnerIntersection = false , bIsNoOuterIntersection = false;
- pP.set<0>(iLeftTopX);
- pP.set<1>(iLeftTopY);
- pQ.set<0>(iLeftTopX);
- pQ.set<1>(iLeftTopY + iHeight);
- pR.set<0>(iLeftTopX + iWidth);
- pR.set<1>(iLeftTopY + iHeight);
- pS.set<0>(iLeftTopX+ iWidth);
- pS.set<1>(iLeftTopY);
- pA.set<0>(iSourceTopXLeft); // For inner Clips
- pA.set<1>(iSourceTopYLeft);
- pB.set<0>(iSourceTopXLeft);
- pB.set<1>(iSourceTopYLeft + iSourceGraphHeight);
- pC.set<0>(iSourceTopXLeft + iSourceGraphWidth);
- pC.set<1>(iSourceTopYLeft + iSourceGraphHeight);
- pD.set<0>(iSourceTopXLeft + iSourceGraphWidth);
- pD.set<1>(iSourceTopYLeft);
- pX.set<0>(iUCoordX); // Source X and Y
- pX.set<1>(iUCoordY);
- pY.set<0>( iVCoordX); // Target X and Y
- pY.set<1>(iVCoordY);
- Segment PQ( pP,pQ );
- Segment QR( pQ,pR );
- Segment RS( pR,pS );
- Segment SP( pS,pP );
- Segment Edge (pX,pY);
- Segment AB(pA,pB);
- Segment BC(pB,pC);
- Segment CD(pC,pD);
- Segment DA(pD,pA);
- // check outer intersection
- if(boost::geometry::intersects(Edge,PQ))
- {
- boost::geometry::intersection(Edge,PQ,pOverlapOuterIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge PQ";
- }
- else if( boost::geometry::intersects(Edge,QR))
- {
- boost::geometry::intersection(Edge,QR,pOverlapOuterIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge QR";
- }
- else
- {
- if(boost::geometry::intersects(Edge,RS))
- {
- boost::geometry::intersection(Edge,RS,pOverlapOuterIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge RS";
- }
- else if(boost::geometry::intersects(Edge,SP))
- {
- boost::geometry::intersection(Edge,SP,pOverlapOuterIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge SP";
- }
- else
- {
- // no intersection , not possible but handle
- cout<<"\n *** No Intersection in Overlap *** Check Cluster cordinates" ;
- bIsNoOuterIntersection = true;
- }
- }
- // check inner intersection
- { // For separating two if else loops
- if(boost::geometry::intersects(Edge,AB))
- {
- boost::geometry::intersection(Edge,AB,pOverlapInnerIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge AB";
- }
- else if( boost::geometry::intersects(Edge,BC))
- {
- boost::geometry::intersection(Edge,BC,pOverlapInnerIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge BC";
- }
- else
- {
- if(boost::geometry::intersects(Edge,CD))
- {
- boost::geometry::intersection(Edge,CD,pOverlapInnerIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge CD";
- }
- else if(boost::geometry::intersects(Edge,DA))
- {
- boost::geometry::intersection(Edge,DA,pOverlapInnerIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge DA";
- }
- else
- {
- // no intersection , not possible but handle
- cout<<"\n *** No Inner Intersection in Overlap *** Check Cluster cordinates" ;
- bIsNoInnerIntersection = true;
- }
- }
- }
- int iOuterIntersectX,iOuterIntersectY,iInnerIntersectX,iInnerIntersectY;
- if(!bIsNoOuterIntersection)
- {
- Points pIntersection = pOverlapOuterIntersect[0];
- iOuterIntersectX = pIntersection.get<0>();
- iOuterIntersectY = pIntersection.get<1>();
- }
- if(!bIsNoInnerIntersection)
- {
- Points pIntersection = pOverlapInnerIntersect[0];
- iInnerIntersectX = pIntersection.get<0>();
- iInnerIntersectY = pIntersection.get<1>();
- }
- // attract source with inner and target with outer
- if(!bIsNoOuterIntersection && !bIsNoInnerIntersection )
- {
- // attract only if both intersections are found
- double dVx = iVCoordX - iOuterIntersectX;
- double dVy = iVCoordY - iOuterIntersectY;
- double dUx = iUCoordX - iInnerIntersectX;
- double dUy = iUCoordY - iInnerIntersectY;
- cout<<"\n Delta X and Y at attractive force case 2 : "<<dVy<<" "
- << dVx;
- double dDist1 = fabs(sqrt((dVx*dVx+dVy* dVy)));
- double dDist2 = fabs(sqrt((dUx*dUx+dUy* dUy)));
- cout<<"\n Distance at attractive force in Inter edges case 2: "<<dDist1;
- if(dDist1 == 0)
- {
- dDist1 = 0.0001;
- }
- if(dDist2 == 0)
- {
- dDist2 = 0.0001;
- }
- // desired length = 50
- double dForce1 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist1)/dDist1 ; //0.3 force multiplier
- double dForce2 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist2)/dDist2 ; //0.3 force multiplier
- cout<<"\n Force between Case 2 interedges "<<dForce1<<" " <<dForce2;
- if(dDist1 < MINIMUM_INTEREDGE_DISTANCE )
- {
- dDist1 = 0.0001;
- dForce1 = 0;
- }
- if(dDist2 < MINIMUM_INTEREDGE_DISTANCE)
- {
- dDist2 = 0.0001;
- dForce2 = 0;
- }
- double dx1 = dForce1 * dVx;
- double dy1 = dForce1 * dVy;
- double dx2 = dForce2 * dUx;
- double dy2 = dForce2 * dUy;
- double dXDispV = m_bGraphWrapper.getVertXDisp(vTarget,gMaingraph);
- double dYDispV = m_bGraphWrapper.getVertYDisp(vTarget,gMaingraph);
- double dXDispU = 0;
- double dYDispU = 0;
- dXDispU = m_bGraphWrapper.getVertXDisp(vSource,gMaingraph);
- dYDispU = m_bGraphWrapper.getVertYDisp(vSource,gMaingraph);
- dXDispV += dx1;
- dYDispV += dy1;
- dXDispU += dx2;
- dYDispU += dy2;
- cout<<"\n Disp between interedges case 2 "<<dx1<<" " <<dy1;
- cout<<"\n Disp between interedges case 2 "<<dx2<<" " <<dy2;
- m_bGraphWrapper.setVertXDisp(dXDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertXDisp(dXDispU,vSource,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispU,vSource,gMaingraph);
- }
- }
- }
- void RelaxInterEdges :: nonOverLapCase(SubGraph& gMaingraph,
- VertexDescriptor& vSource,
- VertexDescriptor& vTarget,
- SubGraph* gSource, SubGraph* gTarget)
- {
- LAYOUT_ASSERT( gSource != NULL,
- LayoutException(__FUNCTION__
- ,LayoutExceptionEnum::INCONSISTENT_DATASTRUCTURE
- ,"Input and Output graphml path"
- ,"springRepelInterEdges"));
- LAYOUT_ASSERT( gTarget != NULL,
- LayoutException(__FUNCTION__
- ,LayoutExceptionEnum::INCONSISTENT_DATASTRUCTURE
- ,"Input and Output graphml path"
- ,"springRepelInterEdges"));
- int iSourceGraphHeight = m_bGraphWrapper.getGraphHeight(*gSource);
- int iSourceTopXLeft = m_bGraphWrapper.getGraphLeftTopCoordX(*gSource);
- int iSourceGraphWidth = m_bGraphWrapper.getGraphWidth(*gSource);
- int iSourceTopYLeft = m_bGraphWrapper.getGraphLeftTopCoordY(*gSource);
- int iTargetGraphHeight = m_bGraphWrapper.getGraphHeight(*gTarget);
- int iTargetTopXLeft = m_bGraphWrapper.getGraphLeftTopCoordX(*gTarget);
- int iTargetGraphWidth = m_bGraphWrapper.getGraphWidth(*gTarget);
- int iTargetTopYLeft = m_bGraphWrapper.getGraphLeftTopCoordY(*gTarget);
- int iSourceXIntersect =0 , iSourceYIntersect = 0 , iTargetYIntersect =0 ,
- iTargetXIntersect = 0;
- // Non overlapping code here
- // For inner clipping points of both subgraphs
- // Form 4 piars of P Q R S with Edge e ===> PQ , QR , RS , SP and AB , BC ,CD , DA
- typedef boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian> Points;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pP;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pQ;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pR;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pS;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pA;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pB;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pC;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pD;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pX;
- boost::geometry::model::point<int, 2, boost::geometry::cs::cartesian>pY;
- typedef boost::geometry::model::segment<Points> Segment;
- std::vector<Points> pSourceIntersect , pTargetIntersect;
- bool bIsNoInnerIntersection = false , bIsNoOuterIntersection = false;
- pP.set<0>(iSourceTopXLeft);
- pP.set<1>(iSourceTopYLeft); // For Source
- pQ.set<0>(iSourceTopXLeft);
- pQ.set<1>(iSourceTopYLeft+ iSourceGraphHeight);
- pR.set<0>(iSourceTopXLeft+ iSourceGraphWidth);
- pR.set<1>(iSourceTopYLeft + iSourceGraphHeight);
- pS.set<0>(iSourceTopXLeft+ iSourceGraphWidth);
- pS.set<1>(iSourceTopYLeft);
- pA.set<0>(iTargetTopXLeft); // For Target
- pA.set<1>(iTargetTopYLeft);
- pB.set<0>(iTargetTopXLeft);
- pB.set<1>(iTargetTopYLeft + iTargetGraphHeight);
- pC.set<0>(iTargetTopXLeft + iTargetGraphWidth);
- pC.set<1>(iTargetTopYLeft + iTargetGraphHeight);
- pD.set<0>(iTargetTopXLeft + iTargetGraphWidth);
- pD.set<1>(iTargetTopYLeft);
- int iUCoordX = m_bGraphWrapper.getVertexCenterCoordX(vSource,gMaingraph);
- int iUCoordY = m_bGraphWrapper.getVertexCenterCoordY(vSource,gMaingraph);
- int iVCoordX = m_bGraphWrapper.getVertexCenterCoordX(vTarget,gMaingraph);
- int iVCoordY = m_bGraphWrapper.getVertexCenterCoordY(vTarget,gMaingraph);
- pX.set<0>(iUCoordX); // Source X and Y
- pX.set<1>(iUCoordY);
- pY.set<0>(iVCoordX); // Target X and Y
- pY.set<1>(iVCoordY);
- Segment PQ( pP,pQ );
- Segment QR( pQ,pR );
- Segment RS( pR,pS );
- Segment SP( pS,pP );
- Segment Edge (pX,pY);
- Segment AB(pA,pB);
- Segment BC(pB,pC);
- Segment CD(pC,pD);
- Segment DA(pD,pA);
- {
- if(boost::geometry::intersects(Edge,PQ))
- {
- boost::geometry::intersection(Edge,PQ,pSourceIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge PQ";
- }
- else if( boost::geometry::intersects(Edge,QR))
- {
- boost::geometry::intersection(Edge,QR,pSourceIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge QR";
- }
- else
- {
- if(boost::geometry::intersects(Edge,RS))
- {
- // get insetersect points
- boost::geometry::intersection(Edge,RS,pSourceIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge RS";
- }
- else if(boost::geometry::intersects(Edge,SP))
- {
- boost::geometry::intersection(Edge,SP,pSourceIntersect);
- cout<<" \n OverLapping Outer Clip Found with Edge SP";
- }
- else
- {
- // no intersection , not possible but handle
- cout<<"\n *** No Intersection in Overlap *** Check Cluster cordinates" ;
- bIsNoOuterIntersection = true;
- }
- }
- }
- { // For separating two if else loops
- if(boost::geometry::intersects(Edge,AB))
- {
- boost::geometry::intersection(Edge,AB,pTargetIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge AB";
- }
- else if( boost::geometry::intersects(Edge,BC))
- {
- boost::geometry::intersection(Edge,BC,pTargetIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge BC";
- }
- else
- {
- if(boost::geometry::intersects(Edge,CD))
- {
- boost::geometry::intersection(Edge,CD,pTargetIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge CD";
- }
- else if(boost::geometry::intersects(Edge,DA))
- {
- boost::geometry::intersection(Edge,DA,pTargetIntersect);
- cout<<" \n OverLapping Inner Clip Found with Edge DA";
- }
- else
- {
- // no intersection , not possible but handle
- cout<<"\n *** No Inner Intersection in Overlap *** Check Cluster cordinates" ;
- bIsNoInnerIntersection = true;
- }
- }
- }
- // attract here
- if(!bIsNoOuterIntersection)
- {
- Points pIntersection = pSourceIntersect[0];
- iSourceXIntersect = pIntersection.get<0>();
- iSourceYIntersect = pIntersection.get<1>();
- }
- if(!bIsNoInnerIntersection)
- {
- Points pIntersection = pTargetIntersect[0];
- iTargetXIntersect = pIntersection.get<0>();
- iTargetYIntersect = pIntersection.get<1>();
- }
- if(!bIsNoOuterIntersection && !bIsNoInnerIntersection )
- {
- // attract only if both intersections are found
- double dVx = iVCoordX - iTargetXIntersect;
- double dVy = iVCoordY - iTargetYIntersect;
- double dUx = iUCoordX - iSourceXIntersect;
- double dUy = iUCoordY - iSourceYIntersect;
- cout<<"\n Delta X and Y at attractive force case 2 : "<<dVy<<" "
- << dVx;
- double dDist1 = fabs(sqrt((dVx*dVx+dVy* dVy)));
- double dDist2 = fabs(sqrt((dUx*dUx+dUy* dUy)));
- cout<<"\n Distance at attractive force in Inter edges case 2: "<<dDist1;
- if(dDist1 == 0)
- {
- dDist1 = 0.0001;
- }
- if(dDist2 == 0)
- {
- dDist2 = 0.0001;
- }
- // desired length = 50 // force = 0.3
- double dForce1 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist1)/dDist1 ; //0.3 force multiplier
- double dForce2 = INTEREDGES_ATTRACTION_MULTIPLIER *(INTEREDGES_DEFAULT_LENGTH - dDist2)/dDist2 ; //0.3 force multiplier
- cout<<"\n Force between Case 2 interedges "<<dForce1<<" " <<dForce2;
- if(dDist1 < MINIMUM_INTEREDGE_DISTANCE )
- {
- dDist1 = 0.0001;
- dForce1 = 0;
- }
- if(dDist2 < MINIMUM_INTEREDGE_DISTANCE)
- {
- dDist2 = 0.0001;
- dForce2 = 0;
- }
- double dx1 = dForce1 * dVx;
- double dy1 = dForce1 * dVy;
- double dx2 = dForce2 * dUx;
- double dy2 = dForce2 * dUy;
- double dXDispV = m_bGraphWrapper.getVertXDisp(vTarget,gMaingraph);
- double dYDispV = m_bGraphWrapper.getVertYDisp(vTarget,gMaingraph);
- double dXDispU = 0;
- double dYDispU = 0;
- dXDispU = m_bGraphWrapper.getVertXDisp(vSource,gMaingraph);
- dYDispU = m_bGraphWrapper.getVertYDisp(vSource,gMaingraph);
- dXDispV += dx1;
- dYDispV += dy1;
- dXDispU += dx2;
- dYDispU += dy2;
- cout<<"\n Disp between interedges case 2 "<<dx1<<" " <<dy1;
- cout<<"\n Disp between interedges case 2 "<<dx2<<" " <<dy2;
- m_bGraphWrapper.setVertXDisp(dXDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispV,vTarget,gMaingraph);
- m_bGraphWrapper.setVertXDisp(dXDispU,vSource,gMaingraph);
- m_bGraphWrapper.setVertYDisp(dYDispU,vSource,gMaingraph);
- }
- }
|