构造函数中的分形椭圆递归

时间:2015-03-08 05:10:41

标签: java recursion

我开始进行递归之旅,并尝试创建一个在其构造函数中进行递归的分形类。该类应该采用父椭圆,在其圆周上放置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] ); 
    }
}

2 个答案:

答案 0 :(得分:0)

由于draw方法会导致分形椭圆绘制或填充自身,因此父级不需要在子级上调用context.drawcontext.fill。相反,如果您以递归方式调用子级draw方法,他们会自行调用context.drawcontext.fill。然后他们会为他们的孩子做同样的事情。

因此,draw方法中的循环应该类似于:

for ( int i = 0; i < children.length; i++ )
{
        children[i].draw(); 
}

或使用Java的增强型for循环:

for (FractalEllipse child : children) {
    child.draw();
}

不清楚的一件事是fill变量。您在draw方法中使用了此功能,但未显示其定义方式或设置方式。假设您希望父级和所有后代绘制轮廓或以相同方式填充:如果fillFractalEllipse中的字段,则您需要制作确保子项中的fill字段与父项中的字段相同。如果该字段来自其他地方,您可能需要将其作为参数添加到draw方法中,并确保draw在其子项上递归调用自身时包含该参数。由于缺少信息,我不知道正确的答案是什么,但这两个习语中的一个很可能是你需要的。

答案 1 :(得分:-1)

如果有孩子,您需要在draw之前或之后专门致电孩子的context.fill(..)圈。

在您通过子项进行分支后,返回主draw,您必须检查子数组是否存在。如果您在达到一定深度时没有初始化它。