嵌套 for 循环 - 处理 (java)
nested for loop - Processing (java)
我的任务是绘制一个 10 x 10 轮子的网格。每个都应该是随机颜色,并且像真正的轮子一样有很多辐条。我必须使用嵌套的 for 循环来做到这一点。
我已经找到下面的代码,但出于某种原因,它绘制了一个 10 x 无限网格。我不明白为什么外循环应该只 运行 10 次。
float XPos = 25;
float YPos = 25;
float Radius = 20;
void setup() {
size(500, 500);
}
void draw() {
for (int h = 0; h < 10; h++) {
for (int i = 0; i < 10; i++) {
float RanR = random(250);
float RanG = random(250);
float RanB = random(250);
stroke(RanR, RanG, RanB);
ellipse(XPos, YPos, Radius * 2, Radius * 2);
for (int j = 0; j < 360; j += 10) {
stroke(RanR, RanG, RanB);
line(XPos,
YPos,
XPos + Radius * sin(radians(j)),
YPos + Radius * cos(radians(j))
);
}
XPos += Radius * 2;
}
XPos = 25;
YPos += Radius * 2;
}
}
您的代码看起来不错,只是 draw
必须 可重入 。
也就是说,在第二次被调用时,它应该在相同的位置开始绘制。
因此(除了 Radius),字段应保留在绘制方法的本地。
void draw() {
float XPos = 25;
float YPos = 25;
float Radius = 20;
在真实的 GUI 中,只要必须更新屏幕,就会调用 draw 或 paint 方法。
我的猜测:draw 被调用了不止一次。
顺便说一句。 Java 惯例是对字段、局部变量和方法使用首字母小写:xPos、yPos、radius。
draw()
函数每秒自动调用60次。您将 XPos
和 YPos
变量保存在 draw()
函数之外,因此您在 draw()
函数中对它们所做的任何更改都将在下一次 [=11] =] 被调用。
与其将 XPos
和 YPos
变量保存在草图的顶层,不如在 for 循环中创建它们并将它们基于 h
和 i
:
float Radius = 20;
void setup() {
size(500, 500);
}
void draw() {
for (int h = 0; h < 10; h++) {
for (int i = 0; i < 10; i++) {
float XPos = 25+40*h;
float YPos = 25+40*i;
float RanR = random(250);
float RanG = random(250);
float RanB = random(250);
stroke(RanR, RanG, RanB);
ellipse(XPos, YPos, Radius * 2, Radius * 2);
for (int j = 0; j < 360; j += 10) {
stroke(RanR, RanG, RanB);
line(XPos,
YPos,
XPos + Radius * sin(radians(j)),
YPos + Radius * cos(radians(j))
);
}
}
}
}
请注意,这会导致您的圆圈每秒以随机颜色重新绘制 60 次。您可以使用 randomSeed() 函数每次都获得相同的随机数,或者您可以在 draw()
末尾调用 noLoop()
以便它不会自动再次调用。
我的任务是绘制一个 10 x 10 轮子的网格。每个都应该是随机颜色,并且像真正的轮子一样有很多辐条。我必须使用嵌套的 for 循环来做到这一点。
我已经找到下面的代码,但出于某种原因,它绘制了一个 10 x 无限网格。我不明白为什么外循环应该只 运行 10 次。
float XPos = 25;
float YPos = 25;
float Radius = 20;
void setup() {
size(500, 500);
}
void draw() {
for (int h = 0; h < 10; h++) {
for (int i = 0; i < 10; i++) {
float RanR = random(250);
float RanG = random(250);
float RanB = random(250);
stroke(RanR, RanG, RanB);
ellipse(XPos, YPos, Radius * 2, Radius * 2);
for (int j = 0; j < 360; j += 10) {
stroke(RanR, RanG, RanB);
line(XPos,
YPos,
XPos + Radius * sin(radians(j)),
YPos + Radius * cos(radians(j))
);
}
XPos += Radius * 2;
}
XPos = 25;
YPos += Radius * 2;
}
}
您的代码看起来不错,只是 draw
必须 可重入 。
也就是说,在第二次被调用时,它应该在相同的位置开始绘制。
因此(除了 Radius),字段应保留在绘制方法的本地。
void draw() {
float XPos = 25;
float YPos = 25;
float Radius = 20;
在真实的 GUI 中,只要必须更新屏幕,就会调用 draw 或 paint 方法。
我的猜测:draw 被调用了不止一次。
顺便说一句。 Java 惯例是对字段、局部变量和方法使用首字母小写:xPos、yPos、radius。
draw()
函数每秒自动调用60次。您将 XPos
和 YPos
变量保存在 draw()
函数之外,因此您在 draw()
函数中对它们所做的任何更改都将在下一次 [=11] =] 被调用。
与其将 XPos
和 YPos
变量保存在草图的顶层,不如在 for 循环中创建它们并将它们基于 h
和 i
:
float Radius = 20;
void setup() {
size(500, 500);
}
void draw() {
for (int h = 0; h < 10; h++) {
for (int i = 0; i < 10; i++) {
float XPos = 25+40*h;
float YPos = 25+40*i;
float RanR = random(250);
float RanG = random(250);
float RanB = random(250);
stroke(RanR, RanG, RanB);
ellipse(XPos, YPos, Radius * 2, Radius * 2);
for (int j = 0; j < 360; j += 10) {
stroke(RanR, RanG, RanB);
line(XPos,
YPos,
XPos + Radius * sin(radians(j)),
YPos + Radius * cos(radians(j))
);
}
}
}
}
请注意,这会导致您的圆圈每秒以随机颜色重新绘制 60 次。您可以使用 randomSeed() 函数每次都获得相同的随机数,或者您可以在 draw()
末尾调用 noLoop()
以便它不会自动再次调用。