2017-03-07 12 views
1

2次元配列の点を使用してドロネー図を描画する処理スケッチで作業しています。 ランダムに配列内の点を生成するので、draw()ループが実行されるので、非常に迅速に生成されています。処理中のインターバルで関数を実行

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

私はこれらの数字に例えば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; 
    } 
} 

私の究極の目標は、古いものとの間のシフトラインを持っていることです...私は次のコードを使用してみましたが、ラインは非常に短い時間のためにだけ1秒ごとに描かれている、との間隔が変化するように思えます新しいポイントが生成されます。私はイージーを使いたいので、全体が素敵で滑らかに見えます。

ここにコード全体があります。私は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ループを1回だけ発生させる場合は、モジュラス除算を使用します。処理には、という変数としてdraw()ループが呼び出された回数が格納されます。あなたはそのようなあなたのループが唯一の1秒に1回呼び出されたことを確認するためにそうように弾性率が分裂を使用することができます。

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 == 0'の代わりに' frameCount%60 == 1'を使用した理由はありますか? –

+0

@KevinWorkman 'draw()'、 'frameCount = 1'を呼び出した後、' frameCount%60 == 1 'とすると、 'draw()'の最初の繰り返しでポイントが生成されるという印象でした。 – UnknowableIneffable

+0

うん、 'frameCount'は' 1'で始まります。興味深い点。 –

関連する問題