Hadamard模式问题

时间:2011-06-01 23:17:52

标签: java recursion

我正在编写一个使用递归显示Hadamard模式的程序。

1-by-1 Hadamard模式是单个黑色方块。通常,通过以2×2网格的形式对齐4个N-by-N图案的副本,然后反转右下N中所有正方形的颜色,获得2N×2N的Hadamard图案。 -by-N copy。

我想生成与this one

相同的图片

我的代码是:

import java.awt.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class Hadamard extends JPanel{


@SuppressWarnings("unused")
private void hadamard(Graphics g, int n, int x, int y, int width, int height){

    if(n == 0){

        g.fillRect(x/2, y/2, width, height);
        return;
    }
    else{

        hadamard(g, n-1, x, y, width/2, height/2);

        hadamard(g, n-1, x + width, y,  width/2, height/2);

        hadamard(g, n-1, x, y + height, width/2, height/2);

        g.setColor(Color.WHITE);
        hadamard(g, n-1, x + width, y + height, width/2, height/2);
        g.setColor(Color.BLACK);


    }
}

protected void paintComponent(Graphics g){
    super.paintComponent(g);

    hadamard(g, 2, getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2);

}

public static void main(String[] args) {

    Hadamard panel = new Hadamard();
    JFrame app = new JFrame();

    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    app.add(panel);
    app.setSize(516, 538);
    app.setVisible(true);

}

}

我没有正确更改右下角的方块颜色。我在最后几个小时一直坚持这一步,并希望有人能让我知道如何正确地做到这一点,因为我不知道。

提前谢谢你。 纳特

1 个答案:

答案 0 :(得分:3)

你的代码不是反转右下象限,它只是强制它是白色的。

我想说最好的解决方案是在递归方法中添加一个额外的参数(让我们称之为b),其值可以是truefalse。然后你可以递归为:

    hadamard(g, n-1, x, y, width/2, height/2, b);
    hadamard(g, n-1, x + width, y,  width/2, height/2, b);
    hadamard(g, n-1, x, y + height, width/2, height/2, b);
    hadamard(g, n-1, x + width, y + height, width/2, height/2, !b);

然后,当您进入fillRect来电时,请根据b的值选择白色或黑色。