обработка: рисование линий с задержкой внутри цикла

Я хочу отображать пути из внешнего файла .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 вызывает метод рисования. Также для вашей функции 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 выполняется слишком быстро и не ожидает завершения метода draw перед увеличением значения i. Правильным решением этого было бы создание потоков и синхронизация вызовов метода рисования, если вы хотите изучить это. Я отредактировал свое решение на такое, которое теперь должно работать с любой скоростью задержки и избежать этой проблемы. Хотя мое решение не использует потоки и, вероятно, не самое элегантное. - person Revive; 24.06.2014
comment
большое тебе спасибо! Это не должно быть самым элегантным, я полностью понял идею проблемы - это прекрасно! - person ibanes88; 25.06.2014
comment
При обработке 3.5 эта программа зависает. Это работает только после комментирования noLoop(), но в этом случае это не решение. - person Chupo_cro; 20.01.2021