2016-04-08 21 views
1

Aşağıdaki Kodu deniyorum:İŞLEM: Sadece her x kareyi nasıl çizebilirim?

//3D Spectrogram with Microphone Input 
//Modified by kylejanzen 2011 - https://kylejanzen.wordpress.com 
//Based on script wwritten by John Locke 2011 - http://gracefulspoon.com 

//Output .DXF file at any time by pressing "r" on the keyboard 

import processing.dxf.*; 
import ddf.minim.analysis.*; 
import ddf.minim.*; 
import peasy.*; 

PeasyCam cam; 

FFT fftLin; 
FFT fftLog; 

Waveform audio3D; 

Minim minim; 
AudioInput microphone; 

boolean record; 

PFont font; 

float camzoom; 
float maxX = 0;float maxY = 0;float maxZ = 0; 
float minX = 0;float minY = 0;float minZ = 0; 

void setup() 
{ 
    size(1250,750,P3D); //screen proportions 
    noStroke(); 
    minim = new Minim(this); 
    microphone = minim.getLineIn(Minim.STEREO, 4096); //repeat the song 

    cam = new PeasyCam(this, 0, 0, 0, 50); 
    cam.setMinimumDistance(50); 
    cam.setMaximumDistance(500); 

    background(255); 

    fftLog = new FFT(microphone.bufferSize(),microphone.sampleRate()); 
    fftLog.logAverages(1,2); //adjust numbers to adjust spacing; 
    float w = float (width/fftLog.avgSize()); 
    print(fftLog.avgSize()); 
    float x = w; 
    float y = 0; 
    float z = 10; 
    float radius = 100; 
    audio3D = new Waveform(x,y,z,radius); 
} 
void draw() 

{ 
    background(0); 
    // ambientLight(102,102,102); 

    if (frameCount>0) 
    { 
    for(int i = 0; i < fftLog.avgSize(); i++){ 
     float zoom = 1; 
     float jitter = (fftLog.getAvg(i)*2); 
     //println(jitter); 
     PVector foc = new PVector(audio3D.x+jitter, audio3D.y+jitter, 0); 
     PVector cam = new PVector(zoom, zoom, -zoom); 
     // camera(foc.x+cam.x+50,foc.y+cam.y+50,foc.z+cam.z+100,foc.x+30,foc.y+30,foc.z+100,0,0,1); 
    } 
    } 
    //play the song 
    fftLog.forward(microphone.mix); 

    audio3D.update(); 
    // audio3D.textdraw(); 

    if(record) 
    { 
    beginRaw(DXF, "output.dxf"); 
    } 
    audio3D.plotTrace(); 

    if(record) 
    { 
    endRaw(); 
    record = false; 
    println("It's Done Bitches! Find your DXF!"); 
    } 
} 
void stop() 
{ 
    // always close Minim audio classes when you finish with them 
    microphone.close(); 
    // always stop Minim before exiting 
    minim.stop(); 
    super.stop(); 
} 
class Waveform 
{ 
    float x,y,z; 
    float radius; 

    PVector[] pts = new PVector[fftLog.avgSize()]; 

    PVector[] trace = new PVector[0]; 

    Waveform(float incomingX, float incomingY, float incomingZ, float incomingRadius) 
    { 
    x = incomingX; 
    y = incomingY; 
    z = incomingZ; 
    radius = incomingRadius; 
    } 
    void update() 
    { 
    plot(); 
    } 
    void plot() 
    { 
    for(int i = 1; i < fftLog.avgSize(); i++) 
    { 
     int w = int(width/fftLog.avgSize()); 

     x = i*w; 
     y = frameCount*5; // CHANGE THE SPEED 
     z = height/4-fftLog.getAvg(i)*4; //change multiplier to reduces height default '10' 

     stroke(0); 
     point(x, y, z); 
     pts[i] = new PVector(x, y, z); 
     //increase size of array trace by length+1 
     trace = (PVector[]) expand(trace, trace.length+1); 
     //always get the next to last 
     trace[trace.length-1] = new PVector(pts[i].x, pts[i].y, pts[i].z); 
    } 
    } 
    /* void textdraw() 
    { 
    for(int i =0; i<fftLog.avgSize(); i++){ 
     pushMatrix(); 
     translate(pts[i].x, pts[i].y, pts[i].z); 
     rotateY(PI/2); 
     rotateZ(PI/2); 

     fill(255,255); 
     text(round(fftLog.getAvg(i)*100),0,0,0); 
     popMatrix(); 
    } 
    } */ 
    void plotTrace() 
    { 
    stroke(255,100); 
    int inc = fftLog.avgSize(); 

    for(int i=1; i<trace.length-inc; i++) 
    { 
     if(i%inc != 0) 
     { 
     beginShape(POINTS); 
     strokeWeight(2); 
     fill(0, 0, 0, 100); 
     vertex(trace[i].x, trace[i].y, trace[i].z); 
     vertex(trace[i-1].x, trace[i-1].y, trace[i-1].z); 
     vertex(trace[i+inc].x, trace[i+inc].y, trace[i+inc].z); 
     vertex(trace[i-1+inc].x, trace[i-1+inc].y, trace[i-1+inc].z); 
     endShape(CLOSE); 
     } 
    } 
    } 
} 
void keyPressed() 
{ 
    if (key == 'r') record = true; 
} 

Ne anda ulaşmak için deneyin (hareketli) (y) ekseni üzerinde oluşturulan noktalarının sayısını azaltmaktır. Şu anda her çerçeve, bir nokta üretilir gibi görünüyor. Benim sorum bu yüzden oldukça basittir: Sadece örnek olarak çizmesine nasıl izin verebilirim? her 5 karede Bunu yöneten değeri bulamıyorum.

Çok teşekkür ederim.

+0

Gelecekte, tüm taslağınızı göndermek yerine lütfen bir [mcve] belirtin. Sorunuz, her X karede konsola bir şey yazdırmak gibi basit bir şeye kadar kaynatılabilir, bu yüzden bu ekstra kodun tümü size yardımcı olmak için bizi zorlaştırır. –

cevap

3

Üç seçeneğiniz var:

Seçenek 1: saniyede çizilmelerinden kare sayısını azaltmak için frameRate() işlevini çağırın.

void setup(){ 
    size(500, 500); 
    frameRate(5); 
} 

void draw(){ 
    background(0); 
    ellipse(mouseX, mouseY, 20, 20); 
} 

Seçenek 2: X kare geçtikten zaman kullanımı frameCount değişken ve modulus % operator belirlenmesi.

void setup(){ 
    size(500, 500); 
} 

void draw(){ 
    if(frameCount % 5 == 0){ 
    background(0); 
    ellipse(mouseX, mouseY, 20, 20); 
    } 
} 

Seçenek 3: Sen geçtikten kare sayısını saklayan kendi değişken oluşturabilir.

int framesElapsed = 0; 

void setup(){ 
    size(500, 500); 
} 

void draw(){ 
    framesElapsed++; 

    if(framesElapsed == 5){ 
    background(0); 
    ellipse(mouseX, mouseY, 20, 20); 
    framesElapsed = 0; 
    } 
} 

Basit bir durum için, bu seçenek 2'deki modül operatörünün yaptıklarını unutmayın. Bu durumda, modül muhtemelen daha iyidir. Fakat bu, örneğin, farklı zamanlarda gerçekleşmesi gereken farklı şeylerin olması durumunda yararlı olur. Bu durumda, izlemek istediğiniz her şeyin "ömrünü" takip eden çok sayıda değişkeniniz olur.

Örneğiniz için, seçenek 2 muhtemelen en iyi seçenektir.

+1

Çeşitli seçenekleri kapsayan güzel cevap (+1) –

İlgili konular