Changeset 8419:d42f267be274 in orange


Ignore:
Timestamp:
07/23/11 10:33:09 (3 years ago)
Author:
miha <miha.stajdohar@…>
Branch:
default
Convert:
9d46eecb3cb411f63f5625c9ffb28af5c55a4ced
Message:
 
Location:
source/orangeplot
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • source/orangeplot/networkcurve.cpp

    r8385 r8419  
    107107} 
    108108 
     109int NetworkCurve::fr(int steps, bool weighted, double temperature, double cooling) 
     110{ 
     111    int i, j; 
     112    NodeItem u, v; 
     113    EdgeItem edge; 
     114    Nodes nodes = get_nodes(); 
     115    Edges edges = get_edges(); 
     116    QRectF data_rect = dataRect(); 
     117 
     118    QMap<int, DataPoint> disp; 
     119    foreach (const NodeItem& node, get_nodes()) 
     120    { 
     121        DataPoint point; 
     122        point.x = 0; 
     123        point.y = 0; 
     124        disp[node.index] = point; 
     125    } 
     126 
     127    qreal area = data_rect.width() * data_rect.height(); 
     128 
     129    qreal k2 = area / nodes.size(); 
     130    qreal k = sqrt(k2); 
     131    qreal kk = 2 * k; 
     132    qreal kk2 = kk * kk; 
     133 
     134    // iterations 
     135    for (i = 0; i < steps; i++) 
     136    { 
     137        DataPoint tmp_point; 
     138        QMap<int, DataPoint>::ConstIterator qit = disp.constBegin(); 
     139        QMap<int, DataPoint>::ConstIterator qend = disp.constEnd(); 
     140        for (; qit != qend; ++qit) 
     141        { 
     142            tmp_point = qit.value(); 
     143            tmp_point.x = 0; 
     144            tmp_point.y = 0; 
     145        } 
     146 
     147        // calculate repulsive force 
     148        Nodes::ConstIterator uit = nodes.constBegin(); 
     149        Nodes::ConstIterator uend = nodes.constEnd(); 
     150        for (; uit != uend; ++uit) 
     151        { 
     152            u = uit.value(); 
     153            Nodes::ConstIterator vit(uit); 
     154            ++vit; 
     155            for (; vit != uend; ++vit) 
     156            { 
     157                v = vit.value(); 
     158                qreal difx = u.x - v.x; 
     159                qreal dify = u.y - v.y; 
     160 
     161                qreal dif2 = difx * difx + dify * dify; 
     162 
     163                if (dif2 < kk2) 
     164                { 
     165                    if (dif2 == 0) 
     166                        dif2 = 1; 
     167 
     168                    qreal dX = difx * k2 / dif2; 
     169                    qreal dY = dify * k2 / dif2; 
     170 
     171                    disp[u.index].x = disp[u.index].x + dX; 
     172                    disp[u.index].y = disp[u.index].y + dY; 
     173 
     174                    disp[v.index].x = disp[v.index].x - dX; 
     175                    disp[v.index].y = disp[v.index].y - dY; 
     176                } 
     177            } 
     178        } 
     179 
     180        // calculate attractive forces 
     181        if (weighted) 
     182        { 
     183            for (j = 0; j < edges.size(); ++j) 
     184            { 
     185                edge = edges[j]; 
     186                qreal difx = edge.u->x - edge.v->x; 
     187                qreal dify = edge.u->y - edge.v->y; 
     188 
     189                qreal dif = sqrt(difx * difx + dify * dify); 
     190 
     191                qreal dX = difx * dif / k * edge.weight; 
     192                qreal dY = dify * dif / k * edge.weight; 
     193 
     194                disp[edge.u->index].x = disp[edge.u->index].x + dX; 
     195                disp[edge.u->index].y = disp[edge.u->index].y + dY; 
     196 
     197                disp[edge.v->index].x = disp[edge.v->index].x - dX; 
     198                disp[edge.v->index].y = disp[edge.v->index].y - dY; 
     199            } 
     200        } 
     201        else 
     202        { 
     203            for (j = 0; j < edges.size(); ++j) 
     204            { 
     205                edge = edges[j]; 
     206                qreal difx = edge.u->x - edge.v->x; 
     207                qreal dify = edge.u->y - edge.v->y; 
     208 
     209                qreal dif = sqrt(difx * difx + dify * dify); 
     210 
     211                qreal dX = difx * dif / k; 
     212                qreal dY = dify * dif / k; 
     213 
     214                disp[edge.u->index].x = disp[edge.u->index].x + dX; 
     215                disp[edge.u->index].y = disp[edge.u->index].y + dY; 
     216 
     217                disp[edge.v->index].x = disp[edge.v->index].x - dX; 
     218                disp[edge.v->index].y = disp[edge.v->index].y - dY; 
     219            } 
     220        } 
     221        // limit the maximum displacement to the temperature t 
     222        // and then prevent from being displaced outside frame 
     223        Nodes::Iterator nit = nodes.begin(); 
     224        for (; nit != nodes.end(); ++nit) 
     225        { 
     226            u = nit.value(); 
     227            qreal dif = sqrt(disp[u.index].x * disp[u.index].x + disp[u.index].y * disp[u.index].y); 
     228 
     229            if (dif == 0) 
     230                dif = 1; 
     231 
     232            qDebug() << i << " old " << u.x << " " << u.y; 
     233            u.x = u.x + (disp[u.index].x * std::min(fabs(disp[u.index].x), temperature) / dif); 
     234            u.y = u.y + (disp[u.index].y * std::min(fabs(disp[u.index].y), temperature) / dif); 
     235            qDebug() << i << " new " << u.x << " " << u.y; 
     236        } 
     237 
     238        temperature = temperature * cooling; 
     239    } 
     240 
     241    return 0; 
     242} 
  • source/orangeplot/networkcurve.h

    r8385 r8419  
    33 
    44#include "curve.h" 
     5#include <math.h> 
    56 
    67struct NodeItem 
     
    5051    virtual Nodes get_nodes() const = 0; 
    5152    virtual Edges get_edges() const = 0; 
    52      
     53 
    5354    virtual QRectF dataRect() const; 
    5455     
     56    int fr(int steps, bool weighted, double temperature, double cooling); 
     57 
    5558private: 
    5659    QMap<int, QGraphicsPathItem*> m_vertex_items; 
  • source/orangeplot/networkcurve.sip

    r8385 r8419  
    5656 
    5757    virtual QRectF dataRect() const; 
     58     
     59    int fr(int steps, bool weighted, double temperature, double cooling); 
    5860}; 
Note: See TracChangeset for help on using the changeset viewer.