我开始进行递归之旅,并尝试创建一个在其构造函数中进行递归的分形类。该类应该采用父椭圆,在其圆周上放置4个较小的子椭圆,然后保持递归到maxdepth,同时在每个前面的子项上放置4个子椭圆。
我当前的进度产生1个父椭圆和4个子(在" children"数组上调用draw方法之后)。我的问题是:我如何对孩子们进行报复?我真的很不确定从哪里开始。
public FractalEllipse( int depth, Point p, int w, int h )
{
setFrame( p.x, p.y, w, h );
if ( depth < numDepth )
{
children = new FractalEllipse[numChildren];
for ( int i = 0; i < numChildren; i++ )
{
int height = ( int )( h * sizeRatio );
int width = ( int ) ( w * sizeRatio );
int centerX = ( int ) ( this.getCenterX( ) - ( width / 2 ) );
int centerY = ( int ) ( this.getCenterY( ) - ( height / 2 ) );
double radX = Math.toRadians( ( 360 / numChildren ) * i );
double radY = Math.toRadians( ( 360 / numChildren ) * i );
int x = ( int ) ( centerX + ( ( w / 2 ) ) * Math.cos( radX ) );
int y = ( int ) ( centerY + ( ( h / 2 ) ) * Math.sin( radY ) );
FractalEllipse child = new FractalEllipse( depth + 1,
new Point( x, y ), width, height );
children[i] = child;
}
} else
{
}
}
对不起,这是完整的绘制方法:
public void draw( Graphics2D context )
{
Color saveColor = context.getColor();
Color myColor = Color.MAGENTA;
context.setColor( myColor );
// draw myself
if ( fill )
context.fill( this );
else
context.draw( this );
context.setColor( Color.CYAN );
for ( int i = 0; i < children.length; i++ )
{
context.fill( children[i] );
}
}
答案 0 :(得分:0)
由于draw
方法会导致分形椭圆绘制或填充自身,因此父级不需要在子级上调用context.draw
或context.fill
。相反,如果您以递归方式调用子级draw
方法,他们会自行调用context.draw
或context.fill
。然后他们会为他们的孩子做同样的事情。
因此,draw
方法中的循环应该类似于:
for ( int i = 0; i < children.length; i++ )
{
children[i].draw();
}
或使用Java的增强型for
循环:
for (FractalEllipse child : children) {
child.draw();
}
不清楚的一件事是fill
变量。您在draw
方法中使用了此功能,但未显示其定义方式或设置方式。假设您希望父级和所有后代绘制轮廓或以相同方式填充:如果fill
是FractalEllipse
中的字段,则您需要制作确保子项中的fill
字段与父项中的字段相同。如果该字段来自其他地方,您可能需要将其作为参数添加到draw
方法中,并确保draw
在其子项上递归调用自身时包含该参数。由于缺少信息,我不知道正确的答案是什么,但这两个习语中的一个很可能是你需要的。
答案 1 :(得分:-1)
如果有孩子,您需要在draw
之前或之后专门致电孩子的context.fill(..)
圈。
在您通过子项进行分支后,返回主draw
,您必须检查子数组是否存在。如果您在达到一定深度时没有初始化它。