Changeset 4031:b96276722e4b in orange


Ignore:
Timestamp:
07/31/07 23:45:42 (7 years ago)
Author:
miha <miha.stajdohar@…>
Branch:
default
Convert:
18235ec874754895d124c6e3f86b885c77293fb9
Message:

fixed radilal F-R

Location:
source/orangeom
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • source/orangeom/networkoptimization.cpp

    r4027 r4031  
    459459                //  continue; 
    460460         
     461                if (level[u] == level[v]) 
     462                    k = kVector[level[u]]; 
     463                else 
     464                    k = radius; 
     465 
     466                //kk = 2 * k; 
     467                k2 = k*k; 
     468 
    461469                double difX = pos[v][0] - pos[u][0]; 
    462470                double difY = pos[v][1] - pos[u][1]; 
     
    490498            //  continue; 
    491499 
     500            if (level[u] == level[v]) 
     501                    k = kVector[level[u]]; 
     502                else 
     503                    k = radius; 
     504 
     505            kk = 2 * k; 
     506            k2 = k*k; 
     507 
    492508            double difX = pos[v][0] - pos[u][0]; 
    493509            double difY = pos[v][1] - pos[u][1]; 
     
    506522        // limit the maximum displacement to the temperature t 
    507523        // and then prevent from being displaced outside frame 
     524 
     525        for (v = 0; v < nCircles; v++) 
     526        { 
     527            levelMin[v] = INT_MAX; 
     528            levelMax[v] = 0; 
     529        } 
     530 
    508531        for (v = 0; v < nVertices; v++) 
    509532        { 
     
    517540 
    518541            double distance = (pos[v][0] - (width/2)) * (pos[v][0] - (width/2)) + (pos[v][1] - (height/2)) * (pos[v][1] - (height/2)); 
     542             
     543            if (distance < levelMin[level[v]]) 
     544                levelMin[level[v]] = distance; 
     545 
     546            if (distance > levelMax[level[v]]) 
     547                levelMax[level[v]] = distance; 
     548        } 
     549 
     550        for (v = 1; v < nCircles; v++) 
     551        { 
     552            //cout << "c: " << v << " min: " << sqrt(levelMin[v]) << " max: " << sqrt(levelMax[v]); 
     553 
     554            levelMin[v] = (v - 1) * radius / sqrt(levelMin[v]); 
     555            levelMax[v] =  v      * radius / sqrt(levelMax[v]); 
     556 
     557            //cout  << " min: " << levelMin[v] << " max: " << levelMax[v] << "r: " << v * radius << endl; 
     558        } 
     559        //* 
     560        for (v = 0; v < nVertices; v++) 
     561        { 
     562            double distance = sqrt((pos[v][0] - (width/2)) * (pos[v][0] - (width/2)) + (pos[v][1] - (height/2)) * (pos[v][1] - (height/2))); 
     563 
     564            if (level[v] == 0) 
     565            { 
     566                // move to center 
     567                pos[v][0] = width / 2; 
     568                pos[v][1] = height / 2; 
     569 
     570                //cout << "center, x: " << pos[v][0] << " y: " << pos[v][1] << endl; 
     571            } 
     572            else if (distance > level[v] * radius - radius / 2) 
     573            { 
     574                // move to outer ring 
     575                if (levelMax[level[v]] < 1) 
     576                { 
     577                    double fi = 0; 
     578                    double x = pos[v][0] - (width / 2); 
     579                    double y = pos[v][1] - (height / 2); 
     580                     
     581                    if (x < 0) 
     582                        fi = atan(y / x) + PI; 
     583                    else if ((x > 0) && (y >= 0)) 
     584                        fi = atan(y / x); 
     585                    else if ((x > 0) && (y < 0)) 
     586                        fi = atan(y / x) + 2 * PI; 
     587                    else if ((x == 0) && (y > 0)) 
     588                        fi = PI / 2; 
     589                    else if ((x == 0) && (y < 0)) 
     590                        fi = 3 * PI / 2; 
     591                    /* 
     592                    cout << "width: " << width << " height: " << height << endl; 
     593                    cout << "r: " << distance << endl; 
     594                    cout << "x: " << pos[v][0] << " y: " << pos[v][1] << endl; 
     595                    cout << "x-500: " << pos[v][0]-500 << " y-500: " << pos[v][1]-500 << endl; 
     596                    cout << "x-500^2: " << (pos[v][0]-5000)*(pos[v][0]-5000) << " y-500^2: " << (pos[v][1]-5000)*(pos[v][1]-5000) << endl; 
     597                    cout << "x-500^2 + y-500^2: " << (pos[v][0]-5000)*(pos[v][0]-5000) + (pos[v][1]-5000)*(pos[v][1]-5000) << endl; 
     598                    pos[v][0] = distance * cos(fi) + (width / 2); 
     599                    pos[v][1] = distance * sin(fi) + (height / 2); 
     600                    cout << "x: " << pos[v][0] << " y: " << pos[v][1] << endl; 
     601                    */ 
     602                    pos[v][0] = levelMax[level[v]] * distance * cos(fi) + (width / 2); 
     603                    pos[v][1] = levelMax[level[v]] * distance * sin(fi) + (height / 2); 
     604 
     605                    //cout << "outer, x: " << pos[v][0] << " y: " << pos[v][1] << " radius: " << radius << " fi: " << fi << " level: " << level[v] << " v: " << v << endl; 
     606                } 
     607            } 
     608            else if (distance < (level[v] - 1) * radius + radius / 2) 
     609            { 
     610                // move to inner ring 
     611                if (levelMin[level[v]] > 1) 
     612                { 
     613                    double fi = 0; 
     614                    double x = pos[v][0] - (width / 2); 
     615                    double y = pos[v][1] - (height / 2); 
     616                     
     617                    if (x < 0) 
     618                        fi = atan(y / x) + PI; 
     619                    else if ((x > 0) && (y >= 0)) 
     620                        fi = atan(y / x); 
     621                    else if ((x > 0) && (y < 0)) 
     622                        fi = atan(y / x) + 2 * PI; 
     623                    else if ((x == 0) && (y > 0)) 
     624                        fi = PI / 2; 
     625                    else if ((x == 0) && (y < 0)) 
     626                        fi = 3 * PI / 2; 
     627                     
     628                    //pos[v][0] = distance * cos(fi) + (width / 2); 
     629                    //pos[v][1] = distance * sin(fi) + (height / 2); 
     630 
     631                    pos[v][0] = levelMin[level[v]] * distance * cos(fi) + (width / 2); 
     632                    pos[v][1] = levelMin[level[v]] * distance * sin(fi) + (height / 2); 
     633 
     634                    //cout << "inner, x: " << pos[v][0] << " y: " << pos[v][1] << endl; 
     635                } 
     636            } 
     637        } 
     638        /**/ 
     639        /* 
     640        for (v = 0; v < nVertices; v++) 
     641        { 
     642 
     643            double dif = sqrt(disp[v][0] * disp[v][0] + disp[v][1] * disp[v][1]); 
     644 
     645            if (dif == 0) 
     646                dif = 1; 
     647 
     648            pos[v][0] = pos[v][0] + (disp[v][0] * min(fabs(disp[v][0]), temperature) / dif); 
     649            pos[v][1] = pos[v][1] + (disp[v][1] * min(fabs(disp[v][1]), temperature) / dif); 
     650             
     651            double distance = (pos[v][0] - (width/2)) * (pos[v][0] - (width/2)) + (pos[v][1] - (height/2)) * (pos[v][1] - (height/2)); 
     652             
    519653            //cout << "x: " << pos[v][0] << " y: " << pos[v][1] << " width: " << width << " height: " << height << endl; 
    520654            //cout << "distance: " << distance << " radius: " << (level[v] * radius) * (level[v] * radius) << endl; 
     
    548682                //cout << "inner, x: " << pos[v][0] << " y: " << pos[v][1] << endl; 
    549683            } 
    550             /**/ 
    551         } 
     684             
     685        } 
     686        /**/ 
    552687        //cout << temperature << ", "; 
    553688        temperature = temperature * coolFactor; 
     
    810945 
    811946    graph->level = new int[graph->nVertices]; 
     947    graph->kVector = new double[nCircles]; 
     948    graph->levelMin = new double[nCircles]; 
     949    graph->levelMax = new double[nCircles]; 
    812950    int i; 
    813951    for (i = 0; i < graph->nVertices; i++) 
    814952        graph->level[i] = nCircles; 
    815  
     953     
     954    for (i = 0; i < nCircles; i++) 
     955    { 
     956        graph->kVector[i] = 0; 
     957        graph->levelMin[i] = INT_MAX; 
     958        graph->levelMax[i] = 0; 
     959    } 
    816960    vector<int> removedLinks[2]; 
    817961    vector<int> vertices; 
     
    8961040    } 
    8971041 
     1042 
     1043    for (i = 0; i < graph->nVertices; i++) 
     1044    { 
     1045        graph->kVector[graph->level[i]]++; 
     1046    } 
     1047 
     1048    double radius = graph->width / nCircles / 2; 
     1049    for (i = 0; i < nCircles; i++) 
     1050    { 
     1051        //cout << "n: " << graph->kVector[i] << endl; 
     1052        //cout << "r: " << radius * i; 
     1053        if (graph->kVector[i] > 0) 
     1054            graph->kVector[i] = 2 * i * radius * sin(PI / graph->kVector[i]); 
     1055        else 
     1056            graph->kVector[i] = -1; 
     1057 
     1058        //cout << "kvec: " << graph->kVector[i] << endl; 
     1059    } 
     1060 
    8981061    graph->temperature = temperature; 
    8991062    graph->coolFactor = exp(log(10.0/10000.0) / steps); 
     
    9051068    { 
    9061069        delete[] graph->level; 
     1070        delete[] graph->kVector; 
     1071        delete[] graph->levelMin; 
     1072        delete[] graph->levelMax; 
    9071073        PYERROR(PyExc_SystemError, "radialFruchtermanReingold failed", NULL); 
    9081074    } 
    9091075 
    9101076    delete[] graph->level; 
    911  
     1077    delete[] graph->kVector; 
     1078    delete[] graph->levelMin; 
     1079    delete[] graph->levelMax; 
    9121080    return Py_BuildValue("d", graph->temperature); 
    9131081  PyCATCH 
  • source/orangeom/networkoptimization.hpp

    r4027 r4031  
    9494    double **pos; 
    9595    int *level; 
     96    double *kVector; 
     97    double *levelMin; 
     98    double *levelMax; 
    9699}; 
    97100 
Note: See TracChangeset for help on using the changeset viewer.