在绑定循环中创建一行图像?

时间:2018-11-22 12:54:52

标签: image for-loop processing modulus

因此,我想在一个for循环中生成3行茶杯。根据'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] [ ]

我知道我对模运算符的使用并没有得到我想要的东西,但是我不能将我的手指放在应该说的地方。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

希望您现在已经找到答案,但是我还是会回答。

这是由不良的编程习惯引起的错误的经典案例。您可能对此感到陌生,但我并不是说这很不好,但是您可以从中学到;)

首先,“宽度”和“长度”是Processing中的关键字,不应分配它们,而只能读出。

第二,除非有特殊原因,习惯上将for循环从0开始。这是因为计算机的工作方式,并且它使其余代码中的逻辑更容易。例如模数。

这也是您的代码错误。

  • 第一个杯子在x =宽度*(1%3)=宽度处绘制
  • 第二个杯子以x = width *(2%3)= 2 * width绘制
  • 第三个杯子以x =宽度*(3%3)= 0 *宽度= 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));
    }
  }
}