2014-03-04 103 views
3

好了,所以我正在嘗試創建一個遞歸算法,從而生成一系列圈子。Java:創建圈子

目前可以看出,我已經創建了圓類,並試圖使用遞歸,但正如你可能會告訴我,對於所有這些我都是新手。

現在已經在正確的位置繪製了所有的橢圓,我在每個圓圈中都包含了一個Color對象。我的目標是使它能夠隨着圓圈的生成而改變顏色,每一組圓圈都有一定的綠色(如上例所示)。

然而,目前,綠色的陰影應用於不正確的圓圈。如下所示:

如果有人能夠冒險猜測爲什麼會發生這種情況,我將非常感激。謝謝。

回答

2

createCircles()每次調用應該繪製在中心一個大圈,並調用自身遞歸3次,3米較小的圓。 y座標始終保持不變,您可以通過添加和減去原始圓的半徑來重新計算座標。

public void createCircles(int x, int y, int rad) { 

    Circle myCircle = new Circle(x, y, rad); 
    circles.add(myCircle); 

    createCircles(x - (2*rad), y, rad/3); 
    createCircles(x, y, rad/3); 
    createCircles(x + (2*rad), y, rad/3); 
} 

對於您可以設置的rad大小終止條件的溢出錯誤,像

if (rad < 5) { 
    return; 
} 
+0

非常感謝。 – user3352349

+0

我已經更新了我的代碼,以便從數組中繪製圓,但遇到了一個新問題:請參見上文。 – user3352349

+1

這是因爲你總是計算圓的中心點,但'paint'方法需要在邊界框的左上角。繪畫時只需從'x'和'y'中減去'rad'。 – Warlord

1

退出條款:如果圓半徑變得太小,不值得畫。

+0

我現在已經更新了我的代碼,從數組繪製圓,但也遇到了新的問題:見上面 – user3352349

+0

新的問題,一般應張貼新問題,以避免過去的答案無效。 – keshlam

+0

道歉,將發佈爲新答案。 – user3352349

1

我明白,目前我得到一個溢出錯誤,因爲 我沒有退出子句的遞歸。

遞歸算法確實需要終止條件。

在您的情況下,您不希望在圓圈足夠小時繼續遞歸。所以基本上你只需換三個遞歸調用你在這裏:

createCircles(myX, y, myRad); 
    createCircles(myX, y, myRad); 
    createCircles(myX, y, myRad); 

弄成這個樣子(未經測試,但它應該讓你開始):

if (myRad > 0) { 
     createCircles(myX, y, myRad); 
     createCircles(myX, y, myRad); 
     createCircles(myX, y, myRad); 
    } 

因爲它沒有任何意義,以保持繪製半徑爲零的圓。

下面是關於終止條件維基百科條目:

http://en.wikipedia.org/wiki/Recursion_termination

+0

我現在更新了我的代碼,從數組中繪製圓,但遇到了一個新問題:請參閱上面的 – user3352349

2

你需要一個基本情況。這就像遞歸的退出方法。在你的情況下,createCircles方法無限重複,這就是爲什麼它會產生溢出異常。嘗試這個。

public void createCircles(int x, int y, int rad){ 

    int myX = x/3; 
    int myRad = rad/3; 

    if(rad != 0){ 
     Circle myCircle = new Circle(myX, y, myRad); 
     circles.add(myCircle); 
     createCircles(myX, y, myRad); 
     createCircles(myX, y, myRad); 
     createCircles(myX, y, myRad); 
    } 
} 
+0

我已經更新了我的代碼,以從數組中繪製圓,但遇到了一個新問題:請參見上面 – user3352349