Java:创建圈子

时间:2014-03-04 00:36:18

标签: java user-interface recursion graphics geometry

好的,所以我正在尝试创建一个递归算法,这会产生一系列圆圈。

目前我可以看到我创建了圆类并试图使用递归,但是你可能会说我对这一切都很新。

现在已经在正确的位置绘制了所有椭圆形,我在每个圆圈中都包含了一个Color对象。我的目标是让它随着圆圈的产生而变化,每组圆圈都是一定的绿色(如上例所示)。

目前,绿色阴影应用于不正确的圆圈。如下所示:

如果有人能够猜测为什么会发生这种情况,我将非常感激。谢谢。

4 个答案:

答案 0 :(得分:2)

createCircles()的每次调用都应在中心画一个大圆圈,并为3个较小的圆圈递归调用3次。 y坐标始终保持不变,您可以通过添加和减去原始圆的半径来重新计算x坐标。

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

答案 1 :(得分: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);
    }
}

答案 2 :(得分:1)

退出条款:如果圆半径变得太小而不值得画画。

答案 3 :(得分: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