2017-03-07 50 views
1

我正在处理草图,其中使用二维数组中的点绘制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

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

如果你想在相同的帧速率,但只有在for循环中,而出现一次,使用模数师。处理将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

+0

是否有你使用'frameCount%60 == 1'而不是'frameCount%60 == 0'的原因? –

+0

@KevinWorkman这是我的印象,在调用'draw()'后,'frameCount = 1',所以'frameCount%60 == 1'将允许在draw()的第一次迭代中生成这些点。 – UnknowableIneffable

+0

是的'frameCount'确实从'1'开始。有趣的一点。 –