处理 - 变量'i'不存在?

时间:2016-11-22 14:34:10

标签: processing

我试图找到一个类似的错误,以避免问一个已经重复的问题,但我找不到任何东西。我为代码很长而道歉。如果有人能向我解释我做错了什么,我会非常感激。提前谢谢。

// Physical Constants
float g=-9.81; // Gravity
float k=0.0; // Friction const (Try 0.02)
float m=0.25; // Mass kg
float dt=0.01; // Time step 10ms
// Boundary (starting) conditions
float vy=0; // Initial vertical velocity
float y=0.9; // Initial vertical position
float x=0; // Initial horizontal position
float vx=0.8; // Initial horizontal velocity
float t=0; // Initial time

Ball [] b;

void setup()
{
 b=new Ball[50];

 for(int i=0;i<50;i++)
 {
 b[i]=new Ball();
 }

 size(500, 500);
}
void draw()
{
 background(255);

 for(int i=0;i<50;i++)
 {
 b[i].advance();
 b[i].draw_ball();
 }
}

int Collision(int j,Ball b[])
{
 int res=-1;
 for(int i=0;i<50;i++)
 {
 if (i!=j)
 {
 float sep=sqrt(pow(b[i].x-b[j].x,2)+pow(b[i].y-b[j].y,2));
 float rads=b[i].radius+b[j].radius;
 if(sep<rads){ res=i;}
 }
 }
 return(res);
}


class Ball
{
  color c;
  float radius;
  float vy;
  float y;
  float x;
  float vx;
  float t;

  Ball()
   {
 y=random(0.1,0.9);
 vy=random(-1,1);
 x=random(0.1,0.9);
 vx=random(-1,1);
 c=color(random(255),random(255), random(255));
 radius = 0.01+random(0.04);
 t=0;
 }
  void advance()
 {
 vy=vy+(g-((k/m)*vy))*dt;
 y=y+(vy*dt);
 vx=vx+(-((k/m)*vx))*dt;
 x=x+(vx*dt);
 t=t+dt;
 if (y<=0) {vy=-vy; y=y+(vy*dt);}
 if (x<=0) {vx=-vx; x=x+(vx*dt);}
 if (x>=1) {vx=-vx; x=x+(vx*dt);}
 }
{
   b[i].advance();

 int r=Collision(i,b); // Check if ball i collides with any balls in array b
 if(r!=-1) // -1 means no collision, r is index that identifies ball in b
 {
 float nvxj = (b[i].vx * (b[i].radius - b[r].radius) + (2 * b[r].radius * b[r].vx)) /
(b[i].radius + b[r].radius);
 float nvyj = (b[i].vy * (b[i].radius - b[r].radius) + (2 * b[r].radius * b[r].vy)) /
(b[i].radius + b[r].radius);
 float nvxr = (b[r].vx * (b[r].radius - b[i].radius) + (2 * b[i].radius * b[i].vx)) /
(b[i].radius + b[r].radius);
 float nvyr = (b[r].vy * (b[r].radius - b[i].radius) + (2 * b[i].radius * b[i].vy)) /
(b[i].radius + b[r].radius);

 b[i].vx=nvxj;
 b[i].vy=nvyj;
 b[r].vx=nvxr;
 b[r].vy=nvyr;
 }

 b[i].draw_ball();


  void draw_ball()
 {
 float sx=map(x,0,1,0,width);
 float sy=map(y,0,1,height-1,0);
 float rx=map(radius,0,1,0,width);
 float ry=map(radius,0,1,0,height);
 fill(c);
 ellipse(sx,sy,2*rx,2*ry);
 }

}

1 个答案:

答案 0 :(得分:1)

如果你修复了缩进,你会有更好的运气,这样你就可以更好地匹配{ }大括号。

你有一个advance()函数,但是在函数结束后(找到匹配的结束大括号),你就得到了这个断开连接的代码片段:

{
    b[i].advance();

    int r=Collision(i, b); // Check if ball i collides with any balls in array b
    if (r!=-1) // -1 means no collision, r is index that identifies ball in b
    {
      float nvxj = (b[i].vx * (b[i].radius - b[r].radius) + (2 * b[r].radius * b[r].vx)) /
        (b[i].radius + b[r].radius);
      float nvyj = (b[i].vy * (b[i].radius - b[r].radius) + (2 * b[r].radius * b[r].vy)) /
        (b[i].radius + b[r].radius);
      float nvxr = (b[r].vx * (b[r].radius - b[i].radius) + (2 * b[i].radius * b[i].vx)) /
        (b[i].radius + b[r].radius);
      float nvyr = (b[r].vy * (b[r].radius - b[i].radius) + (2 * b[i].radius * b[i].vy)) /
        (b[i].radius + b[r].radius);

      b[i].vx=nvxj;
      b[i].vy=nvyj;
      b[r].vx=nvxr;
      b[r].vy=nvyr;
    }

    b[i].draw_ball();


    void draw_ball()
    {
      float sx=map(x, 0, 1, 0, width);
      float sy=map(y, 0, 1, height-1, 0);
      float rx=map(radius, 0, 1, 0, width);
      float ry=map(radius, 0, 1, 0, height);
      fill(c);
      ellipse(sx, sy, 2*rx, 2*ry);
    }
  }

这里有很多事情要发生。这样的{ }大括号内的代码块不是语法错误,但是我不确定你期望这段代码做什么,或者你希望它运行的时候。但是,您的错误是由于您在此代码中使用了i变量而未定义的。

尽管如此,在{ }大括号内定义函数是一种语法错误。

要解决您的问题,您需要退一步,真正考虑这段代码所属的位置。