【问题标题】:Using recursion in method paint() for fractal在方法paint() 中使用递归处理分形
【发布时间】:2014-08-27 21:44:05
【问题描述】:

我正在学习递归,我正在尝试使用 java 制作分形 H-tree。我有一个名为 simple 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 方法来绘制H 树的方法根据用户输入的内容订购 2,3,4。另外,我很挣扎,因为我无法调用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);

【问题讨论】:

  • paintComponent(Graphics g)调用paint

标签: java swing recursion jframe fractals


【解决方案1】:

您正在重载paint() 方法,因此swing 不会知道这是它必须使用的paint 方法。如果你想重载它,只需添加:

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

为了清晰起见,您可以创建一个新方法名称并将其添加到绘制方法中。

这样你就可以画出来了。

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

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 用于顶部。

不要忘记为递归设置一个限制,否则你会耗尽内存

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多