【问题标题】:Processing - The variable 'i' does not exist?处理 - 变量“i”不存在?
【发布时间】:2016-11-22 22:40:03
【问题描述】:

我已尝试找到与我类似的错误以避免提出已经重复的问题,但我找不到任何东西。我很抱歉代码很长。如果有人可以向我解释我做错了什么,我将不胜感激。提前致谢。

// 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);
 }

}

【问题讨论】:

  • 哪一行给你这个错误?

标签: processing


【解决方案1】:

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

你有一个advance() 函数,但在该函数结束后(找到匹配的右花括号),你得到了这段不连贯的sn-p代码:

{
    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 变量。

不过,在 { } 大括号内定义函数是语法错误。

要解决您的问题,您需要退后一步,认真考虑这部分代码的归属。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2012-06-22
    • 2017-12-17
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多