谁能看到我的代码的问题(无法将 int 转换为布尔值)处理
Can anyone see the issue with my code (cannot convert int to boolean) 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());
}
}
但是在第二个 for 循环中收到错误提示“无法将 int 转换为布尔值”。
我相信这不是唯一的错误。
谁能看出我错在哪里?
他的意思是在for (int i = 0; i = nbr_circles; i++)
行中=
没有意义,应该是停止循环的条件,=
进行赋值,这在这个案例。它可能是 ==
但这样循环就没有意义了……可能你想要一个 <
代替。 for 循环如下:
int x = 0 x < 10 x = x+1
for(这个变量初始化为这个数字;当那个 var 满足这个条件时;对那个 var 这样做){}
如果我能正确理解您要完成的任务,我认为您甚至不需要第二个 for 循环。在第一个循环中,您已经完成了圆圈位置的所有计算,所以现在您只需要弄清楚如何一次只显示一个,对吗?
您上面的评论表明您刚刚开始使用 Processing(可能还有一般的编程),所以如果我对您已经知道的事情解释过多,请原谅我。
我会这样做:您可以在 setup() 中计算一次并将位置存储在数组中,而不是在 draw() 函数中计算每一帧上所有圆圈的位置。 Processing 中有一个方便的对象,即 PVector class,可用于轻松地将这些位置存储为 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。模运算符 (%) 可以帮助我们解决这个问题,它基本上是 returns 的余数除以两个数字。现在我们可以简单地每次通过(使用增量运算符 ++)将计数器变量加一,并使用模运算符始终获得从 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);
把这些放在一起,你应该拥有它!
我正在尝试创建相反的结果。一次只有 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());
}
}
但是在第二个 for 循环中收到错误提示“无法将 int 转换为布尔值”。
我相信这不是唯一的错误。
谁能看出我错在哪里?
他的意思是在for (int i = 0; i = nbr_circles; i++)
行中=
没有意义,应该是停止循环的条件,=
进行赋值,这在这个案例。它可能是 ==
但这样循环就没有意义了……可能你想要一个 <
代替。 for 循环如下:
int x = 0 x < 10 x = x+1
for(这个变量初始化为这个数字;当那个 var 满足这个条件时;对那个 var 这样做){}
如果我能正确理解您要完成的任务,我认为您甚至不需要第二个 for 循环。在第一个循环中,您已经完成了圆圈位置的所有计算,所以现在您只需要弄清楚如何一次只显示一个,对吗?
您上面的评论表明您刚刚开始使用 Processing(可能还有一般的编程),所以如果我对您已经知道的事情解释过多,请原谅我。
我会这样做:您可以在 setup() 中计算一次并将位置存储在数组中,而不是在 draw() 函数中计算每一帧上所有圆圈的位置。 Processing 中有一个方便的对象,即 PVector class,可用于轻松地将这些位置存储为 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。模运算符 (%) 可以帮助我们解决这个问题,它基本上是 returns 的余数除以两个数字。现在我们可以简单地每次通过(使用增量运算符 ++)将计数器变量加一,并使用模运算符始终获得从 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);
把这些放在一起,你应该拥有它!