我正在处理一个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();
}
答案 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。