2015-10-13 182 views
2

我的任务是绘制一个10 x 10的车轮网格。每个应该是一个随机的颜色,并有像真正的车轮很多的辐条。我必须使用嵌套for循环来做到这一点。嵌套for循环 - 处理(java)

我得到了下面的代码,但由于某种原因,它绘制了一个10×无限网格。我不明白为什么外层循环只能运行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; 
    } 
} 
+2

你必须展示这些方法'stroke'和'line'做什么?你也有三个嵌套'for's,所以在一个简单的数学中你有10 * 10 * 36(360/10) –

+0

是笔画决定线的颜色。线画线。内循环重复36次绘制辐条,当它完成它将移动到下一个cirlce – Will

+0

我看不出为什么打印无限圆,也许你应该张贴所有的代码,但要小心,只发布代码,你认为是重要的 –

回答

0

你的代码看起来很好,但draw必须折返。 也就是说,第二次被调用时,它应该开始在相同的位置绘图。

所以(除了半径),这些字段应该保持在绘制方法的本地。

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

在真正的GUI中,只要必须更新屏幕,就会调用绘图或绘画方法。

我的猜测:绘制被称为不止一次。

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

+0

它是如何被称为多次?由于'线路'或'椭圆'函数调用? –

+0

谢谢你明白了,我拿出了void set和void draw,所以代码只运行一次,它给了我一个10 x 10的网格。非常感谢 – Will

+0

“在setup()之后直接调用,draw()函数连续执行块中包含的代码行,直到程序停止或调用noLoop()。” - https://processing.org/reference/ draw_.html –

2

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

而不是在草图的顶级保存XPosYPos变量,你可以在你的内部创建它们环和底座不送的hi

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(),以便它不会再自动调用。

+0

谢谢你的工作,并且更好。我只需要删除draw void就可以了,所以代码不会重复 – Will

+0

@Will这可能不是一个好主意。改用'noLoop()'。 –