2012-10-18 101 views
1

我試圖通過在正方形中隨機選擇一個點並通過它畫兩條線,然後將每個象限分成4個等等,直到將方形分成4個小象限,直到寬度/高度爲1,以遞歸的方式。我的代碼是在這裏:遞歸地劃分正方形區域

public static void draw(int x0, int y0, int xmax, int ymax) { 

if (Math.abs(xmax - x0) > 1 && Math.abs(ymax - y0) > 1) { 
    int rx = r.nextInt(xmax - 1) + 1; // line A 
    int ry = r.nextInt(ymax - 1) + 1; // line B 

    StdDraw.line(rx, y0, rx, ymax); 
    StdDraw.line(x0, ry, xmax, ry); 

    draw(x0, y0, rx, ry);  // line C 
    draw(x0, ry, rx, ymax);  // line D 
    draw(rx, ry, xmax, ymax); // line E 
    draw(rx, y0, xmax, ry);  // line F 
} 
else ; 

也就是說,我傳遞左下角座標(X0,Y0)和右上角座標(XMAX,YMAX)。每當我註釋掉D,E和F行時,一切正常。但是當我取消註釋D,E或F時,我得到這個錯誤java.lang.IllegalArgumentException: n must be positive,通常指向A行或B行。有人可以告訴我這個錯誤意味着什麼以及我如何解決它?

+0

常(XMAX ,yMax)是左上角,(x2,y2)是右下角。 –

+0

@ColinD你是什麼意思「通常?」我認爲它不重要,因爲我控制了繪製線的起點和終點 – yiwei

+0

我錯誤地編輯了我的註釋,它應該讀取(x0,y0),然後是(xMax,yMax)。我只是想指出,爲了使用圖形庫,您的座標可能需要翻譯。另外,由於代碼片段沒有清楚地標識出您正在使用哪個API,它可能是問題的一部分。 –

回答

2

這是因爲在遞歸過程中,在nextInt - >(xmax - 1)中傳遞的值正在變爲負值。

r.nextInt(xmax - 1); 

如果(xmax - 1)爲負數,您將會得到例外。因爲,nextInt()方法僅需要positive值。

  • 您可以在此行之前添加一個額外的檢查,以檢查您的差異是否爲正數或負數是否爲 。因此,你可以跳過這部分代碼 。