任何人都可以看到我的代码的问题(不能将int转换为boolean)处理

时间:2015-01-14 05:34:24

标签: loops rotation processing

我正在尝试创建相反的方法。一次只有1个可见的圆圈。

http://www.rpdms.com/satillusion/saturation%20illusionc.gif

我调整了我的代码

int nbr_circles = 2;
void setup() {
size(600, 600);
smooth();
background(255);
}

void draw() {
background(255);
float cx = width/2.0;
float cy = height/2.0;
fill(0);
//float x, y; //
for (int i = 0; i < nbr_circles; i++)
{
float angle = i * TWO_PI / nbr_circles;
float x = cx + 110.0 * cos(angle);
float y = cy + 110.0 * sin(angle);
ellipse(x, y, 20, 20);
}
}

void mousePressed() {

if (mouseButton == LEFT) {
if (nbr_circles < 20)
nbr_circles = nbr_circles + 1;

} else if (mouseButton == RIGHT) {
if (nbr_circles > 2)
nbr_circles = nbr_circles - 1;

}
}

到此

int nbr_circles = 1;
void setup() {    
  size(600, 600);
  smooth();
  background(255);
} 

void draw() { 
  float cx = width/2.0;
  float cy = height/2.0;
  fill(0);
  //float x, y; //
  for (int i = 0; i < nbr_circles; i++)
  {  
    float angle = i * TWO_PI / nbr_circles;
    float x = cx + 110.0 * cos(angle);                
    float y = cy + 110.0 * sin(angle);                
    ellipse(x, y, 20, 20);
  }
  for (int i = 0; i = nbr_circles; i++)
  {
    translate (width/2.0, height/2.0);
    rotate (radians());
  }
}

但是得到一个错误说&#39;无法将int转换为boolean&#34;第二个循环。

我确信这不是唯一的错误。

谁能看到我出错的地方?

2 个答案:

答案 0 :(得分:1)

他在行for (int i = 0; i = nbr_circles; i++)中表示=毫无意义,它应该是停止循环的条件,=进行赋值,在这种情况下没有意义。它可能是==但是树没有指向循环...可能你想要一个<。 for循环如下:

      int x = 0                        x < 10                 x = x+1

for(此变量初始化为此数字;而var满足此条件;对该var执行此操作){}

答案 1 :(得分:1)

如果我理解你想要正确完成什么,我认为你甚至不需要第二个循环。使用第一个循环,您已经获得了圆形位置的所有计算,所以现在您只需要弄清楚如何一次只显示一个,是否正确?

上面的评论表明你刚开始使用Processing(可能还有一般的编程),如果我过分解释你已经知道的事情,请原谅我。

这就是我要做的事情:不是在draw()函数中计算每个帧上所有圆的位置,而是可以在setup()中计算它们一次并将位置存储在数组中。 Processing,PVector类中有一个方便的对象,可以用来轻松地将这些位置存储为x和y值。因此,在代码的顶部,在nbr_circles的变量声明之后,您可以声明将存储所有圆位置的PVectors数组,如下所示:

PVector[] circles = new PVector[nbr_circles];

然后你可以将计算圆位置的代码移动到setup()中,而不是在计算点上显示圆圈,而是将值存储在数组中:

void setup() {    
    size(600, 600);
    smooth();
    background(255);

    float cx = width/2.0;
    float cy = height/2.0;
    for (int i = 0; i < nbr_circles; i++)
    {  
        float angle = i * TWO_PI / nbr_circles;
        float x = cx + 110.0 * cos(angle);                
        float y = cy + 110.0 * sin(angle);                
        circles[i] = new PVector(x, y);
    }
}

现在我们已经存储了所有的圆形位置,如果我们想要一次显示它们,我们可以在draw()函数中循环遍历数组,并为每组坐标显示一个圆圈:

for (int i = 0; i < nbr_circles; i++) {
    ellipse(circles[i].x, circles[i].y, 20, 20);
}

但我们真正想做的是每次调用draw()函数时都显示一个圆圈。我们不需要每次都使用for循环来遍历每个数组元素,而只需要选择一个,我们希望那个是在最后一帧中显示的元素之后的那个。我们可以在顶部声明一个计数器变量,用于跟踪应该显示的数组元素:

int counter = 0;

在draw()函数中,我们可以每次递增计数器并将该值用作数组索引。当然,一旦计数器变量变得大于数组中元素的数量,我们就需要将它设置回0.模数运算符(%)可以帮助我们在这里,它基本上返回除以两个数字的余数。现在我们可以简单地将计数器变量增加一次(使用增量运算符,++),并使用模运算符始终从0到(nbr_circles - 1)得到一个数字。这是我的draw()函数:

void draw() { 
    background(255);
    fill(0);

    int i = counter % nbr_circles;
    ellipse(circles[i].x, circles[i].y, 20, 20);
    counter++;
}

你会注意到圈子绕圈很快;这是因为默认的帧速率(每秒调用draw()函数的次数)我相信30.幸运的是,有一个简单的函数你可以在setup()函数内部调用,它将帧速率设置为任何你想要的。如果你想减慢速度,请尝试每秒5帧:

frameRate(5);

把这些放在一起,你应该拥有它!