在绑定循环中创建一行图像?
Create a row of images in a bound loop?
所以我有一排 3 个茶杯,我想在单个 for 循环中生成它们。根据 'count' 的值,它将显示 PImage "emptyCup" 或 "fullCup"。代码大部分工作,但行的图形顺序不是我想要的。
这里是循环的简要说明。
int count = 2;
int width = 210;
int length = 180;
for (int i = 1; i <= 3; i++) {
if (i <= 3) {
length = length1;
} else if ((3 <= i) && (i <= 6)) {
length = length2;
} else {
length = length3;
}
if ((i <= count)) {
image(fullCup, (width * (i % 3)), length);
println("FULL CUP: Count = " + count + ", i = " + i);
} else {
println("EMPTY CUP: Count = " + count + ", i = " + i);
image(emptyCup, (width * (i % 3)), length);
}
}
下面应该给我以下输出,其中 [o] 是满杯,[ ] 是空杯:
[o] [o] [ ]
相反,它给了我这个:
[ ] [o] [o]
同样,如果我将 "count" 更改为 4,并继续 for 循环到 6,那么我会得到:
[o] [o] [o]
[ ] [o] [ ]
我知道我对模数运算符的使用并没有得到我想要的结果,但我无法确定我应该说什么。有什么建议吗?
我希望你现在已经找到答案了,不过我还是会回答的。
这是一个典型的错误编程习惯导致的错误案例。你可能是新手,我并不是说这个不好,但你可以从中学习 ;)
首先,'width'和'length'是Processing中的关键字,不应该赋值,只能读出。
其次,除非有特定原因,否则习惯从 0 开始 for 循环。这是因为计算机的工作方式以及它使其余代码中的逻辑更容易。例如模数。
这也是你的代码的错误。
- 第一个杯子绘制在 x = width*(1%3) = width
- 第二个杯子绘制在x = width*(2%3) = 2*width
- 第三个杯子绘制在x = width*(3%3) = 0*width=0
使用的逻辑并没有错,而是基于从0开始的for循环。
此代码可以满足您的需求。它在 x=0 和 y=0 处绘制第一张图像。如有必要,您可以添加偏移量。
void setup() {
PImage fullCup = loadImage("fullCup.jpg");
PImage emptyCup = loadImage("emptyCup.jpg");
size(800, 800);
int count = 4;
int numberOfCups = 6;
int img_width = 210;
int img_length = 180;
for (int i = 0; i < numberOfCups; i++) {
if (i < count) {
image(fullCup, img_width * (i % 3), img_length*(i/3));
} else {
image(emptyCup, img_width * (i % 3), img_length*(i/3));
}
}
}
所以我有一排 3 个茶杯,我想在单个 for 循环中生成它们。根据 'count' 的值,它将显示 PImage "emptyCup" 或 "fullCup"。代码大部分工作,但行的图形顺序不是我想要的。
这里是循环的简要说明。
int count = 2;
int width = 210;
int length = 180;
for (int i = 1; i <= 3; i++) {
if (i <= 3) {
length = length1;
} else if ((3 <= i) && (i <= 6)) {
length = length2;
} else {
length = length3;
}
if ((i <= count)) {
image(fullCup, (width * (i % 3)), length);
println("FULL CUP: Count = " + count + ", i = " + i);
} else {
println("EMPTY CUP: Count = " + count + ", i = " + i);
image(emptyCup, (width * (i % 3)), length);
}
}
下面应该给我以下输出,其中 [o] 是满杯,[ ] 是空杯:
[o] [o] [ ]
相反,它给了我这个:
[ ] [o] [o]
同样,如果我将 "count" 更改为 4,并继续 for 循环到 6,那么我会得到:
[o] [o] [o]
[ ] [o] [ ]
我知道我对模数运算符的使用并没有得到我想要的结果,但我无法确定我应该说什么。有什么建议吗?
我希望你现在已经找到答案了,不过我还是会回答的。
这是一个典型的错误编程习惯导致的错误案例。你可能是新手,我并不是说这个不好,但你可以从中学习 ;)
首先,'width'和'length'是Processing中的关键字,不应该赋值,只能读出。
其次,除非有特定原因,否则习惯从 0 开始 for 循环。这是因为计算机的工作方式以及它使其余代码中的逻辑更容易。例如模数。
这也是你的代码的错误。
- 第一个杯子绘制在 x = width*(1%3) = width
- 第二个杯子绘制在x = width*(2%3) = 2*width
- 第三个杯子绘制在x = width*(3%3) = 0*width=0
使用的逻辑并没有错,而是基于从0开始的for循环。
此代码可以满足您的需求。它在 x=0 和 y=0 处绘制第一张图像。如有必要,您可以添加偏移量。
void setup() {
PImage fullCup = loadImage("fullCup.jpg");
PImage emptyCup = loadImage("emptyCup.jpg");
size(800, 800);
int count = 4;
int numberOfCups = 6;
int img_width = 210;
int img_length = 180;
for (int i = 0; i < numberOfCups; i++) {
if (i < count) {
image(fullCup, img_width * (i % 3), img_length*(i/3));
} else {
image(emptyCup, img_width * (i % 3), img_length*(i/3));
}
}
}