Changeset 8448:1dcb3b572959 in orange


Ignore:
Timestamp:
07/25/11 15:09:08 (3 years ago)
Author:
miha <miha.stajdohar@…>
Branch:
default
Convert:
555cb1065755ff3fb5f03411aa4e4ee378ae1852
Message:
 
Location:
source/orangeplot
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • source/orangeplot/networkcurve.cpp

    r8444 r8448  
    103103    set_u(u); 
    104104    set_v(v); 
     105    m_size = 1; 
     106    QPen p = pen(); 
     107    p.setWidthF(m_size); 
     108    setPen(p); 
    105109} 
    106110 
     
    181185{ 
    182186    m_weight = weight; 
    183     QPen p = pen(); 
    184     p.setWidthF(weight); 
    185     setPen(p); 
    186187} 
    187188 
     
    232233} 
    233234 
     235int NetworkCurve::random() 
     236{ 
     237    NodeItem *u; 
     238    Nodes::ConstIterator uit = m_nodes.constBegin(); 
     239    Nodes::ConstIterator uend = m_nodes.constEnd(); 
     240 
     241    for (; uit != uend; ++uit) 
     242    { 
     243        u = uit.value(); 
     244        u->set_x(((qreal)(qrand() % 1000)) * 1000); 
     245        u->set_y(((qreal)(qrand() % 1000)) * 1000); 
     246    } 
     247 
     248    return 0; 
     249} 
     250 
    234251int NetworkCurve::fr(int steps, bool weighted, double temperature, double cooling) 
    235252{ 
     
    248265    } 
    249266 
    250     qreal area = data_r.width() * data_r.height(); 
    251  
    252     qreal k2 = area / m_nodes.size(); 
    253     qreal k = sqrt(k2); 
    254     qreal kk = 2 * k; 
    255     qreal kk2 = kk * kk; 
    256  
     267    double area = data_r.width() * data_r.height(); 
     268 
     269 
     270    double k2 = area / m_nodes.size(); 
     271    double k = sqrt(k2); 
     272    double kk = 2 * k; 
     273    double kk2 = kk * kk; 
     274    qDebug() << "area " << area << "; k2 " << k2 << "; k " << k << "; kk " << kk << "; kk2 " << kk2; 
    257275    // iterations 
    258276    for (i = 0; i < steps; i++) 
    259277    { 
    260         DataPoint tmp_point; 
    261         QMap<int, DataPoint>::ConstIterator qit = disp.constBegin(); 
    262         QMap<int, DataPoint>::ConstIterator qend = disp.constEnd(); 
    263         for (; qit != qend; ++qit) 
     278        foreach (const NodeItem* node, m_nodes) 
    264279        { 
    265             tmp_point = qit.value(); 
    266             tmp_point.x = 0; 
    267             tmp_point.y = 0; 
     280            disp[node->index()].x = 0; 
     281            disp[node->index()].y = 0; 
    268282        } 
    269283 
     
    279293            { 
    280294                v = vit.value(); 
    281                 qreal difx = u->x() - v->x(); 
    282                 qreal dify = u->y() - v->y(); 
    283  
    284                 qreal dif2 = difx * difx + dify * dify; 
     295 
     296                double difx = u->x() - v->x(); 
     297                double dify = u->y() - v->y(); 
     298 
     299                double dif2 = difx * difx + dify * dify; 
    285300 
    286301                if (dif2 < kk2) 
     
    289304                        dif2 = 1; 
    290305 
    291                     qreal dX = difx * k2 / dif2; 
    292                     qreal dY = dify * k2 / dif2; 
    293  
    294                     disp[u->index()].x = disp[u->index()].x + dX; 
    295                     disp[u->index()].y = disp[u->index()].y + dY; 
    296  
    297                     disp[v->index()].x = disp[v->index()].x - dX; 
    298                     disp[v->index()].y = disp[v->index()].y - dY; 
     306                    double dX = difx * k2 / dif2; 
     307                    double dY = dify * k2 / dif2; 
     308 
     309                    disp[u->index()].x += dX; 
     310                    disp[u->index()].y += dY; 
     311 
     312                    disp[v->index()].x -= dX; 
     313                    disp[v->index()].y -= dY; 
    299314                } 
    300315            } 
     
    302317 
    303318        // calculate attractive forces 
    304         if (weighted) 
     319        for (j = 0; j < m_edges.size(); ++j) 
    305320        { 
    306             for (j = 0; j < m_edges.size(); ++j) 
    307             { 
    308                 edge = m_edges[j]; 
    309                 qreal difx = edge->u()->x() - edge->v()->x(); 
    310                 qreal dify = edge->u()->y() - edge->v()->y(); 
    311  
    312                 qreal dif = sqrt(difx * difx + dify * dify); 
    313  
    314                 qreal dX = difx * dif / k * edge->weight(); 
    315                 qreal dY = dify * dif / k * edge->weight(); 
    316  
    317                 disp[edge->u()->index()].x = disp[edge->u()->index()].x + dX; 
    318                 disp[edge->u()->index()].y = disp[edge->u()->index()].y + dY; 
    319  
    320                 disp[edge->v()->index()].x = disp[edge->v()->index()].x - dX; 
    321                 disp[edge->v()->index()].y = disp[edge->v()->index()].y - dY; 
     321            edge = m_edges[j]; 
     322            double difx = edge->u()->x() - edge->v()->x(); 
     323            double dify = edge->u()->y() - edge->v()->y(); 
     324 
     325            double dif = sqrt(difx * difx + dify * dify); 
     326 
     327            double dX = difx * dif / k; 
     328            double dY = dify * dif / k; 
     329 
     330            if (weighted) { 
     331                dX *= edge->weight(); 
     332                dY *= edge->weight(); 
    322333            } 
     334 
     335            disp[edge->u()->index()].x -= dX; 
     336            disp[edge->u()->index()].y -= dY; 
     337 
     338            disp[edge->v()->index()].x += dX; 
     339            disp[edge->v()->index()].y += dY; 
    323340        } 
    324         else 
    325         { 
    326             for (j = 0; j < m_edges.size(); ++j) 
    327             { 
    328                 edge = m_edges[j]; 
    329                 qreal difx = edge->u()->x() - edge->v()->x(); 
    330                 qreal dify = edge->u()->y() - edge->v()->y(); 
    331  
    332                 qreal dif = sqrt(difx * difx + dify * dify); 
    333  
    334                 qreal dX = difx * dif / k; 
    335                 qreal dY = dify * dif / k; 
    336  
    337                 disp[edge->u()->index()].x = disp[edge->u()->index()].x + dX; 
    338                 disp[edge->u()->index()].y = disp[edge->u()->index()].y + dY; 
    339  
    340                 disp[edge->v()->index()].x = disp[edge->v()->index()].x - dX; 
    341                 disp[edge->v()->index()].y = disp[edge->v()->index()].y - dY; 
    342             } 
    343         } 
     341 
    344342        // limit the maximum displacement to the temperature t 
    345343        // and then prevent from being displaced outside frame 
     
    348346        { 
    349347            u = nit.value(); 
    350             qreal dif = sqrt(disp[u->index()].x * disp[u->index()].x + disp[u->index()].y * disp[u->index()].y); 
     348            double dif = sqrt(disp[u->index()].x * disp[u->index()].x + disp[u->index()].y * disp[u->index()].y); 
    351349 
    352350            if (dif == 0) 
    353351                dif = 1; 
    354352 
    355             qDebug() << i << " old " << u->x() << " " << u->y(); 
    356             u->setX(u->x() + (disp[u->index()].x * qMin(fabs(disp[u->index()].x), temperature) / dif)); 
    357             u->setY(u->y() + (disp[u->index()].y * qMin(fabs(disp[u->index()].y), temperature) / dif)); 
    358             qDebug() << i << " new " << u->x() << " " << u->y(); 
     353            u->set_x(u->x() + (disp[u->index()].x * qMin(fabs(disp[u->index()].x), temperature) / dif)); 
     354            u->set_y(u->y() + (disp[u->index()].y * qMin(fabs(disp[u->index()].y), temperature) / dif)); 
    359355        } 
     356 
     357        plot()->replot(); 
     358        plot()->set_dirty(); 
    360359 
    361360        temperature = temperature * cooling; 
  • source/orangeplot/networkcurve.h

    r8444 r8448  
    44#include "curve.h" 
    55#include "point.h" 
     6#include "plot.h" 
    67 
    78class EdgeItem; 
     
    9495    int m_links_index; 
    9596    double m_weight; 
     97    double m_size; 
    9698    QString m_label; 
    9799}; 
     
    134136     
    135137    int fr(int steps, bool weighted, double temperature, double cooling); 
     138    int random(); 
    136139     
    137140    void set_nodes(Nodes nodes); 
  • source/orangeplot/networkcurve.sip

    r8444 r8448  
    7777     
    7878    int fr(int steps, bool weighted, double temperature, double cooling); 
     79    int random(); 
    7980     
    8081    void set_nodes(QMap<int, NodeItem*> nodes); 
Note: See TracChangeset for help on using the changeset viewer.