在方法paint()中使用递归进行分形

时间:2014-08-27 21:44:05

标签: java swing recursion jframe fractals

我正在学习递归,并且我试图使用java制作分形H树。我的方法称为简单H,它使得H树的顺序为1.我的方法的主要是这一个:

public void simpleH(Graphics g, int x, int y, int size){
    g.drawLine(x, y, x, y+tamaño); //right
    g.drawLine(x, y+tamaño/2, x+tamaño, y+tamaño/2); //middle
    g.drawLine(x+tamaño,y,x+tamaño,y+tamaño); //left
}

我尝试做的是使用paint()方法使用递归方法重绘H树,但我因为无法找到调用simpleH方法的方法而陷入困境根据用户输入的内容,按2,3,4顺序绘制H树。另外,我正在努力,因为我不能调用paint()方法绘制线条。谁能给我一些提示?

public void paint(Graphics g,int n, int x, int y, int size){
    if(n==0){
        return;
    }
int x1 = x-size/2;
    int y1=y;
    int x2=x+size/2;
    int y2=y;
    g.drawLine(x1, y1, x2, y2);

    //left line
    y1 = y-size/2;
    x2=x1;
    y2=y+size/2;
    g.drawLine(x1, y1, x2, y2);

    //left recursion
    paint(g,n-1,x1,y1,size/2);
    paint(g,n-1,x2,y2,size/2);

    //right line
    x1=x+size/2;
    x2=x;
    g.drawLine(x1, y1, x2, y2);

    //right recursion
    paint(g,n-1,x1,y1,size/2);
    paint(g,n-1,x2,y2,size/2);

1 个答案:

答案 0 :(得分:2)

重载了paint()方法,因此swing不知道它是必须使用的paint方法。如果你想重载它,无论如何只需添加:

public void paint(Graphics g){
    paint(g,n,x,y,size);//Place here your initial values
}

您可以创建一个新的方法名称,并将其添加到paint方法中以便清晰。

这样你就可以画画了。

至于绘制树的递归,你可以像:

public void simpleH(Graphics g, int x, int y, int tamaño, int steps){
    if (steps == 0)
        return;
    g.drawLine(x, y, x, y+tamaño); //right
    g.drawLine(x, y+tamaño/2, x+tamaño, y+tamaño/2); //middle
    g.drawLine(x+tamaño,y,x+tamaño,y+tamaño); //left

    //TopLeft
    simpleH(g,x-tamaño/4,y+tamaño*3/4,tamaño/2,steps-1);
    //BottomLeft
    simpleH(g,x-tamaño/4,y-tamaño/4,tamaño/2,steps-1);
    //TopRight
    simpleH(g,x+tamaño*3/4,y+tamaño*3/4,tamaño/2,steps-1);
    //BottomRight
    simpleH(g,x+tamaño*3/4,y-tamaño/4,tamaño/2,steps-1);
}

由于您已在左下角设置了每个 H 的来源,要获得新原点的新原点,您必须将其移动 X 到未来大小的左半部分:

  

x - tamaño/ 2/2 - > (x - tamaño/ 4)表示左侧。

     

x +tamaño-tamaño/ 2/2 - > (x +tamaño* 3/4)为右侧。

同样适用于 Y 坐标,底部为y - tamaño/4,顶部为y + tamaño * 3/4

不要忘记设置递归限制,否则运行内存