Java:创建圆形

3

好的,我正在尝试创建一个递归算法,可以生成一系列圆。

目前可以看到,我已经创建了圆形类并尝试使用递归,但是很明显,我对这些内容还比较陌生。

现在,我已经在正确的位置上绘制了所有椭圆,并在每个圆中包含了一个颜色对象。我的目标是让随着圆的产生它们的颜色发生变化,使得每组圆都是一定深度的绿色(如上面的例子所示)。

然而,目前不同深度的绿色被应用于了错误的圆。如下图所示:

如果有人能猜测出这是为什么,我将非常感激。谢谢。

4个回答

2
每次调用createCircles()时,应在中心绘制一个大圆,并递归地调用自身3次以绘制3个较小的圆。 y坐标始终保持不变,可以通过加减原始圆的半径来重新计算x坐标。请保留HTML标签。
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;
}

非常感谢您。 - user3352349
我现在已经更新了我的代码,从数组中绘制圆圈,但遇到了一个新问题:请参见上文。 - user3352349
1
这是因为你总是计算圆的中心点,但paint方法需要传入边界框的左上角点。在绘制时,只需从xy中减去rad即可。 - Warlord

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);
    }
}

我现在已经更新了我的代码,从数组中绘制圆圈,但遇到了一个新问题:请参见上文。 - 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


我现在已经更新了我的代码,从数组中绘制圆圈,但遇到了一个新问题:请参见上文。 - user3352349

1
退出条款:如果圆的半径变得太小而不值得绘制。

我已经更新了我的代码,从数组中绘制圆形,但遇到了一个新问题:请参见上文。 - user3352349
通常应将新问题发布为新问题,以避免使过去的答案无效。 - keshlam
抱歉,我会以新答案的形式发布。 - user3352349

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接