我正在学习递归,并试图使用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树。AlSO,我很挣扎,因为我无法调用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);
您正在重载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
表示顶部。
不要忘记为递归设置一个限制,否则您将耗尽内存。