обработка: чертане на линии със забавяне в рамките на цикъла

Искам да покажа пътища от външен .txt файл с данни като тези в него:

2,90,22
2,83,25
2,59,20
2,60,31
2,52,35
2,43,41
2,29,48
2,23,54
2,17,66
6,525,26
8,626,14
3,379,132
3,377,143
3,367,147
3,355,153
3,341,154
3,330,155

Ето кода

ArrayList pointList;

String[] temp;
String[] lines;

int n;
int x;
int y;
int id;


void setup(){
  lines = loadStrings("positions.txt");
  size(400,400);
  pointList = new ArrayList();

}

void draw(){
  //this is empty
}

void mouseReleased(){
  strokeWeight(9);
  importDraw();
}

void importDraw(){ 

    for(int i = 0; i < lines.length; ++i)
    {

      String[] temp = split(lines[i], ',');
      int id_ = id;
      id = int(temp[0]);
      int x_ = x;
      int y_ = y;
      x = int(temp[1]);
      y = int(temp[2]);
      PVector location = new PVector(x,y);
      if (id == id_)
      { 
      if(x_-x>0) stroke(255,0,0,10); else stroke(0,0,255,10); //red lines moving left blue lines moving right
      line(x_,y_,x,y);
      }
      n++;
      del(10); // delay of 10 secs
      println("delay done" + n); // console log after delay with number of loops that passed

    }
}

void del(int t)
{
  int time = millis();
  while(millis() - time <= t);
}

Искам линиите между точките да бъдат начертани със закъснение, след известно време с google измислих персонализираната функция за забавяне del(), която няма да работи, защото вътре в цикъла няма да се получи рамка. Някакви идеи как да поправя това?


person ibanes88    schedule 24.06.2014    source източник
comment
Значи всеки път, когато щракнете, искате да бъде начертан следващият ред? Или щракнете веднъж и всички линии се рисуват със закъснение между всяка?   -  person Revive    schedule 24.06.2014
comment
След като щракна, искам всички линии да бъдат начертани със закъснение между всяка.   -  person ibanes88    schedule 24.06.2014


Отговори (1)


Опитайте това: Използвах noLoop, за да спра цикъла на чертане и извиках redraw, за да актуализирам дисплея. Redraw извиква метода draw. Също така за вашата функция del сте коментирали del(10) като забавяне от 10 секунди. Когато всъщност е 10 милисекунди. del(10000) е забавяне от 10 секунди.

 ArrayList pointList;

    String[] temp;
    String[] lines;

    int n;
    int x;
    int y;
    int id;
    int i; //declare i here

    boolean running; //use this to see if draw loop has terminated

    void setup(){
      lines = loadStrings("positions.txt");
      size(400,400);
      pointList = new ArrayList();
      noLoop();
      running=true;
    }

      void draw(){

       if(i < lines.length){ 
       String[] temp = split(lines[i], ',');
          int id_ = id;
          id = int(temp[0]);
          int x_ = x;
          int y_ = y;
          x = int(temp[1]);
          y = int(temp[2]);
          PVector location = new PVector(x,y);
          if (id == id_)
          { 
          if(x_-x>0) stroke(255,0,0,10); else stroke(0,0,255,10); //red lines moving left blue lines moving right
          line(x_,y_,x,y);
          }
          n++;
          println("delay done" + i); // console log after delay with number of loops that passed
          ++i;
          running=true;  //restart loop
       } 
    }

    void mouseReleased(){
      strokeWeight(22);
      i= 0;
      while(i < lines.length){
        if(running){
           println("..........." + i);
           running=false;  //stop the loop until draw completes
           redraw();
           //del(100); //set your delay
        }
      }
    }

    void del(int t)
    {
      int time = millis();
      while(millis() - time <= t);
    }
person Revive    schedule 24.06.2014
comment
това работи добре, благодаря ви за тази хубава идея! Но все още има един малък проблем. Имам списък с около 600 реда от тези координати и вашият код работи добре, докато не поставя моя delay() под 25. Тогава кодът просто се изпълнява до ред 580 и спира. Сега, когато намаля забавянето още повече, да кажем на 15, линиите се обработват само до линия 430 и спира без предупреждение. Случайно да знаете каква може да е причината? Тъй като искам да обработвам списъци много по-дълго в крайна сметка.. Възможно ли е масивът да е ArrayList за такава дължина? - person ibanes88; 24.06.2014
comment
@ibanes88 не, това не е Array/ArrayList. Проблемът изглежда е в паралелността. Цикълът for работи твърде бързо и не изчаква методът за рисуване да завърши, преди да увеличи i. Правилното решение за това би било да се създадат нишки и да се синхронизират извиквания към метода draw, ако искате да разгледате това. Редактирах решението си до такова, което трябва да работи сега с всякаква скорост на забавяне и избягване на този проблем.. Въпреки че моето решение не използва нишки и вероятно не е най-елегантното. - person Revive; 24.06.2014
comment
много благодаря! Не е необходимо да е най-елегантният, напълно разбрах идеята зад проблема - това е перфектно! - person ibanes88; 25.06.2014
comment
С Processing 3.5 тази програма замръзва. Работи само след коментиране на noLoop(), но в този случай не е решение. - person Chupo_cro; 20.01.2021