2015-10-13 160 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()'。 –