graph_displayer_canvas.cc
author ladanyi
Wed, 02 Jan 2008 21:03:09 +0000
changeset 201 879e47e5b731
parent 194 6b2b718420eb
permissions -rwxr-xr-x
Merge branches/akos to trunk.
alpar@174
     1
/* -*- C++ -*-
alpar@174
     2
 *
alpar@174
     3
 * This file is a part of LEMON, a generic C++ optimization library
alpar@174
     4
 *
alpar@174
     5
 * Copyright (C) 2003-2006
alpar@174
     6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
alpar@174
     7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
alpar@174
     8
 *
alpar@174
     9
 * Permission to use, modify and distribute this software is granted
alpar@174
    10
 * provided that this copyright notice appears in all copies. For
alpar@174
    11
 * precise terms see the accompanying LICENSE file.
alpar@174
    12
 *
alpar@174
    13
 * This software is provided "AS IS" with no warranty of any kind,
alpar@174
    14
 * express or implied, and with no claim as to its suitability for any
alpar@174
    15
 * purpose.
alpar@174
    16
 *
alpar@174
    17
 */
alpar@174
    18
hegyi@194
    19
#include <mapstorage.h>
hegyi@194
    20
#include <nbtab.h>
hegyi@194
    21
#include <graph_displayer_canvas.h>
hegyi@167
    22
#include <lemon/random.h>
alpar@59
    23
#include <cmath>
ladanyi@6
    24
hegyi@96
    25
GraphDisplayerCanvas::GraphDisplayerCanvas(NoteBookTab & mainw) :
hegyi@194
    26
  nodesmap(mainw.mapstorage->graph), edgesmap(mainw.mapstorage->graph), edgetextmap(mainw.mapstorage->graph),
hegyi@194
    27
  nodetextmap(mainw.mapstorage->graph), displayed_graph(*(root()), 0, 0),
ladanyi@66
    28
  isbutton(0), active_item(NULL), target_item(NULL), nodemap_to_edit(""),
hegyi@160
    29
  edgemap_to_edit(""), autoscale(true), zoomtrack(false), radius_size(20), edge_width(10),
ladanyi@184
    30
  was_redesigned(false), is_drawn(false), mytab(mainw),
ladanyi@184
    31
  background_set(false)
ladanyi@6
    32
{
hegyi@187
    33
  //add mouse scroll event handler - it won't be changed, it handles zoom
hegyi@187
    34
  signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::scrollEventHandler), false);
hegyi@187
    35
ladanyi@53
    36
  //base event handler is move tool
ladanyi@53
    37
  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
ladanyi@53
    38
  actual_tool=MOVE;
hegyi@34
    39
hegyi@187
    40
ladanyi@53
    41
  active_node=INVALID;
ladanyi@53
    42
  active_edge=INVALID;
ladanyi@53
    43
  forming_edge=INVALID;
ladanyi@184
    44
ladanyi@184
    45
  setBackground();
ladanyi@184
    46
}
ladanyi@184
    47
ladanyi@184
    48
void GraphDisplayerCanvas::setBackground()
ladanyi@184
    49
{
ladanyi@184
    50
  if (background_set)
ladanyi@184
    51
  {
ladanyi@184
    52
    delete background;
ladanyi@184
    53
  }
hegyi@194
    54
  if (mytab.mapstorage->isBackgroundSet())
ladanyi@184
    55
  {
ladanyi@184
    56
    background_set = true;
ladanyi@184
    57
    refBackground = Gdk::Pixbuf::create_from_file(
hegyi@194
    58
      mytab.mapstorage->getBackgroundFilename());
ladanyi@184
    59
    background = new Gnome::Canvas::Pixbuf(
ladanyi@184
    60
        *(root()),
ladanyi@184
    61
        0.0 - refBackground->get_width() / 2.0,
ladanyi@184
    62
        0.0 - refBackground->get_height() / 2.0,
ladanyi@184
    63
        refBackground);
ladanyi@184
    64
    background->lower_to_bottom();
ladanyi@184
    65
  }
ladanyi@184
    66
  else
ladanyi@184
    67
  {
ladanyi@184
    68
    background_set = false;
ladanyi@184
    69
  }
ladanyi@53
    70
}
hegyi@9
    71
ladanyi@53
    72
GraphDisplayerCanvas::~GraphDisplayerCanvas()
ladanyi@53
    73
{
hegyi@194
    74
  for (NodeIt n((mytab.mapstorage)->graph); n != INVALID; ++n)
hegyi@94
    75
    {
hegyi@94
    76
      delete nodesmap[n];
hegyi@94
    77
      delete nodetextmap[n];
hegyi@94
    78
    }
hegyi@94
    79
  
hegyi@194
    80
  for (EdgeIt e((mytab.mapstorage)->graph); e != INVALID; ++e)
hegyi@94
    81
    {
hegyi@94
    82
      delete edgesmap[e];
hegyi@94
    83
      delete edgetextmap[e];
hegyi@94
    84
    }
hegyi@94
    85
}
ladanyi@6
    86
hegyi@94
    87
void GraphDisplayerCanvas::propertyChange(bool itisedge, int prop)
hegyi@94
    88
{
hegyi@94
    89
  if(itisedge)
hegyi@94
    90
    {
hegyi@94
    91
      propertyUpdate(Edge(INVALID), prop);
hegyi@94
    92
    }
hegyi@94
    93
  else
hegyi@94
    94
    {
hegyi@94
    95
      propertyUpdate(Node(INVALID), prop);
hegyi@94
    96
    }
hegyi@94
    97
}
hegyi@94
    98
hegyi@94
    99
void GraphDisplayerCanvas::propertyUpdate(Edge edge)
hegyi@94
   100
{
hegyi@94
   101
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@94
   102
    {
hegyi@94
   103
      propertyUpdate(edge, i);
hegyi@94
   104
    }
hegyi@94
   105
}
hegyi@94
   106
hegyi@94
   107
void GraphDisplayerCanvas::propertyUpdate(Node node)
hegyi@94
   108
{
hegyi@94
   109
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@94
   110
    {
hegyi@94
   111
      propertyUpdate(node, i);
hegyi@94
   112
    }
hegyi@94
   113
}
hegyi@94
   114
hegyi@118
   115
void GraphDisplayerCanvas::propertyUpdate(Node node, int prop)
hegyi@94
   116
{
hegyi@96
   117
  std::string mapname=mytab.getActiveNodeMap(prop);
hegyi@94
   118
hegyi@172
   119
  if(is_drawn)
ladanyi@201
   120
  {
ladanyi@201
   121
    if(mapname!="")
hegyi@94
   122
    {
ladanyi@201
   123
      std::vector<std::string> nodemaps = mytab.mapstorage->getNodeMapList();
ladanyi@201
   124
      bool found = false;
ladanyi@201
   125
      for (std::vector<std::string>::const_iterator it = nodemaps.begin();
ladanyi@201
   126
          it != nodemaps.end(); ++it)
ladanyi@201
   127
      {
ladanyi@201
   128
        if (*it == mapname)
ladanyi@201
   129
        {
ladanyi@201
   130
          found = true;
ladanyi@201
   131
          break;
ladanyi@201
   132
        }
ladanyi@201
   133
      }
ladanyi@201
   134
      if (found)
ladanyi@201
   135
      {
ladanyi@201
   136
        switch(prop)
ladanyi@201
   137
        {
ladanyi@201
   138
          case N_RADIUS:
ladanyi@201
   139
            changeNodeRadius(mapname, node);
ladanyi@201
   140
            break;
ladanyi@201
   141
          case N_COLOR:
ladanyi@201
   142
            changeNodeColor(mapname, node);
ladanyi@201
   143
            break;
ladanyi@201
   144
          case N_TEXT:
ladanyi@201
   145
            changeNodeText(mapname, node);
ladanyi@201
   146
            break;
ladanyi@201
   147
          default:
ladanyi@201
   148
            std::cerr<<"Error\n";
ladanyi@201
   149
        }
ladanyi@201
   150
      }
hegyi@94
   151
    }
ladanyi@201
   152
    else //mapname==""
ladanyi@201
   153
    {
ladanyi@201
   154
      Node node=INVALID;
ladanyi@201
   155
      switch(prop)
ladanyi@201
   156
      {
ladanyi@201
   157
        case N_RADIUS:
ladanyi@201
   158
          resetNodeRadius(node);
ladanyi@201
   159
          break;
ladanyi@201
   160
        case N_COLOR:
ladanyi@201
   161
          resetNodeColor(node);
ladanyi@201
   162
          break;
ladanyi@201
   163
        case N_TEXT:
ladanyi@201
   164
          resetNodeText(node);
ladanyi@201
   165
          break;
ladanyi@201
   166
        default:
ladanyi@201
   167
          std::cerr<<"Error\n";
ladanyi@201
   168
      }
ladanyi@201
   169
    }
ladanyi@201
   170
  }
hegyi@94
   171
}
hegyi@94
   172
hegyi@118
   173
void GraphDisplayerCanvas::propertyUpdate(Edge edge, int prop)
hegyi@94
   174
{
hegyi@96
   175
  std::string mapname=mytab.getActiveEdgeMap(prop);
hegyi@94
   176
hegyi@172
   177
  if(is_drawn)
ladanyi@201
   178
  {
ladanyi@201
   179
    if(mapname!="")
hegyi@94
   180
    {
ladanyi@201
   181
      std::vector<std::string> edgemaps = mytab.mapstorage->getEdgeMapList();
ladanyi@201
   182
      bool found = false;
ladanyi@201
   183
      for (std::vector<std::string>::const_iterator it = edgemaps.begin();
ladanyi@201
   184
          it != edgemaps.end(); ++it)
ladanyi@201
   185
      {
ladanyi@201
   186
        if (*it == mapname)
ladanyi@201
   187
        {
ladanyi@201
   188
          found = true;
ladanyi@201
   189
          break;
ladanyi@201
   190
        }
ladanyi@201
   191
      }
ladanyi@201
   192
      if (found)
ladanyi@201
   193
      {
ladanyi@201
   194
        switch(prop)
ladanyi@201
   195
        {
ladanyi@201
   196
          case E_WIDTH:
ladanyi@201
   197
            changeEdgeWidth(mapname, edge);
ladanyi@201
   198
            break;
ladanyi@201
   199
          case E_COLOR:
ladanyi@201
   200
            changeEdgeColor(mapname, edge);
ladanyi@201
   201
            break;
ladanyi@201
   202
          case E_TEXT:
ladanyi@201
   203
            changeEdgeText(mapname, edge);
ladanyi@201
   204
            break;
ladanyi@201
   205
          default:
ladanyi@201
   206
            std::cerr<<"Error\n";
ladanyi@201
   207
        }
ladanyi@201
   208
      }
hegyi@94
   209
    }
ladanyi@201
   210
    else //mapname==""
ladanyi@201
   211
    {
ladanyi@201
   212
      switch(prop)
ladanyi@201
   213
      {
ladanyi@201
   214
        case E_WIDTH:
ladanyi@201
   215
          resetEdgeWidth(edge);
ladanyi@201
   216
          break;
ladanyi@201
   217
        case E_COLOR:
ladanyi@201
   218
          resetEdgeColor(edge);
ladanyi@201
   219
          break;
ladanyi@201
   220
        case E_TEXT:
ladanyi@201
   221
          resetEdgeText(edge);
ladanyi@201
   222
          break;
ladanyi@201
   223
        default:
ladanyi@201
   224
          std::cerr<<"Error\n";
ladanyi@201
   225
      }
ladanyi@201
   226
    }
ladanyi@201
   227
  }
ladanyi@53
   228
}
ladanyi@53
   229
ladanyi@53
   230
void GraphDisplayerCanvas::drawGraph()
ladanyi@53
   231
{
ladanyi@6
   232
  //first edges are drawn, to hide joining with nodes later
ladanyi@6
   233
hegyi@194
   234
  for (EdgeIt i((mytab.mapstorage)->graph); i!=INVALID; ++i)
ladanyi@6
   235
  {
hegyi@194
   236
    if (mytab.mapstorage->graph.source(i) == mytab.mapstorage->graph.target(i))
ladanyi@151
   237
    {
ladanyi@151
   238
      edgesmap[i]=new LoopEdge(displayed_graph, i, *this);
ladanyi@151
   239
    }
ladanyi@151
   240
    else
ladanyi@151
   241
    {
ladanyi@151
   242
      edgesmap[i]=new BrokenEdge(displayed_graph, i, *this);
ladanyi@151
   243
    }
ladanyi@6
   244
    //initializing edge-text as well, to empty string
ladanyi@6
   245
ladanyi@201
   246
    XY text_pos=mytab.mapstorage->getArrowCoords(i);
ladanyi@98
   247
    text_pos+=(XY(10,10));
hegyi@25
   248
hegyi@25
   249
    edgetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
hegyi@28
   250
    edgetextmap[i]->property_fill_color().set_value("darkgreen");
hegyi@149
   251
    edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::mapEditEventHandler), false);
ladanyi@63
   252
    edgetextmap[i]->raise_to_top();
ladanyi@6
   253
  }
ladanyi@6
   254
ladanyi@6
   255
  //afterwards nodes come to be drawn
ladanyi@6
   256
hegyi@194
   257
  for (NodeIt i((mytab.mapstorage)->graph); i!=INVALID; ++i)
ladanyi@6
   258
  {
ladanyi@6
   259
    //drawing bule nodes, with black line around them
ladanyi@6
   260
ladanyi@53
   261
    nodesmap[i]=new Gnome::Canvas::Ellipse(
ladanyi@53
   262
        displayed_graph,
ladanyi@201
   263
        mytab.mapstorage->getNodeCoords(i).x-20,
ladanyi@201
   264
        mytab.mapstorage->getNodeCoords(i).y-20,
ladanyi@201
   265
        mytab.mapstorage->getNodeCoords(i).x+20,
ladanyi@201
   266
        mytab.mapstorage->getNodeCoords(i).y+20);
ladanyi@6
   267
    *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue");
ladanyi@6
   268
    *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black");
ladanyi@63
   269
    nodesmap[i]->raise_to_top();
hegyi@28
   270
hegyi@28
   271
    //initializing edge-text as well, to empty string
hegyi@28
   272
hegyi@150
   273
    XY text_pos(
ladanyi@201
   274
        (mytab.mapstorage->getNodeCoords(i).x+node_property_defaults[N_RADIUS]+5),
ladanyi@201
   275
        (mytab.mapstorage->getNodeCoords(i).y+node_property_defaults[N_RADIUS]+5));
hegyi@28
   276
ladanyi@53
   277
    nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph,
ladanyi@53
   278
        text_pos.x, text_pos.y, "");
hegyi@28
   279
    nodetextmap[i]->property_fill_color().set_value("darkblue");
hegyi@149
   280
    nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::mapEditEventHandler), false);
ladanyi@63
   281
    nodetextmap[i]->raise_to_top();
ladanyi@6
   282
  }
ladanyi@6
   283
hegyi@172
   284
  is_drawn=true;
hegyi@172
   285
hegyi@172
   286
  //upon drawing graph
hegyi@172
   287
  //properties have to
hegyi@172
   288
  //be set in as well
hegyi@172
   289
  for(int i=0;i<NODE_PROPERTY_NUM;i++)
hegyi@172
   290
    {
hegyi@172
   291
      propertyUpdate(Node(INVALID), i);
hegyi@172
   292
    }
hegyi@172
   293
hegyi@172
   294
  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
hegyi@172
   295
    {
hegyi@172
   296
      propertyUpdate(Edge(INVALID), i);
hegyi@172
   297
    }
hegyi@172
   298
ladanyi@6
   299
  updateScrollRegion();
ladanyi@6
   300
}
ladanyi@6
   301
ladanyi@53
   302
void GraphDisplayerCanvas::clear()
ladanyi@6
   303
{
ladanyi@53
   304
  active_node=INVALID;
ladanyi@53
   305
  active_edge=INVALID;
ladanyi@53
   306
  forming_edge=INVALID;
ladanyi@6
   307
hegyi@194
   308
  for (NodeIt n((mytab.mapstorage)->graph); n != INVALID; ++n)
ladanyi@6
   309
  {
ladanyi@53
   310
    delete nodesmap[n];
ladanyi@53
   311
    delete nodetextmap[n];
ladanyi@6
   312
  }
ladanyi@6
   313
hegyi@194
   314
  for (EdgeIt e((mytab.mapstorage)->graph); e != INVALID; ++e)
ladanyi@53
   315
  {
ladanyi@53
   316
    delete edgesmap[e];
ladanyi@53
   317
    delete edgetextmap[e];
ladanyi@53
   318
  }
hegyi@172
   319
hegyi@172
   320
  is_drawn=false;
ladanyi@6
   321
}
hegyi@154
   322
hegyi@157
   323
void GraphDisplayerCanvas::setView(bool autoscale_p, bool zoomtrack_p, double width_p, double radius_p)
hegyi@154
   324
{
hegyi@154
   325
  autoscale=autoscale_p;
hegyi@157
   326
  edge_width=width_p;
hegyi@157
   327
  radius_size=radius_p;
hegyi@156
   328
hegyi@156
   329
  if((!zoomtrack) && zoomtrack_p)
hegyi@156
   330
    {
hegyi@156
   331
      fixed_zoom_factor=get_pixels_per_unit();
hegyi@156
   332
    }
hegyi@156
   333
hegyi@156
   334
  zoomtrack=zoomtrack_p;
hegyi@156
   335
hegyi@154
   336
  propertyChange(false, N_RADIUS);
hegyi@157
   337
  propertyChange(true, E_WIDTH);
hegyi@154
   338
}
hegyi@154
   339
hegyi@157
   340
void GraphDisplayerCanvas::getView(bool & autoscale_p, bool & zoomtrack_p, double& width_p, double& radius_p)
hegyi@154
   341
{
hegyi@154
   342
  autoscale_p=autoscale;
hegyi@156
   343
  zoomtrack_p=zoomtrack;
hegyi@157
   344
  width_p=edge_width;
hegyi@157
   345
  radius_p=radius_size;
hegyi@154
   346
}
hegyi@160
   347
hegyi@160
   348
void GraphDisplayerCanvas::reDesignGraph()
hegyi@160
   349
{
ladanyi@201
   350
  MapStorage& ms = *mytab.mapstorage;
ladanyi@201
   351
  NodeIt firstnode(ms.graph);
hegyi@190
   352
  //is it not an empty graph?
hegyi@190
   353
  if(firstnode!=INVALID)
hegyi@190
   354
    {
hegyi@190
   355
      double max_coord=50000;
hegyi@190
   356
      double min_dist=20;
hegyi@190
   357
      double init_vector_length=25;
hegyi@166
   358
hegyi@190
   359
      if(!was_redesigned)
hegyi@190
   360
	{
ladanyi@201
   361
	  NodeIt i(ms.graph);
hegyi@167
   362
hegyi@190
   363
	  dim2::Point<double> init(init_vector_length*rnd(),
hegyi@190
   364
				   init_vector_length*rnd());
hegyi@190
   365
	  moveNode(init.x, init.y, nodesmap[i], i);
hegyi@190
   366
	  was_redesigned=true;
hegyi@190
   367
	}
hegyi@177
   368
hegyi@190
   369
      double attraction;
hegyi@190
   370
      double propulsation;
hegyi@190
   371
      int iterations;
hegyi@177
   372
ladanyi@201
   373
      ms.get_design_data(attraction, propulsation, iterations);
hegyi@160
   374
hegyi@190
   375
      //iteration counter
hegyi@190
   376
      for(int l=0;l<iterations;l++)
hegyi@190
   377
	{
ladanyi@201
   378
	  Graph::NodeMap<double> x(ms.graph);
ladanyi@201
   379
	  Graph::NodeMap<double> y(ms.graph);
hegyi@190
   380
	  XYMap<Graph::NodeMap<double> > actual_forces;
hegyi@190
   381
	  actual_forces.setXMap(x);
hegyi@190
   382
	  actual_forces.setYMap(y);
hegyi@160
   383
hegyi@190
   384
	  //count actual force for each nodes
ladanyi@201
   385
	  for (NodeIt i(ms.graph); i!=INVALID; ++i)
hegyi@160
   386
	    {
hegyi@190
   387
	      //propulsation of nodes
ladanyi@201
   388
	      for (NodeIt j(ms.graph); j!=INVALID; ++j)
hegyi@190
   389
		{
hegyi@190
   390
		  if(i!=j)
hegyi@190
   391
		    {
hegyi@190
   392
		      lemon::dim2::Point<double> delta =
ladanyi@201
   393
			(ms.getNodeCoords(i)-
ladanyi@201
   394
			 ms.getNodeCoords(j));
hegyi@190
   395
hegyi@190
   396
		      const double length_sqr=std::max(delta.normSquare(),min_dist);
hegyi@190
   397
hegyi@190
   398
		      //normalize vector
hegyi@190
   399
		      delta/=sqrt(length_sqr);
hegyi@190
   400
hegyi@190
   401
		      //calculating propulsation strength
hegyi@190
   402
		      //greater distance menas smaller propulsation strength
hegyi@190
   403
		      delta*=propulsation/length_sqr;
hegyi@190
   404
		    
hegyi@190
   405
		      actual_forces.set(i,(actual_forces[i]+delta));
hegyi@190
   406
		    }
hegyi@190
   407
		}
ladanyi@201
   408
            //attraction of nodes, to which actual node is bound
ladanyi@201
   409
            for(OutEdgeIt ei(ms.graph,i);ei!=INVALID;++ei)
ladanyi@201
   410
              {
ladanyi@201
   411
                lemon::dim2::Point<double> delta =
ladanyi@201
   412
                  (ms.getNodeCoords(i)-
ladanyi@201
   413
                   ms.getNodeCoords(ms.graph.target(ei)));
ladanyi@201
   414
ladanyi@201
   415
                //calculating attraction strength
ladanyi@201
   416
                //greater distance means greater strength
ladanyi@201
   417
                delta*=attraction;
ladanyi@201
   418
ladanyi@201
   419
                actual_forces.set(i,actual_forces[i]-delta);
ladanyi@201
   420
              }
ladanyi@201
   421
                    for(InEdgeIt ei(ms.graph,i);ei!=INVALID;++ei)
ladanyi@201
   422
              {
ladanyi@201
   423
                lemon::dim2::Point<double> delta =
ladanyi@201
   424
                  (ms.getNodeCoords(i)-
ladanyi@201
   425
                   ms.getNodeCoords(ms.graph.source(ei)));
ladanyi@201
   426
ladanyi@201
   427
                //calculating attraction strength
ladanyi@201
   428
                //greater distance means greater strength
ladanyi@201
   429
                delta*=attraction;
ladanyi@201
   430
ladanyi@201
   431
                actual_forces.set(i,actual_forces[i]-delta);
ladanyi@201
   432
              }
ladanyi@201
   433
	    }
ladanyi@201
   434
	  for (NodeIt i(ms.graph); i!=INVALID; ++i)
ladanyi@201
   435
	    {
ladanyi@201
   436
	      if((ms.getNodeCoords(i).x)+actual_forces[i].x>max_coord)
hegyi@160
   437
		{
ladanyi@201
   438
		  actual_forces[i].x=max_coord-(ms.getNodeCoords(i).x);
ladanyi@201
   439
		  std::cout << "Correction! " << ((ms.getNodeCoords(i).x)+actual_forces[i].x) << std::endl;
hegyi@190
   440
		}
ladanyi@201
   441
	      else if((ms.getNodeCoords(i).x)+actual_forces[i].x<(0-max_coord))
hegyi@190
   442
		{
ladanyi@201
   443
		  actual_forces[i].x=0-max_coord-(ms.getNodeCoords(i).x);
ladanyi@201
   444
		  std::cout << "Correction! " << ((ms.getNodeCoords(i).x)+actual_forces[i].x) << std::endl;
hegyi@160
   445
		}
ladanyi@201
   446
	      if((ms.getNodeCoords(i).y)+actual_forces[i].y>max_coord)
hegyi@190
   447
		{
ladanyi@201
   448
		  actual_forces[i].y=max_coord-(ms.getNodeCoords(i).y);
ladanyi@201
   449
		  std::cout << "Correction! " << ((ms.getNodeCoords(i).y)+actual_forces[i].y) << std::endl;
hegyi@190
   450
		}
ladanyi@201
   451
	      else if((ms.getNodeCoords(i).y)+actual_forces[i].y<(0-max_coord))
hegyi@190
   452
		{
ladanyi@201
   453
		  actual_forces[i].y=0-max_coord-(ms.getNodeCoords(i).y);
ladanyi@201
   454
		  std::cout << "Correction! " << ((ms.getNodeCoords(i).y)+actual_forces[i].y) << std::endl;
hegyi@190
   455
		}
hegyi@190
   456
	      moveNode(actual_forces[i].x, actual_forces[i].y, nodesmap[i], i);
hegyi@160
   457
	    }
hegyi@160
   458
	}
hegyi@160
   459
    }
hegyi@160
   460
}
hegyi@160
   461