2014-03-04 59 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