我正在尝试创建相反的方法。一次只有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;第二个循环。
我确信这不是唯一的错误。
谁能看到我出错的地方?
答案 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);
把这些放在一起,你应该拥有它!