【问题标题】:nested for loop - Processing (java)嵌套 for 循环 - 处理 (java)
【发布时间】:2016-01-11 12:30:17
【问题描述】:

我的任务是绘制一个由 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;
    }
}

【问题讨论】:

  • 您必须展示strokeline 这些方法的作用?此外,您还有三个嵌套的 fors,所以简单的数学计算,您有 10*10*36 (360/10)
  • 是的 stroke 决定了线条的颜色。 line 画线。内部 for 循环重复 36 次以绘制辐条,完成后将进入下一个循环
  • 我看不出为什么要打印无限圈,也许你应该发布所有代码,但要小心,只发布你认为重要的代码
  • @JorgeCampos 这是处理,而不是严格的 Java。这些不是用户定义的方法,而是 Processing API 中的方法。

标签: java for-loop processing nested-loops


【解决方案1】:

您的代码看起来不错,除了 draw 必须是可重入。 也就是说,在第二次被调用时,它应该在同一位置开始绘制。

因此(除了半径之外),字段应该保留在 draw 方法的本地。

void draw() {
    float XPos = 25;
    float YPos = 25;
    float Radius = 20;

在真实的 GUI 中,只要必须更新屏幕,就会调用 draw 或 paint 方法。

我的猜测:draw 被多次调用。

顺便说一句。 Java 约定是对字段、局部变量和方法使用首字母小写字母:xPos、yPos、radius。

【讨论】:

  • 怎么调用多次?因为lineellipse 函数调用?
  • 谢谢你明白了,我取出了 void setup 和 void draw 所以代码只运行一次,它给了我一个 10 x 10 的网格。非常感谢
  • "在 setup() 之后直接调用,draw() 函数不断执行其块中包含的代码行,直到程序停止或调用 noLoop()。" – processing.org/reference/draw_.html跨度>
  • 这不是真的。 draw() 函数 not 必须是可重入的。在这种特殊情况下,这是一种可能的解决方案,但 Processing 的 draw() 函数根本不必是可重入的。
【解决方案2】:

draw() 函数每秒自动调用 60 次。您将 XPosYPos 变量保存在 draw() 函数之外,因此您在 draw() 函数中对它们所做的任何更改都将在下次调用 draw() 时保留。

您可以在 for 循环中创建它们并将它们基于 hi,而不是将 XPosYPos 变量保存在草图的顶层:

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(),这样就不会再次自动调用它。

【讨论】:

  • 感谢它也有效并且好多了。我只需要删除draw void,这样代码就不会重复
  • @Will 这可能不是一个好主意。请改用noLoop()
猜你喜欢
  • 2011-05-19
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多