好了,所以我正在尝试创建一个递归算法,从而生成一系列圈子。Java:创建圈子
目前可以看出,我已经创建了圆类,并试图使用递归,但正如你可能会告诉我,对于所有这些我都是新手。
现在已经在正确的位置绘制了所有的椭圆,我在每个圆圈中都包含了一个Color对象。我的目标是使它能够随着圆圈的生成而改变颜色,每一组圆圈都有一定的绿色(如上例所示)。
然而,目前,绿色的阴影应用于不正确的圆圈。如下所示:
如果有人能够冒险猜测为什么会发生这种情况,我将非常感激。谢谢。
好了,所以我正在尝试创建一个递归算法,从而生成一系列圈子。Java:创建圈子
目前可以看出,我已经创建了圆类,并试图使用递归,但正如你可能会告诉我,对于所有这些我都是新手。
现在已经在正确的位置绘制了所有的椭圆,我在每个圆圈中都包含了一个Color对象。我的目标是使它能够随着圆圈的生成而改变颜色,每一组圆圈都有一定的绿色(如上例所示)。
然而,目前,绿色的阴影应用于不正确的圆圈。如下所示:
如果有人能够冒险猜测为什么会发生这种情况,我将非常感激。谢谢。
到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;
}
退出条款:如果圆半径变得太小,不值得画。
我现在已经更新了我的代码,从数组绘制圆,但也遇到了新的问题:见上面 – user3352349
新的问题,一般应张贴新问题,以避免过去的答案无效。 – keshlam
道歉,将发布为新答案。 – user3352349
我明白,目前我得到一个溢出错误,因为 我没有退出子句的递归。
递归算法确实需要终止条件。
在您的情况下,您不希望在圆圈足够小时继续递归。所以基本上你只需换三个递归调用你在这里:
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);
}
因为它没有任何意义,以保持绘制半径为零的圆。
下面是关于终止条件维基百科条目:
我现在更新了我的代码,从数组中绘制圆,但遇到了一个新问题:请参阅上面的 – user3352349
你需要一个基本情况。这就像递归的退出方法。在你的情况下,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
非常感谢。 – user3352349
我已经更新了我的代码,以便从数组中绘制圆,但遇到了一个新问题:请参见上文。 – user3352349
这是因为你总是计算圆的中心点,但'paint'方法需要在边界框的左上角。绘画时只需从'x'和'y'中减去'rad'。 – Warlord