Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Processing 处理:如何仅每x帧绘制一次?_Processing_Minim - Fatal编程技术网

Processing 处理:如何仅每x帧绘制一次?

Processing 处理:如何仅每x帧绘制一次?,processing,minim,Processing,Minim,我正在试验以下代码: //3D Spectrogram with Microphone Input //Modified by kylejanzen 2011 - https://kylejanzen.wordpress.com //Based on script written by John Locke 2011 - http://gracefulspoon.com //Output .DXF file at any time by pressing "r" on the keyboard

我正在试验以下代码:

//3D Spectrogram with Microphone Input
//Modified by kylejanzen 2011 - https://kylejanzen.wordpress.com
//Based on script written 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;
}
我目前试图实现的是减少移动y轴上生成的点的数量。似乎每一帧都会生成一个点。 因此,我的问题相当简单:如何让它仅绘制一次,例如每5帧绘制一次?我就是找不到这个值,它管理着这个


非常感谢

您有三种选择:

选项1:调用函数以减少每秒绘制的帧数

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

void draw(){
  background(0);
  ellipse(mouseX, mouseY, 20, 20);
}
选项2:使用变量和确定X帧已过的时间

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

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

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

void draw(){
  framesElapsed++;

  if(framesElapsed == 5){
    background(0);
    ellipse(mouseX, mouseY, 20, 20);
    framesElapsed = 0;
  }
}
选项3:您可以创建自己的变量来存储经过的帧数

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

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

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

void draw(){
  framesElapsed++;

  if(framesElapsed == 5){
    background(0);
    ellipse(mouseX, mouseY, 20, 20);
    framesElapsed = 0;
  }
}
请注意,对于简单的情况,这只是执行选项2中的模运算符所执行的操作。在这种情况下,模量可能更好。但是,如果你想在不同的时间发生不同的事情,这会很有用。在这种情况下,您将有多个变量跟踪您想要跟踪的任何对象的生命周期


但对于您的示例,选项2可能是最好的选项。

您有三个选项:

选项1:调用函数以减少每秒绘制的帧数

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

void draw(){
  background(0);
  ellipse(mouseX, mouseY, 20, 20);
}
选项2:使用变量和确定X帧已过的时间

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

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

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

void draw(){
  framesElapsed++;

  if(framesElapsed == 5){
    background(0);
    ellipse(mouseX, mouseY, 20, 20);
    framesElapsed = 0;
  }
}
选项3:您可以创建自己的变量来存储经过的帧数

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

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

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

void draw(){
  framesElapsed++;

  if(framesElapsed == 5){
    background(0);
    ellipse(mouseX, mouseY, 20, 20);
    framesElapsed = 0;
  }
}
请注意,对于简单的情况,这只是执行选项2中的模运算符所执行的操作。在这种情况下,模量可能更好。但是,如果你想在不同的时间发生不同的事情,这会很有用。在这种情况下,您将有多个变量跟踪您想要跟踪的任何对象的生命周期


但就您的例子而言,选项2可能是最好的选择。

在将来,请提供一份草图,而不是张贴整个草图。你的问题可以归结为一些简单的问题,比如每X帧在控制台上打印一些东西,所以所有这些额外的代码只会让我们更难帮助你。将来,请提供一个,而不是发布你的整个草图。你的问题可以归结为一些简单的问题,比如每X帧在控制台上打印一些东西,所以所有这些额外的代码只会让我们更难帮助你。包含多个选项的好答案+1包含多个选项的好答案+1