在处理

时间:2017-03-07 00:05:26

标签: processing intervals mesh timing easing

我正在处理一个Processing sketch,其中使用二维数组中的点绘制Delaunay图。 我随机生成数组中的点,所以现在它们在draw()循环运行时非常快速地生成。

for(int i = 0; i < points.length; i++){
  pX = random(nX);
  pY = random(nY);
  points[i][0] = pX;
  points[i][1] = pY;
}

我想每隔1秒生成这些数字。我尝试使用以下代码,但是每1秒钟只绘制一段非常短的时间,并且间隔似乎有所不同......

if (millis() - timeCheck > timeInterval){
  for(int i = 0; i < points.length; i++){
    timeCheck = millis();

    pX = random(nX);
    pY = random(nY);

    points[i][0] = pX;
    points[i][1] = pY;
  }
}

我的最终目标是在生成新点和新点之间切换线。我想使用缓和,所以整个事情看起来很顺利。

这是整个代码。我使用mesh library绘制网格。

import megamu.mesh.*;
import processing.svg.*;
import processing.pdf.*;

  boolean recording = false;
  void rec() {
    if (key == 'r' || key == 'R') {
      recording = !recording;
    }
  }

  float numX;
  float numY;

  float x;
  float y;

  float offset = 0.00;
  float easing = 0.05;

  Delaunay myDelaunay ;

  int timeCheck;
  int timeInterval = 1000;

void setup(){

  size(600,400);

  timeCheck = millis();

}

void draw(){

  rec();
  if (recording){
    beginRecord(SVG, "####.svg");
  }

  offset = offset + .005;
  background(noise(offset) * 50);
  stroke((noise(offset) * 255)+100, (noise(offset) * 100)+50, noise(offset) * 255);

  float[][] points = new float[10][2];

  numX = (width);
  numY = (height);

  float nX = noise(offset) * width;
  float pX = random(nX);
  float targetX = random(nX);
  float dX;

  float nY = noise(offset) * height;
  float pY = random(nY);
  float targetY = random(nY);
  float dY;

  if (millis() - timeCheck > timeInterval){
    for(int i = 0; i < points.length; i++){
      timeCheck = millis();
      //println(timeCheck);

      pX = random(nX);
      pY = random(nY);

      points[i][0] = pX;
      points[i][1] = pY;

    }
  }

  myDelaunay = new Delaunay( points );

  float[][] myEdges = myDelaunay.getEdges();

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

      dX = targetX - pX;
      x += dX * easing;
      dY = targetY - pY;
      y += dY * easing;

      float startX = myEdges[i][0];
      float startY = myEdges[i][1];
      float endX = myEdges[i][2];
      float endY = myEdges[i][3];
      line( startX, startY, endX, endY );
      ellipse(startX, startY, 5, 5);
  }

  endRecord();

}

1 个答案:

答案 0 :(得分:0)

如果你想减慢调用整个绘制循环的速度,frameRate()就是你的朋友。它接受一个整数参数作为调用绘制循环的每秒的次数。默认为60,但调用可以将其更改为您想要的任何内容。我只是把它放在这里,这就是你想要的。

如果您想要相同的帧速率,但只需要偶尔发生一次for循环,请使用模数除法。 Processing将draw()循环调用的次数存储为名为frameCount的变量。你可以像这样使用模数除法,使你的循环每秒只调用一次:

if(frameCount % 60 == 1){//such that you generate the values on frame 1, and every 60th frame after that, assumes the frame rate is 60 fps.
    for(int i = 0; i < points.length; i++){
        pX = random(nX);
        pY = random(nY);
        points[i][0] = pX;
        points[i][1] = pY;
    }
}

有关frameRate()的更多信息的链接是here