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

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

我想产生与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);

}


}

我没有正确更改右下角正方形的颜色。在过去的几个小时中,我一直被困在此步骤中,希望有人能给我一个正确执行此操作的想法,因为我不知道。

先感谢您。
纳斯

最佳答案

您的代码不会反转右下象限,只是将其强制为白色。

我会说最好的解决方案是在递归方法中添加一个额外的参数(我们称其为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的值选择白色或黑色。

10-08 02:35